Kategorie-Archiv: IT

Zusammenführen von Fotos unterschiedlicher Kameras unter Android

Eins vorweg, dies ist kein Reise- sondern eher ein IT-Beitrag. Oftmals bin ich mit einer Gruppe von Personen unterwegs, Wandern, gemeinsame Aktivitäten etc. und natürlich macht jeder Fotos vom anderen welche danach ausgetauscht werden. Die Herausforderung dabei stellt sich aber dann die Fotos passend der Reihenfolge zu sortieren und viel wichtiger nur ein Foto pro Szene zu behalten bzw. den Mist zu löschen.

Nachdem ich mittlerweile meistens nur mehr mein Android Handy zur Verfügung habe gestaltet sich das dort etwas schwierig, dachte ich zu mindestens. Beim Kopieren der Fotos wird der Dateizeitstempel auf das Kopierdatum gesetzt und weiters ist die Uhr in den verschiedenen Kameras oft in den unterschiedlichsten und oft falschen Zeitzonen eingestellt. Nachfolgend die Anleitung wie sich das Thema ganz elegant und ohne großen Aufwand lösen laesst.

Im ersten Schritt sammle ich die Fotos aller Kameras in unterschiedlichen Ordnern und lese aus den EXIF Metadaten des Bildes den Zeitstempel aus. Der schnellste Weg das zu erreichen ist die App File Timestamp zu installieren und den Zeitstempel der Dateien zurück auf den Zeitstempel aus den EXIF Metadaten zu setzen und danach die Bilder in einem Dateinamanger z.B. Total Commander zu betrachten. Nun kommt der schwerste Teil, zu ermitteln um wieviele Stunden die Fotoszeistempel unterschiedlich sind und welche Kamera stimmt. Hier hilft es z.B. wenn ich weis, dass der Zeitstempel meiner Kamera richtig ist und wir alle zur ungefähr selben Zeit das selbe fotographiert haben. Dann weis ich in etwa, die Fotos von X muss ich um +3h manipulieren und die Fotos von Y um -12h und so weiter.

Nun geht es ans eingemachte. Theoretisch gibt es viele Apps die das Manipulieren von EXIF Metadaten anbieten. Keine davon bietet aber an, den Zeistempel eines ganzen Ordners auf plus X Stunden zu verschieben. Ich habe dann geschaut welche Tools es fuer diese Aufgabe sonnst noch gäbe und bin auf jhead gestoßen. Mit diesem Tool könnte ich bequem die EXIF Zeitstempel manipulieren, z.B. mit dem Befehl „jhead -ta+2:30 *“ im Ordner in dem sich die Fotos befinden wird der EXIF Zeitstempel der Fotos um zwei Stunden und 30 Minuten erhöht. Das Tool steht aber für Android als Binary nicht zur Verfügung, also gilt es den Sourcecode herunterzuladen und selbst zu compilieren. Ob das wohl so einfach möglich ist?

Im naechsten Schritt habe ich auf meiner CyanogenMod Android Variante in das Terminal gewechselt und nach dem entpacken des Sourcecodes mittels ZArchiver versucht mit den ueblichen Build Befehlen die Binary zu erstellen. Woops, leider war kein Compiler installiert. Eine Suche nach einem Compiler hat die App CCTools geliefert, installiert, Makefile oeffnen und Build klicken und wolla es wurde eine Binary erstellt. Was mich dabei schon verwundert, alle Voraussetzungen wie Toolchain etc. wurden im Hintergrund automatisch geschaffen und das ganze war richtig richtig einfach. War sicher nicht das letzte Mal, dass ich diesen Weg genommen habe. Damit ich jhead im Terminal wie gewohnt verwenden kann habe ich die Binary mit dem Total Commander nach /system/xbin kopiert und entsprechend die Aufführungsrechte gesetzt. Gegebenenfalls muss dazu der Root Modus in den Einstellungen aktiviert werden. Wenn jemand die jhead Android Binary direkt herunterladen moechte kann dies hier tun.

Ist die Binary dann dort und die Rechte richtig gesetzt kann ich im Terminal bequem in das jeweilige Verzeichniss mit den Bildern wechseln und mittels z.B. jhead -ta+2:30 * den Zeitstempel manipulieren. Im nächsten Schritt kopiere ich alle Bilder gemeinsam in einen Ordner und verwende wieder die App File Timestamp um den Dateizeitstempel aller Bilder nun richtig zu stellen. Wenn ich die Bilder nun nach Dateidatum sortiert betrachte sind sie in der richtigen Reihenfolge.

