Is it just み?

Tag: Scripts

Simple backups with windows 2

by on Dec.03, 2009, under Programmierung, Technik

Ich werde mal versuchen einige meiner Einträge auf Englisch zu verfassen – um in der Übung zu bleiben.

Update: I made additional changes to the script which are a real improvement for my daily use. The current version is “0.3d [2010-01-08]”

Last week I wrote about a simple way to zip all subfolders of a specific folder which I use for my simple archiving strategy at work. Today I would like to show you a simple script I wrote which backups files listed in a configuration file using rar and puts them into a single archive named after the current date and time. I wrote it to be used as a scheduled task that runs every few hours on some windows machine that is always on.1

I will not show the complete code here, since it’s about 150 lines. You can download the whole script package as .zip-archive.

The archive contains four files:

INFO-README.TXT Some Information about the script
KPSBackupList.ini The file containing the list of files to backup. Can be changed in the KPSFileBackup.bat
startHidden.vbs Just a simple Script file to start the batch file without showing a console-window
FileBackupConfig.bat The batch config file. It contains the config-section where you can change the settings as explained below
KPSFileBackup.bat The actual batch file, you may run.

The following settings are available:

backupFilelist The file containing the list of all files that should be backed up
destinationDir Destination directory where all backup files are stored
prefix The prefix is put before the date in the name of the backup file
retryTime Number of seconds to wait before retrying if one of the files was open and could therefore not be put into the archive. This is an approximate value since I hadd to use a workaround to put the script to sleep.
maxRetries Number of times the script will retry if one of the files was open
backupsToKeep The number of old backups to keep
rarPath Path to the RAR2 executable file

1 The reason for using a batch script and a Windows machine is simple: They do not use linux here. Though I might get my own litte Debian VM in the future, for now Windows has to suffice.

2 The reason for using RAR is simple: It comes preinstalled on all machines here.

Comments Off on Simple backups with windows 2 :, , , , , more...

Simple backups with windows 1

by on Nov.26, 2009, under Computer, Programmierung

Ich werde mal versuchen einige meiner Einträge auf Englisch zu verfassen – um in der Übung zu bleiben.

At my current workplace, working with Linux (or anything other than windows) seems to be something no one would even bother to think about.  So I had to dig into the world of Windows Batch Scripting in order to create those little tools that make my life  just a bit easier when using linux.

The first thing I had to do was creating a script that simply backups folders. I have a folder which contains other folders that should be archived – I usually zip (or 7zip) them and move them to the backup space later, which is a fairly easy task using a bash-script and nautilus actions.

Under windows it’s not that much harder to accomplish. (In the following example I used WinRAR to compress the files because that’s what we use at work.)

The first thing I needed was of course the batch-file that does the actual work. Here it is:

@echo off

rem ===================== Begin Configuration =====================
rem !!! Do not use quotes for the values of the following variables !!!

rem Path to the WinRAR executable file
set winrarPath=%PROGRAMFILES%\WinRAR\WinRAR.exe

rem ====================== End Configuration ======================

rem Please only edit after this line if you know exactly what you are doing.

set curVer=0.1 [2009-11-26]

rem ======================== Begin Script ========================

rem Tell the user which version of the tool they use
echo.
echo                     Mi ArchiveSubfolders version %curVer%
echo.
echo.

if not exist "%winrarPath%" (
    echo Cannot find WinRAR exe file: %winrarPath%
    goto eof
)

set dir=%*
if not exist "%dir%" (
    echo The directory "%dir%" cannot be found
    goto eof
)

set dateString=%DATE:~-4,4%-%DATE:~-7,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%

cd "%dir%"
for /D %%a in (*) do (
    rem Creating the archive
    echo Archiving "%%~na"...
    "%winrarPath%" M -afzip -ibck -inul -m5 "%dateString%-%%~na.zip" "%%a"
)

echo.
echo Archiving done

:eof

Now that is a nice, simple script, but what should I do with it? I wanted it to be useable directly in the explorer context-menu, so I made a small registry-entry. This is the exported .reg-file:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Folder\shell\archiveSubfolders]
@="Mi: Archive Subfolders (ZIP)"

[HKEY_CLASSES_ROOT\Folder\shell\archiveSubfolders\Command]
@="cmd /c \"\"%%ProgramFiles%%\\MiTools\\archiveSubfolders\\archiveSubfolders.bat\"\" %1"

Now I wanted a simple installation-script, for really lazy people like me:

@echo off

set installDir=%PROGRAMFILES%\MiTools\archiveSubfolders

if not exist "%installDir%" (
    mkdir "%installDir%"
)

copy archiveSubfolders.bat "%installDir%"
copy "ArchiveSubfolders Context Menu Entry.reg" "%installDir%"

regedit /S "ArchiveSubfolders Context Menu Entry.reg"

echo Installation complete.

:eof
Comments Off on Simple backups with windows 1 :, , , , , more...

Komprimierung mit 7z

by on Nov.09, 2009, under Computer, Linux

Dies ist einer der Einträge in meinem Blog, der wohl hauptsächlich deshalb da ist, weil ich es wohl selbst wieder vergessen und daher nachschlagen müssen werde.

