Mittwoch, 29. Oktober 2014

Foto Organisation mit ExifTool

(Aktualisierung 01.02.2015)

ExifTool ist ein praktisches Hilfsmittel um Ordnung in die Fotosammlung zu bringen. An dieser Stelle möchte ich ein par für hilfreiche Beispiele sammeln.

  • Eine der häufigsten Anwendungen ist das Importieren von Bildern in die Eigene Fotosammlung. Im folgendem Beispiel werden alle JPG Bilder aus dem aktuellen Ordner in das Zielverzeichnis     Bilder verschoben. In diesem wird ausgehend von dem Aufnahmezeitpunkt des Bildes folgende Ordnerstruktur "Aufnahmejahr/Aufnahmedatum" angelegt. Der Parameter -m weist ExifTool an kleinere Warnungen zu ignorieren. Mit -r werden auch alle Unterordner durchsucht. Wenn im Zielordner bereits eine Datei gleichen Namens existiert, wird eine entsprechende Meldung ausgegeben und das Bild übersprungen.    
    exiftool.exe -m -r "-Directory<DateTimeOriginal" -d "D:/Bilder/%Y/%Y-%m-%d" *.jpg 

    • Eine weitere Anwendung ist das Umbenennen der Bilder in ein einheitliches Format.  In diesem Beispiel werden alle JPG Bilder in folgendes Zielformat gebracht "IMG_2014-08-09-10_25_25.jpg". Meine Bilder versehe ich mit dem Prefix "IMG", gefolgt vom Aufnahmejahr, Monat, Tag, der Uhrzeit und einer laufenden Nummer. Diese verhindert Probleme bei Bildern mit identischen Zeitstempeln.
    exiftool.exe -m "-filename<CreateDate" -d IMG_%Y-%m-%d-%H_%M_%S%%-c.%%le *.jpg 

    • Wenn man Bilder von verschiedenen Quellen in die eigene Fotosammlung importiert, kommt es hin und wieder zu dem Fall, dass nich alle Quellen die gleiche Zeitbasis haben. Auch hier kann das Problem relativ einfach gelöst werden. Mit folgendem Kommando kann der Aufnahmezeitpunkt des Bildes korrigiert werden.
      Y = Änderung des Jahres            h = Änderung der Stunde
      M = Änderung des Monats         m = Änderung der Minute
      D = Änderung des Tages            s = Änderung der Sekunde

      Mit "+=" wird die Änderung zum Original addiert und mit "-=" subtrahiert.
    exiftool.exe "-DateTimeOriginal+=Y:M:D h:m:s" filename.jpg 
      Hier einige Beispiele:
      • Änderung des Jahres um +5, ohne Änderung der Uhrzeit aller Bilder
      • exiftool.exe "-DateTimeOriginal+=5:0:0 0:0:0" *.jpg 
      • Rückstellen der Uhrzeit um -12 Stunden.
      • exiftool.exe "-DateTimeOriginal-=0:0:0 12:0:0" *.jpg 

    Dienstag, 5. August 2014

    FLV zu MP4 mit ffmpeg


    Mit dem Tool ffmpeg kann via CLI wie folgt ein Flash Video in eine MP4 Datei gewandelt werden. Dabei werden sowohl der Videocodec und der Audiocodec nicht verändert.


    ./ffmpeg -i input.flv -vcodec copy -acodec copy output.mp4

    Sonntag, 29. Juni 2014

    Datenvisualisierung mit Dygraph

    Dies ist ein Update zur Temperaturmessung und Visualisierung mit dem Raspberry Pi. In früheren Posts habe ich beschrieben wie die CPU und GPU Temperatur gemessen und mittels Gnuplot dargestellt werden kann. Dies hat aber den Nachteil, dass die Darstellung entweder nur direkt auf dem Pi erfolgen kann, oder nach download der Messdaten auf einem weiteren PC.
    Jetzt werde ich eine Möglichkeit vorstellen, wie eine "Live" Darstellung der Pi Temperaturen möglich ist. Ziel ist es, die Temperaturen einfach über einen Browser auf seinen PC, Tablet oder Smartphone zu überwachen. Zur Visualisierung verwende ich hierzu die JavaScript Lib. Dygraph. Mit dieser lassen sich sehr einfach die erzeugten CSV Dateien im Browser darstellen.

    Folgende Abbildung zeigt ein Beispiel:

    Um eine einface Graphik zu Erzeugen reicht folgendes Grundgerüst:
    <html>
    <head>
    <script type="text/javascript"  src="dygraph-combined.js"></script>
    </head>
    <body>
     <div id="graphdiv1"></div> 
     <script type="text/javascript">
        chart = new Dygraph(document.getElementById("graphdiv1"),
        // path to CSV file
        "rpi_temperature.csv",
        {
        }
        ); 
    </script>
    </body>
    </html>
    
    
    Damit diese Webseite auch aufrufbar ist, verwende ich einen einfachen HTTP-Server welcher bei der Python Installation gleich mitgeliefert wird. Dieser wird auf dem PI wie folgt gestartet:
    python -m SimpleHTTPServer 8081

    Wenn man die Seite beim Start des Pi's gleich erreichbar haben möchte, sollte man den HTTPServer beim Booten gleich mit starten. Wie man dies einrichtet, beschreibe ich in folgendem Eintrag.

    Jetzt lässt sich die Seite durch Aufruf folgender Adresse im Browser darstellen:
    http://[Raspberry Pi IP]:8081/

    Damit wird aber nur eine statische Graphik erzeugt, damit eine "LIVE" Darstellung ermöglicht wird, soll diese Graphik alle 10 Sekunden neu geladen werden. Damit wird auch die zu Grunde liegende CSV-Datei neu eingelesen und so die Darstellung aktualisiert. Hier die zugehörige HTML, ergänzt um ein par zusätzliche Dygraph Optionen:
    <html>
    <head>
    <script type="text/javascript"  src="dygraph-combined.js"></script>
    </head>
    <body>
     <div id="legend" ></div>
     <div id="graphdiv1"  style="width:80%; height:80%;"></div>
     
     <script type="text/javascript">
    
        chart = new Dygraph(document.getElementById("graphdiv1"),
        // path to CSV file
        "rpi_temperature.csv",
         {
             legend: 'always',         
             labels: ['date','gpu_temperature','cpu_temperature'],
             xlabel: 'Time',
             ylabel: ' Temperatur in °C',
           
             labelsDiv: document.getElementById('legend'),        
             
         }
        );     
        setInterval(
                    function()
                    {
                        chart.updateOptions({'file': "rpi_temperature.csv"});
                    },10000
                   )
    </script>
    </body>
    </html>
    
    


    HTML Tags entfernen


    Mit dem Unix Stream Editor in folgender Konfiguration kann man sehr einfach alle HTML Tags aus einer Webseite entfernen.

    sed "s/<[^>]*>//g"

    Montag, 12. Mai 2014

    SVN backup

    In meinem letzten Post habe ich beschrieben, wie man den RPI als SVN Server konfiguriert. Da ich schon einige male Probleme mit der verwendeten SD-Card hatte, möchte ich hier beschreiben, wie man von seinem Repository ein Backup anlegen und dieses wieder einspielen kann.

    1. Backup anlegen
    svnadmin dump /var/local/svn/repo > /home/pi/svn_bu.dump
    Das Backup, kann dann z.B. per FTP auf einen Host bzw. RPI übertragen werden.

    2. Backup einspielen

    2.1. Repository anlegen
    sudo svnadmin create --fs-type fsfs /var/local/svn/repo
    2.2 Repository laden
    sudo svnadmin load /var/local/svn/repo/ < /home/pi/svnexport.dump
    3 Ordner Rechte für den webserver setzten
    sudo chown -R www-data:www-data /var/local/svn
    4. Zum Abschluss den Webserver neustarten.
    sudo /etc/init.d/apache2 restart

    Raspberry Pi als SVN Server einrichten

    Diesmal geht es darum, wie man seinem Raspberry Pi als SVN Server konfigurieren kann.

    1. Installation von Subversion
    sudo apt-get install subversion
    2. Anlegen eines Ordners indem das Repository gespeichert werden soll
    sudo mkdir -p /var/local/svn/
    3. Repository anlegen
    svnadmin create --fs-type fsfs /var/local/svn/repo
    4. Remote Zugang über http einrichten

    4.1 Installation des Webservers
    sudo apt-get install apache2 libapache2-svn
    4.2 Ordner Rechte für den webserver setzten
    sudo chown -R www-data:www-data /var/local/svn
    4.3 Konfiguration mittels dav_svn.conf
    sudo nano /etc/apache2/mods-enabled/dav_svn.conf

    Darin ist bereits eine kommentierte Beispielkonfiguration entahlten. Diese wie folgt anpassen, damit alle Repositories im angelegten Ordner verfügbar sind.
    <Location /svn>
      DAV svn
      SVNParentPath /var/local/svn
    </Location>
    

    4.4 Falls auf dem System mehrer Webserver laufen (z.B. Raspbmc), muss noch der Port auf dem der Webserver lauscht, angepasst werden. Dazu den Port hinter Listen entsprechend anpassen (z.B. 8080)
    sudo nano /etc/apache2/mods-enabled/ports.conf
    4.5 Zum Abschluss den Webserver neustarten, damit dieser die Konfiguration übernimmt.
    sudo /etc/init.d/apache2 restart
    5. Funktionstest mit Browser
     http://<rpi ip>:8080/svn/repo
    Es wird eine Webseite mit repo - Revision 0: / dargestellt.

    6. Funktionstest per Kommandozeile
    svn checkout http://<rpi ip>:8080/svn/repo repo/
    Ein noch leeres Repository wird in den Ordner repo ausgecheckt.

    7. Weitere Repositories können durch wiederholen von 3. angelegt werden.

    Sonntag, 4. Mai 2014

    Raspberry Pi Autostart einrichten

    Heute möchte ich kurz Beschreiben, wie beim PI ein Autostart umgesetzt werden kann.
    Dazu habe ich unter /var/scripte ein Script hinterlegt, was bei jedem Start ausgeführt wird.

    1. Ordner Scripte erzeugen, das -p erzeugt die übergeordneten Ordner falls diese nicht existieren
    sudo mkdir -p /var/scripte 

    2. Die Script Datei anlegen:
    sudo touch autostart.sh

    3. Das Script ausführbar machen:
    sudo chmod +x autostart.sh

    4. Jetzt kann das Script mit "Leben" befüllt werden. Das bedeutet alle Kommandos oder Programmaufrufe können darin eingetragen werden, diese werden beim Start entsprechend der Reihenfolge ausgeführt. Hier ein Beispiel, wie eine index.html aus dem Home Ordner des Users Pi mittels eines Python HTTP servers am Port 8081 verfügbar gemacht wird.
    Dies verwende ich in einem weiterem Post zur Browser basierenden Visualisierung der PI Temperatur.

    Datei zum bearbeiten öffnen:
    sudo nano autostart.sh

    Folgenden Inhalt eintragen:

    #!/bin/bash
    cd /home/pi
    /usr/bin/python -m SimpleHTTPServer 8081

    5. Damit das Script beim Start auch ausgeführt wird, muss es noch  in das Script /etc/rc.local eingetragen werden. Damit können alle nicht graphischen Programme beim Systemstart ausgeführt werden. Dabei muss beachtet werden, dass dieses Script immer mit exit 0 abgeschlossen werden muss.

    In meinem Fall sieht das Script wie folgt aus:
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    /var/scripte/autostart.sh
    exit 0
    Bearbeiten kann man es wieder mit:

    sudo nano /etc/rc.local

    Sonntag, 23. März 2014

    Festplatte spiegeln mit dd

    Nachdem in meinem Notebook die Festplatte erste Anzeichen eines mech. Defektes gezeigt hat, war dringend ein Austausch notwendig.

    Da das lästige Neuinstallieren des OS vermieden werden sollte, habe ich mich für eine HDD Spiegelung entschieden. Die Wahl des Hilfsmittels viel auf das Live Linux Knoppix.

    Da zu diesem Zweck nicht viele Anwendungen notwendig sind und ich ungeduldig war, wurde das CD-Image heruntergeladen. Anschließend habe ich dieses auf CD gebrannt und das Notebook neugestartet. Um Knoppix zu booten musste im Boot Menu (bei mir F12 während des booten drücken) der BOOT - Modus von UEFI auf Lagacy Mode geändert werden. Daraufhin startet Knoppix ohne Probleme.

    [OPTIONAL]
    Für spätere Verwendung kann aus Knoppix heraus dieses auch auf einen USB-Stick installiert werden. Für die CD Version reicht ein alter 4GB Stick völlig aus.

    Um die interne HDD auf eine externe HDD zu spiegeln, habe ich das Linux Boardmittel "dd" (dump device) angewendet. Dabei müssen aber zwei Sachen beachtet werden:

    1. Die neue HDD (of= ...) muss mindestens so groß sein wie die Alte.
    2. Es muss die richtige HDD als Input (if= ...) verwendet werden.

    Die Bezeichnung der HDDs kann man zum Beispiel mit gparted auslesen. Meine alte war "/dev/sda" und meine neue "/dev/sdd"

    Der dd - Aufruf zum spiegeln lautet dann: sudo dd if=/dev/sda of=dev/sdd bs=1M

    Ein kleines Manko hat dd und zwar gibt es keine direkte Fortschrittssanzeige. Mit etwas Internet Recherche kann diese aber "nachgerüstet" werden. Notwendig dafür ist die Prozess ID des Clone Prozesses. Diese wird in die Varable $pid gespeichert und der Clone Prozess mit &
    in den Hintergrund versetzt.

    Der obige dd - Befehl kann anschließend zu sudo dd if=/dev/sda of=dev/sdd bs=1M & pid=$!
    erweitert werden.

    Der Fortschritt  kann jetzt mit: sudo kill -USR1 $pid abgerufen werden.

    Praktischer ist eine automatische Anzeige mit festem Intervall: sudo watch --interval 10 kill -USR1 $pid

    Anschließend ist Geduld gefragt. Das Speigeln meiner 750GB HDD mit durchschnittlich 45 MB/s dauerte ca. 4,5 Stunden.

    Donnerstag, 27. Februar 2014

    Hexconverter

    Mit diesem converter können 32 bit Zahlen zwischen den Formaten hexadezimal, binär und dezimal umgerechnet werden.

    Außerdem besteht die Möglichkeit einen Teil der binär Darstellung auszuwählen und zu bearbeiten.

    Hexadecmal:
    Binary:
    decmal:
    selected as Hex:
    selected as Bin:
    selected as Dec:

    Montag, 3. Februar 2014

    Raspberry Pi als Samba Server

    Eine einfache Möglichkeit Dateien zwischen dem Raspberry Pi und seinem Windows PC zu teilen,
    ist die Verwendung des Raspberry Pi's als Samba Server.

    So kann von Windows aus, über eine einfache Netzwerkfreigabe auf einen Raspberry Pi Ordner zugegriffen werden.
    Außerdem lässt sich dieser Ordner auch als Netzlaufwerk einbinden.

    Um dies einzurichten, müssen folgende Schritte abgearbeitet werden:

     1. Paketlisten aktualisieren
        sudo apt-get update
     2. installierte Pakete auf den neusten Stand bringen
        sudo apt-get upgrade
     3. Samba Server installieren
        sudo apt-get install samba samba-common-bin
     4. Samba Server konfigurieren
        sudo nano /etc/samba/smb.conf  
        4.1 nur authentifizierter Zugriff per username und password
            Zeile #security = user zu  security = user ändern
        4.2 Am Dateiende die Konfiguration für den freizugebenden Ordner eintragen
            [share]
            path = /home/pi/share
            writeable = yes
            guest ok = no   
     5. Samba Benutzer für aktuellen Benutzer (z.B. pi)
        sudo smbpasswd -a pi
     6. [optional] Dem freizugebenden Ordner müssen ggf. die Nutzerrechte geändert werden.
        sudo chown -R pi:pi /home/pi/share
     7. Samba neustarten und geänderte Konfiguration übernehmen
        sudo /etc/init.d/samba restart
       
     Jetzt ist der Samba Server fertig konfiguriert und der freigegebene Ordner sollte (nach kurzer Zeit) unter Windows in der Netzwerkübersicht erscheinen.

    Donnerstag, 23. Januar 2014

    Datenvisualisierung mit gnuplot

    Nachdem ich in meinen vorherigen Einträgen beschrieben habe wie die CPU und GPU Temperatur des Raspberry Pi's per Cronjob kontinuierlich abgerufen werden kann, werde ich jetzt eine einfache Möglichkeit beschreiben die Daten zu visualisieren. Dafür verwende ich das Tool gnuplot.

    Falls gnuplot noch nicht installiert ist, kann dies mit folgenden Befehl nachgeholt werden.
    sudo apt-get install gnuplot gnuplot-x11

    Gnuplot wird über die Kommandozeile gesteuert und kann auf dieser mit dem Programmnamen gestartet werden. Anschließend kann gnuplot über entsprechende Befehle gesteuert werden.
    gnuplot>
    Um die CSV-Datei darzustellen, verwende ich folgende gnuplot Befehle:

    1. Festlegen, dass die einzelnen Datenreihen per Komma getrennt sind.
    gnuplot>set datafile separator ","
    2. Gnuplot soll beim einlesen der CSV die Zeitachse entsprechend der Datenfestlegung in der CSV-Datei interpretieren.
    gnuplot>set timefmt "%Y-%m-%d %H:%M:%S"
    3. Auf der x-Achse soll die Zeit aufgetragen werden.
    gnuplot>set xdata time 
    4. Die x-Achse wird so konfiguriert, dass nur die Stunden und Minuten aufgetragen werden.
    gnuplot>set format x "%H:%M"
    5. Beide Achsen sollen automatisch skaliert werden.
    gnuplot>set autoscale 
    6. Die Achsen werden entsprechend Ihres Inhaltes beschriftet
    gnuplot>set ylabel "temperature"
    gnuplot>set xlabel "time"

    7.1 Die graphische Ausgabe erfolgt mit dem plot Befehl. Diesen übergibt man die darzustellende Datei und kann die zu verwende Spaltendarstellung, die Beschriftung der Datenreihe und die Darstellungsart festlegen.
    Der folgende Befehl druckt die GPU Temperatur (Spalte 2) zur Zeit (Spalte 1) mit entsprechender Beschriftung und die einzelnen Messpunkte werden mit Linien verbunden.
    gnuplot>plot "rpi_temperature.csv" using 1:2 title 'gpu temperature' with lines

    7.2 Für die CPU Temperatur erfolgt alternativ die Darstellung mit:
    gnuplot>plot "rpi_temperature.csv" using 1:3 title  'cpu temperature' with lines

    7.3 Um beide Temperaturen in einem Diagramm zu drucken kombiniert man beide Befehle und trennt diese mit einem Komma.
    gnuplot>plot "rpi_temperature.csv" using 1:2 title 'gpu temperature' with lines, "rpi_temperature.csv" using 1:3 title  'cpu temperature' with lines
    Um sich die Verwendung etwas zu vereinfachen, können die Einzelbefehle auch in einer Textdatei (z.B. config.plt) abgespeichert und gnuplot übergeben werden. Dieses arbeitet diese dann Zeile für Zeile ab und druckt die Graphik. Da diese anschließend sofort wieder geschlossen wird, sollte man den Befehl -persist verwenden, der dies verhindert.
    gnuplot -persist config.plt

    Hier noch der Inhalt der config.plt

    #Gnuplot script
    set datafile separator ","
    set timefmt "%Y-%m-%d %H:%M:%S"
    set xdata time            
    set format x "%H:%M"
    set autoscale             
    set ylabel "temperature"
    set xlabel "time"
    plot "rpi_temperature.csv" using 1:2 title 'gpu temperature' with lines, "rpi_temperature.csv" using 1:3 title  'cpu temperature' with lines
    
    

    Samstag, 18. Januar 2014

    Temperaturmessung per Cronjob

    Eine simple Möglichkeit die Temperatur des RPi's aufzuzeichnen, ist einen CRON - Job dafür anzulegen.
    Dieser bietet die Möglichkeit ein Script automatisch nach einer vorgegeben Zeit auszuführen.

    Ich nutzte diese Möglichkeit, um im Minutentakt die Temperatur der CPU und der GPU abzurufen und in eine Textdatei zu schreiben. Dabei verwende ich CSV als Dateiformat, mit folgendem Aufbau:

    Datum Uhrzeit,GPU Temperatur,CPU Temperatur
    

    Zur Temperaturmessung habe ich die beiden Python Scripte zur CPU und GPU Temperaturabfrage zu einem Script zusammengefasst. Um dieses per Cron - Job auszuführen, muss beachtet werden, dass der Cron - Daemon die PATH Variable nicht kennt. D.h. für alle Programm- und Dateioperationen müssen absolute Pfadangaben verwendet werden. Dies betrifft in diesem Fall das Programm vcgencmd zur GPU Temperaturabfrage und der Speicherort der CSV-Datei.

    #!/usr/bin/python
    import os
    import csv
    import time
    from time import gmtime, strftime
    
    def getGpuTemperature():
     #use full path to use in cron job
     ret = os.popen('/opt/vc/bin/vcgencmd measure_temp').readline();
     temperature = ret.replace("temp=","").replace("'C\n","");
     
     return(float(temperature))
    
    def getCpuTemperature():
     tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )
     cpu_temp = tempFile.read()
     tempFile.close()
     return float(cpu_temp)/1000
    
    def main(): 
              
        file = open("/home/pi/rpi_temperature.csv","ab")
        writer = csv.writer(file,delimiter=',')
        temperature=[]
        temperature.append(strftime("%Y-%m-%d %H:%M:%S", gmtime()))        
        temperature.append(getGpuTemperature())
        temperature.append(getCpuTemperature())
        writer.writerow(temperature)    
        file.close()
            
    
    
    main();
    
    Note: Code Formatierung mit formatmysourcecode

    Um dieses Script per Cron - Job automatisch auszuführen, muss dieses in eine User eigene crontab eingetragen werden. Dies ist eine Tabelle mit allen Cron - Jobs des aktuellen Users.
    Um diese zu erzeugen bzw. zu bearbeiten, muss auf der Kommandozeile folgender Befehl eingegeben werden:

    crontab -e
    

    Anschließend öffnent sich die crontab Datei zur Bearbeitung. In diese habe ich folgende Zeile eingefügt.

    * * * * * /home/pi/cpu_temperature.py>>/dev/null
    

    Die fünf Sterne am Anfang konfigurieren den Job so, dass dieser je Minute ausgeführt wird. Ausgeführt wird das python script cpu_temperature.py im home Ordner. Mögliche print Ausgaben werden nach /dev/null umgeleitet.
    Durch mein Script wird im Home Ordner eine CSV-Datei erstellt, welche den Messzeitpunkt und die beiden Temperaturwerte enthält. Anbei der Auszug aus meiner Messreihe.

    ...
    2014-01-14 09:26:02,48.2,48.692
    2014-01-14 09:27:01,48.7,47.615
    2014-01-14 09:28:01,48.2,48.154
    2014-01-14 09:29:02,48.2,48.692
    ...
    


    Sonntag, 12. Januar 2014

    Python Script für Raspberry Pi GPU Temperatur


    Mit dieser Funktion kann die GPU Temperatur ausgelesen werden.
    def getGpuTemperature():
     ret = os.popen('vcgencmd measure_temp').readline();
     temperature = ret.replace("temp=","").replace("'C\n","");
     
     return(float(temperature))
    
    Verwendet wird diese zum Beispiel so:
    import os
    
    def getGpuTemperature():
     ret = os.popen('vcgencmd measure_temp').readline();
     temperature = ret.replace("temp=","").replace("'C\n","");
     
     return(float(temperature))
     
    print(getGpuTemperature()) 
    
    Note: Code Formatierung mit formatmysourcecode

    Python Script für Raspberry Pi CPU Temperatur


    Mit dieser Funktion kann die CPU Temperatur ausgelesen werden.
     def getCpuTemperature():  
      tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )  
      cpu_temp = tempFile.read()  
      tempFile.close()  
      return float(cpu_temp)/1000
    
    Verwendet wird diese zum Beispiel so:
    import os
    
    def getCpuTemperature():
     tempFile = open( "/sys/class/thermal/thermal_zone0/temp" )
     cpu_temp = tempFile.read()
     tempFile.close()
     return float(cpu_temp)/1000
     
    print(getCpuTemperature())
    
    Note: Code Formatierung mit formatmysourcecode