Zusätzlich bietet es sich nun auch an die Dateien umzubenennen um sie auch nach dem Dateinamen sortieren zu koennen. Dazu bietet sich die App Photos and Files Renamer an. Zuerst muss man in den Parametern die gewuenschten Einstellungen vornehmen, z.B. nicht überschreiben, Number 4stellig und davor und als Trenner einen Unterstricht, danach alle Dateien markieren und umbenennen.

Im weiteren Schritt kann man dann wie gewohnt die Fotos aussortieren und konvertieren.

Viel Spaß beim nachahmen, Feedback wie gewohnt unter Kontakt.

LG,
Max

Verwendete Apps:
File Timestamp
Total Commander
ZArchiver
CCTools
Photos and Files Renamer

SMS Gateway mit Raspberry Pi

Bisher hatte ich bereits mit Hilfe des Gammu Projekts und einem Huawei E220 Modem versucht, einen stabilen SMS Gateway zum Senden und Empfangen von Nachrichten zu schaffen. Das Problem dabei war allerdings, dass nach 2-3 Tagen das System nicht mehr funktioniert hat. Auch ein täglicher Neustart hat das Problem nicht verbessert. Vor kurzen habe ich einen Neuauflage des Projekts erwogen, es folgen nun die Umsetzungdetails.

Hardware:

  • RASPBERRY-PI/8GB-USD mit Gehäuse und Netzteil um 40€ bei Farnell
  • Ein gebrauchtes und entsperrtes Huawei E160 Modem um 13€ bei Ebay
  • Einen USB-Hub, konkret den D-Link DUB-H7 um 21€ bei Amazon

Bei der Auswahl des Modems sollte man aufpassen und z.B. diese Liste konsultieren, ist zwar eigentlich für die Installation von http://www.raspberry-asterisk.org gedacht aber bietet einen guten Anhaltspunkt. Auch bei der Auswahl des USB-Hubs sollte man beachten, dass Raspberry nicht alle USB-Hubs unterstützt, eine Liste dazu siehe z.B. hier. Gesamt sieht das Setup dann etwa so aus.
raspberry_smsgw

Installation:

  • Raspberry Pi kam bei mir schon mit einem vordefinierten Setup, sonnst einfach von hier das Paket auf die SD-Karte kopieren, eventuell wird dafür der Win32DiskImager oder ähnliches benötigt. Ich habe mich beim Betriebsystem für Raspbian, quasi dem Debian für Raspberry Pi entschieden
  • Das System auf den aktuellen Stand bringen und Tools zum Compilieren installieren
    apt-get update && apt-get upgrade -y
    apt-get install -y build-essential
  • SmsServerTools3 in neuester Version runterladen und compilieren/installieren
    wget http://smstools3.kekekasvi.com/packages/smstools3-3.1.15.tar.gz
    tar -zxvf smstools3-3.1.15.tar.gz -C /usr/local/src
    cd /usr/local/src/smstools3
    make
    make install
  • Hat alles geklappt könnte man die SmsServerTools (sms3) starten, wobei es fehlt noch die Konfiguration
    /etc/init.d/sms3 start bzw. /etc/init.d/sms3 stop

Konfiguration:

Die Konfiguration ist grundsätzlich unter /etc/smsd.conf zu finden. Hier meine aktuelle Konfiguration.

# sms3 config from /etc/smsd.conf

devices = huawei

#log an loglevel (use loglevel 8 for debug)
loglevel = 5
logfile = /var/log/smsd.log

#folder for messages
stats = /var/log/sms/stats
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
incoming = /var/spool/sms/incoming
sent = /var/spool/sms/sent

delaytime = 4
errorsleeptime = 4
blocktime = 180
autosplit = 3
receive_before_send = yes
national_prefixes = 0

# Modem configuration
[huawei]
smsc = 43XXXXXXXXXXX
device = /dev/ttyUSB0
incoming = yes
#baudrate = 115200
baudrate = 19200
rtscts = no
hangup_incoming_call = yes

#use internal memory for storing messages 
init = ATE0+CPMS="ME"
#turn off periodic status messages
init2 = AT^CURC=0

Die oben angegebenen Ordner und Pfade für Logs etc. müssen natürlich entsprechend eingerichtet werden.