Ich komprimiere meine Dateien fast immer mit 7z, nur wenn ich Quellcode weitergebe nutze ich das traditionelle tar.bz2. Vor allem habe ich mir angewöhnt alles was ich an CD und DVD Images besitze vor dem verschieben auf die Backupplatte noch einmal zu komprimieren – der Zugriff muss ja nicht schnell gehen, sondern im Optimalfall nicht einmal nötig sein.

Da ich in diesem Fall keine Rücksicht auf irgend wen nehmen muss, kann ich die Parameter so wählen, dass ein für meinen Rechner optimale Komprimierung herauskommt – auch wenn es sich deshalb auf Rechnern mit wenig Arbeitsspeicher nicht mehr entpacken lassen würde.

Mein Kommando zur Komprimierung lautet (Achtung, nicht auf Systemen nutzen die weniger als 4GB Hauptspeicher haben):
nice -n 10 7z a -mx=9 -mmt=16 -t7z -mfb=258 -md=384m -ms=8g "[ZIEL].7z" "[DATEN]"

Kurze Erklärung:

Kommandoteil Bedeutung
nice -n 10 Starte das folgende Kommando mit geringer Priorität. Das bedeutet, dass man nebenher noch relativ gut arbeiten kann, bzw. andere Prozesse weniger ausgebremst werden.
7z a Füge Daten zu einem Archiv hinzu (a steht für “add”).
-mx=9 Benutze die maximale Kompressionsstufe.
-mmt=16 Bestimmt die Anzahl der benutzten Threads. Alternativ kann man auch -mmt=on angeben, dann bestimmt 7z selbst die Anzahl der Threads. Bei meinen Tests war jedoch die Anzahl 16 (ich habe einen Dualcore Prozessor) seltsamerweise fast 10% schneller als die Angabe on.
-t7z Sagt 7z, dass es das 7z-Format benutzen soll. Eigentlich überflüssig wenn wir den Archivnamen auf .7z enden lassen. Da 7z aber auch so ziemlich alle anderen halbwegs frei verfügbaren Komprimierungsverfahren unterstützt, gehe ich hier noch einmal sicher, dass auch wirklich das effiziente 7z benutzt wird.
-mfb=258 Die Wortgröße wird hier festgelegt. Faustregel: Je höher die Wortgröße, desto besser die Kompression. Dies ist, soweit ich weiß, der derzeitig maximal zulässige Wert.
-md=384m Die Wörterbuchgröße. Auch heir gilt die gleiche Faustregel wie bei der Wortgröße, allerdings kann man hier noch deutlich größer werden. In diesem Fall ist die Wörterbuchgröße 384 MB – das bedeutet, dass man beim Entpacken schon mindestens 512 MB RAM haben muss und beim Komprimieren ungefähr das Zehnfache der Wörterbuchgröße. Ich habe 6 GB RAM und benutze daher diese Einstellung wenn ich über Nacht die Backups komprimiere. Sobald ich parallel noch Firefox, Thunderbird und Eclipse (um mal Speicherfresser zu nennen) benutzen will, setze ich den Wert auf unter 300m.
-ms=8g Die maximale Größe der soliden Blöcke – auch hier gilt die gleiche Faustregel, auch wenn der Einfluss mit steigender Größe immer geringer wird. Alternativ sollte ein -ms=on auch dafür Sorgen, dass ein ganzes DVD-Image als ein großer Block (“solid”) komprimiert wird.
“[ZIEL].7z” Das Zielarchiv. Es muss nicht auf .7z enden, aber das hat sich aus praktischen Gründen eingebürgert. Unter Windows sollte es natürlich auf jeden Fall so heißen, da Windows das Archiv nicht automatisch als solches erkennen kann.
“[DATEN]” Das ist dann die Datei, die Dateien oder das Verzeichnis das komprimiert werden soll. Die Anführungsstriche kommen allerdings nicht um mehrere Dateien oder Verzeichnisse, sondern jeweils um eins (damit es keine Probleme mit Leerzeichen gibt).

Um dann viele Images über Nacht zu komprimieren benutze ich folgendes Mini-Script:

#!/bin/bash
for i in *.iso; do
nice -n 10 7z a -mx=9 -mmt=16 -t7z -mfb=258 -md=384m -ms=8g "$i.7z" "$i"
if [[ $? -eq 0 && -f "$i.7z" ]]; then
rm "$i"
fi
done

Comments Off on Komprimierung mit 7z :, , , , , more...

GRAND Flash Album Gallery Extras

by on Sep.13, 2009, under Photos, PHP, Programmierung

Heute mal auf Englisch, weil das Originalplugin auch in English zur Verfügung steht.

Update 2009-09-13: New version. Can now work around WP-Cache

GRAND Flash Album Gallery is a simple to use and professional looking way to present pictures on your website, it even has a nice looking full-screen-option.

There were two features that I really missed:

  • Ability to link to a specific gallery and picture
  • Removing the [Gallery not found]-tags from excerpts

For those two I wrote my own little plugin called “flash-album-gallery-extras“.
It is more of a quickhack than a real plugin because I had to change the central xml.php file that comes with the Flash Album Gallery Skins (which is used to output an ordered xml-list of the pictures grouped by galleries) and because I use two Session-variables to “communicate” with the xml.php. Changing the flash that requests the xml to using additional GET-Parameters would be a cleaner approach, but that would require the authors help.

Maybe he likes my approach and integrates my code (or my idea) into his original solution.

Comments Off on GRAND Flash Album Gallery Extras :, , , , , more...

Multi-Desktop-Background-Creator…

by on Aug.27, 2009, under Linux, Programmierung, Sonstiges

Ich arbeite entweder mit zwei Rechnern nebeneinander die über Synergy verbunden sind oder an einem Rechner mit zwei Monitoren. Bei zwei Monitoren an einem Rechner sieht das Hintergrundbild immer schlecht aus. Deshalb habe ich ein Bash-Script geschrieben dem man beliebig viele Monitorauflösungen von links nach rechts übergibt und einen Ordner in dem die Bilder gesucht werden, dass dann zufällig aus den passenden Bildern ein großes passendes Bild zusammenstellt. Zusätzlich kann man konfigurieren ob nur passende Auflösungen verwendet werden sollen oder die Bilder nur verkleinert oder auch vergrößert werden sollen um auf den Monitor zu passen.

Hier die Beschreibung der Kommandozeilenoptionen:

        -----===== createMultiDesktopWallpaper =====-----

 "createMultiDesktopWallpaper --of=OUTFILE sf=SEARCHFOLDER  RES1 RES2 [RES3 [...]]"

Concatenates the images in the given order and writes the result to the file
specified by --of

Obligatory parameters:
 --of=         The out-file, meaning the file to write the concatenated image
               to. This file will be overwritten without notice.
 --sf=         The folder to search in for images.
 RES[1-x]      The resolution of the Desktops for which the background should
               be created from left to right. The RES-parameters must have the
               form of WIDTHxHEIGHT (e.g. '1280x1024'). There have to be at least
               two RES-parameters

Optional parameters:
 --mode=       The mode for choosing the images. Possible values:
                 exact  - For every resolution an image with exactly the given
                          size is used. No resizing of images.
                 exact2 - Like exact, but needs a preordered search-folder. Use the
                          orderImagesByResolution script to order it. (Faster)
                 down   - Uses images that are at least as big as the given size
                          and resizes bigger images. This might lead to images being
                          cropped because they have a differnt ratio.
                 any    - Resizes any picture to the given resolution. This might
                          look bad if you have for example a 24" monitor and some
                          640x480 images in the search-folder
               Default: exact
 --background= The color of the background if the pictures do not have the same
               size. (default: black)
 --same        Use the same image for all resolutions. Only works with mode 'down'
               or 'any'
 --align=      Vertical alignment of images that are smaller that the biggest
               image given
 --verbose     Output additional information

Example:
   "createMultiDesktopWallpaper --of=bg.png --sf=Pictures 1920x1200 1280x1024"

Um das Script zu benutzen benötigt man ImageMagick und die Scripte createMultiDesktopWallpaper und concatenateImage. Wenn man die Geschwindigkeit optimieren will, kann man das orderImagesByResolution Script benutzen um die Bilder vorher zu ordnen und dann den Modus “exact2” nutzen.

Das Ergebnis sieht dann bei 1920×1200 und 1280×1024 z.B. so aus: (Aus zwei Photos die ich gemacht habe)

Generated Wallpaper

Generiertes Wallpaper

Eine andere Sprache als bash wäre bezüglich Caching sicher sinnvoll gewesen, aber nicht bei meiner kleinen Auswahl an Wallpapern lohnt sich ein Caching Mechanismus noch nicht. Natürlich lässt sich ein Dateibasiertes Caching auch mit bash realisieren, aber besonders elegant geht das nunmal auch nicht.

Comments Off on Multi-Desktop-Background-Creator… :, , , , more...

Universelle Bashscript Vorlage

by on Aug.26, 2009, under Linux, Programmierung

Ich schreibe immer mal wieder kleine Bashscripte für Alltagsaufgaben wie Backups und kleinere Aufgaben für die sich einfach keine großen Programme lohnen. Was mir immer gefehlt hat ist eine grundsätzliche Vorgehensweise die ich auf etwas größere Scripte anwenden kann um Parameter zu verarbeiten und eine Hilfe auszugeben.

Heute habe ich mir mal die Mühe gemacht eines meiner größeren Scripte so umzuschreiben, dass es als allgemeine Vorlage genutzt werden kann. Vielleicht hilft es ja jemandem.

Das Bash Script Template kann man sich hier herunterladen.

Das “Besondere” an dieser Scriptvorlage ist dass für die Hilfe alle Texte am Anfang des Script als Variablen definiert werden und die Parameter mit der vorgegebenen Methode in beliebiger Reihenfolge an das Programm übergeben werden können.

Über Rückmeldungen und Verbesserungsvorschläge freue ich mich immer.

Comments Off on Universelle Bashscript Vorlage :, , , more...