Zwecks Debugging hier einige Tipps:

  • Ist das Modem grundsätzlich vorhanden, siehe z.B. lsusb bzw. ls /dev/*USB*, Raspberry USB Themen siehe hier
  • Können auf dem Modem AT Befehle abgesetzt werdnen, zB mit minicom
  • Loglevel in smsd.conf auf 8 und tail -f /var/log/smsd.log und prüfen welche AT Befehle er nicht mag
  • Ev. zuerst in smsd.conf incoming = no stellen und nur mal versuchen SMS zu senden
  • Ev. Baudrate anpassen
  • Ev. mit dem init = ATE0+CPMS=“ME“ Befehl anpassen wo die SMS ausgelesen/gespeichert werden sollen
  • Mit den Timing Settings spielen
  • Doku und Community fragen
  • Pin von Simkarte is aus und Sim geht grundsätzlich
  • Es ist GSM-Empfang und genügend Power für das Modem vorhanden

Echoscript für Test einrichten:

Um die Funktion und Stabilität des SMS-Gateways zu testen habe ich ein einfaches Script erstellt welches eine SMS-Ping Funktionalität zur Verfügung stellt. Ich sende also ein SMS an die Nummer meines Modems und erwarte innerhalb von etwa 30 Sekunden eine Antwort inklusive der Ursprünglich gesendeten Nachricht. Der Inhalt des Scriptes schaut in etwa so aus.

<?php
date_default_timezone_set('Europe/Vienna');
$income_sms_dir="/var/spool/sms/incoming/";

if (is_dir($income_sms_dir))
{
    if ($dh = opendir($income_sms_dir))
    {
        while (($file = readdir($dh)) !== false)
        {
            if($file!="." && $file!="..")
            {    
                echo "filename: ".$file." date: ".date("d.m.Y H:i:s")."\n";
                $content=file_get_contents($income_sms_dir.$file);
                $split_line=explode("\n",$content);
                $from=preg_replace("/[^0-9]+/","",substr($split_line[0],6));
                $message="Echo:".preg_replace("/[^a-zA-Z0-9]+/", "_", $split_line[12]);
                $exec="/usr/local/bin/sendsms ".$from." \"".$message."\"";
                echo $exec."\n";
                exec($exec);
                unlink($income_sms_dir.$file);
            }
        }
        closedir($dh);
    }
}
?>

Um das ganze aufzurufen habe ich einen Workaround für crontab -e benützt um alle 5 Sekunden das Script zu starten.

* * * * * php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 5; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 10; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 15; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 20; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 25; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 30; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 35; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 40; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 45; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 50; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 55; php -f /root/echo.php >> /root/echolog.txt

Weiterführende Links:

  • Wer nicht nur einen SMS sondern einen VOIP/GSM Gateway betreiben möchte findet hier oder auch hier weitere Installationsquellen / Anleitungen
  • Wer gern eine WebGUI zum SMS Senden hätte könnte PlaySMS verwenden, eine Installationsanleitung ist hier zu finden

Tauschmarkt Software

Liebe Tauschmarkt-Organisatoren und andere Interessenten an der Tauschmarkt Software,

Im Sommer 2013 sind wir zusammengesessen und haben darüber gesprochen wie man einen Tauschmarkt wohl am besten abwickeln könnte. Nach kurzer Diskussion hat sich gezeigt, dass wir den Tauschmarkt besser nicht mit Excel oder Zetteln abwickeln sollten, sondern dafür eine einfache Software geeigneter wäre.

Ich habe kurzerhand geprüft, welche Frameworks gerade aktuell sind und bin auf das Yii Framework gestoßen. Mich hat die Funktionalität aus Datenmodellen Klassen und Views zu generieren beeindruckt. Durch dieses Konzept kann man mit wenigen Handgriffen eine Softwarelösung auf die Beine stellen und hat dabei eine saubere Struktur und ist sehr flexibel. Ein umfangreiche Pool an Erweiterungen runden das Framework ab.

Aus dem Framework und anderen Tools ist innerhalb von wenigen Stunden die Software entstanden. Aktuell werden darin folgende Prozesse unterstützt: Annahme, Verkauf, Abholung und Reklamation. Details zur Software selbst oder zu den einzelnen Prozessen siehe Demo unter http://tauschmarkt.demo.schlucht.at bzw. http://vorerfassung.demo.schlucht.at. Die Hilfe bzw. Prozessbeschreibungen befinden sich unter dem Link „Home“. Sollte jemand in der Demo die Adminfunktionen benützen wollen, Benutzer und Passwort wären „admin“.

Ihr möchtet die Software auch für euren Tauschmarkt verwenden? Bitte gerne, hier die Beschreibungen und Download-Links zu den Versionen:

In Version 0.3 wurden folgende Dinge geändert:
Download Tauschmarkt_Software_v0.3
– Bilderfassung zu Artikel am Handy unter Punkt Mobile
– Kundenstamm um eMail und PLZ erweitert
– Beim Verkauf wird beim klick auf das Bild ein JS-Popup angezeigt
– Verkäufe welche keinen Artikel finden werden auch in der Tabelle darunter rot hervorgehoben
– In Artikelliste zeige nur x wenn Bild vorhanden ist
– Annahmedruck und Abrechnungsdruck vom Pletz her optimiert
– Happyhour kann auf Annahmedruck und Abrechnungsdruck ausgeblendet werden (neuer Parameter happyhour_anzeigen)
– Freigabetext mit Unterschriftenfeld kann auf Abrechnung ausgeblendet werden (neuer Parameter abrechnung_disclaimer_show)
– Neuer Etikettentype „Standard_2018“ mit Andruck der KundenNr
– Unter dem Kunden kann man eine Voransicht der Abrechnung aufrufen
– Es können mehrere Kunden (aktuell 20) auf einmal abgerechnet werden
– Es gibt eine Auszahlungsliste um den Überblick der Auszahlungen zu behalten
– Artikel können als Admin gelöscht werden
– Diverse Erweiterungen in den Statistikansichten
– Diverse Bugfixes

In Version v0.2 wurden u.a. folgende Featuers hinzugefügt, Details siehe Demo’s oben:
Download Tauschmarkt_Software_v0.2
– Artikel haben Warengruppen
– Artikel haben Größe/Länge
– HappyHour Funktionalität
– Eigene Anwendung „Vorerfassung“ für Artikelerfassung im Internet vor dem Tauschmarkt

Version v0.1 wurde bei unserem letzten Tauschmarkt verwendet:
Download Tauschmarkt_Software_v0.1

Wenn ihr Infos über die Software weitergeben möchtet bitte den Permanenten Link http://tauschmarkt.schlucht.at verwenden.

LG,
Max

Nextgen Gallery – Backup als Download bzw. Vollbild

Ich bin von den Funktionen der NextGEN Gallery für WordPress relativ begeistert, jedoch möchte ich zwischen den Bildern schnell blättern können (d.h. kleine Dateigröße erforderlich)  und andererseits auch die Originalbilder zur Verfügung stellen.

Nachdem diese Funktionalität bisher nicht verfügbar war habe ich einige kleinere Anpassungen an der NextGEN Gallery 2.0.17 vorgenommen um dies zu ermöglichen.

Grundsätzlich müssen unter den Optionen die beiden Einstellungen „Backup the original images“ und „Automatically resize images after upload“ aktiv sein. Erstellt man nun eine Gallery dann bekommt man eine verkleinerte Datei für die Ansicht und die Backup Datei zur Wiederherstellung.

Im ersten Schritt habe ich den Dateinamen der Backup Datei geändert indem ich dahinter immer nochmals die tatsächliche Dateiendung angehängt habe. Also konkret sucht man in den folgenden Dateien class.gallerystorage_driver_base.php, class.ngglegacy_gallerystorage_driver.php, functions.php, manage-images.php, manage.php, xmlrpc.php nach dem String „_backup“ und muss dort eine Ersetzung vornehmen.

Zum Beispiel wenn bisher dort $filepath=$image_path.’_backup‘; gestanden ist muss danach $filepath=$image_path.’_backup‘.‘.‘.substr( strrchr($image_path, ‚.‘), 1); stehen. Dadurch wird statt der Datei Filename.Endung_Backup die Datei Filename.Endung_Backup.Endung erstellt.

Im zweiten Schritt muss dann auch noch der Link zum Download der großen Originaldatei im Frontend angezeigt werden. Dazu habe ich bei mir in den Optionen die Fancybox aktiviert und in der Datei nextgen_fancybox_init.js eine Manipulation hinzugefügt damit der Downloadlink unter allen Konstellationen angezeigt wird.

Eine Sammlung der Anpassungen kann hier: ng_2.0.17_BackupMod_FilesOnly heruntergeladen werden. Ein fertiges Installationspaket inklusive der Anpassungen ist hier ng_2.0.17_BackupMod_Full verfügbar.

Offene Punkte:

  • Wenn man im Backend auf „Scan Folder for New Items“ drückt werden die Backupbilder als neue Bilder erkannt, dies muss noch unterbunden werden

Nachtrag: um bei einer NextGen-Gallerie den Albumnamen anzuzeigen ist folgende Modifikation in Datei album-compact.php nötig:

if($galleries[0]->gid)
{
    //ermittle erstes album welches diese galerie enthält
    $temp_albums=nggdb::find_all_album();
    foreach($temp_albums as $temp_album)
    {
        foreach($temp_album->galleries as $temp_galerie)
        {
            if((string)$temp_galerie==(string)$galleries[0]->gid)
                break;
        }
        if((string)$temp_galerie==(string)$galleries[0]->gid)
            break;
    }
    echo $temp_album->name;  //oder ähnliches   
}