XMP Daten aus JPEG extrahieren

Da ich in meiner Gallerie Metadaten wie GPS-Koordinaten und Schlagwörter benötige hab ich mich die letzten Tage mal mit dem extrahieren von solchen daten aus dem JPEG-Format beschäfftigt.

Zuerst bin ich bei der SourceForge fündig geworden. Dort gibt es mehrere Libs zu auswahl. Die haben meistens nur ein Problem.  Entweder sie nutzen .NET WPF funktionen oder extrahieren reine EXIF-Tags.

Nachdem ich mehrere Stunden vergeblcih versucht hab mit normalen „Boardmitteln“, „BitSchubserei“ und anderer wiedrigkeiten an diese Daten zu kommen, hab ich mal den guten alten HexEditor ausgegraben. Eine Suche nach meinen benutzten Schlagwörtern brachte schnell hervor, dass die meisten Bildverarbeitungsprogramme die Tag-Daten zwei mal speichern. Einmal in den EXIF Tags und einmal im IPTC/XMP/IIM Format. Von letzterem hab ich vorher viel gelesen und Definition gefunden. Exif leider weniger…

Das Problem war, dass ich nicht wusste wo diese Daten hinterlegt waren und wie.  Der Hex-Editor brachte die denkbar  einfachste Methode zum vorschein. XMP ist in reinem XML gespeichert und dieses wird hübsch im Klartext in die Datei geschrieben. Einfach die ganze Datei einlesen, Start und End-Tag suchen, zurechtschneiden, parsen und schon hat man einen sehr angenehmen Weg sämmtliche hinterlegten Daten abzufragen.

Nachdem ich meinen „Weg“ validieren wollte fand ich dann auch einige Codebeispiele dazu. Hier das verständlichste:  Shahine.com –  Reading XMP Metadata from a JPEG using C#

Brainfuck die zweite

Nach zwei Wochen hab ich so langsam den Dreh raus. Wenn man sich mal auf die Widrigkeiten von JavaScript eingelassen hat und JQuery nutzt kommt man recht gut vorran. Ohne JQuery geht es zwar auch, aber dann hat man mehr schmerzen als ohne 😉

Was hab ich nun die letzten zwei Wochen so getrieben. Nun ja erstmal grundlegend JavaScript am Beispiel „Wie interagiere ich mit GoogleMaps“ gelernt/eingearbeitet. Das „Erfahrene“ dann so in ein ASP-Steuerelement umgesetzt, dass man so halbwegs aus dem Codebehind die Steuerung übernehmen kann.

Es stellte sich schnell herraus, dass der aktuelle „Arbeitsprozess“ des ASP AJAX-Frameworks (Atlas) nicht dafür gemacht ist eigene Steuerelemente zu unterstützen die mehr Interaktion benötigen, als „clicked“-Handler. Ein vollständiger PostBack (ob nun mittels JavaScript oder ohne) ist ein wenig zu viel, wenn man nur ein paar Bilder bewegen will.

Nach dieser Erkenntnis und dem Empfinden, dass mein bisheriger JS-Code scheiße aussieht, hab ich nochmal alles überarbeitet und JQuery eingesetzt. Der Code ist zwar immer noch kaum „wartbar“ aber immerhin schön schlank.

Die Servercontrols wurden mit einem eigenen ResponseHandler versehen. Sie agieren völlig losgelöst vom eigentlichen ASP-Seiten-Lebenzyklus. Mittels eines eigenen RequestHandlers werden sie parallel zum den normalen Requestes mit Daten versorgt. Dahinter stehen selbstgeschrieben Bibliotheken die eine die Verarbeitung von GPS-Daten und Exif-Infomrationen erleichtern. Und das alles läuft unter Mono 😉

In den folgenden Tagen werde ich mal eine Beispielseite online stellen.

JavaScript und ASP-AJAX oder Brainfuck

Ich hab nun 1 1/2 wochen Testen und Rumprobieren hintermier und zieh mein erstes Fazit.

Ich hab zwei ASP – UserControls die jeweils miteinander kommunizieren. Einen Slider der eine Bilderliste nach rechts oder links „sliden“ lässt und eine GoogleMaps-Grafik auf der alle Bilder zurückgelegtem Weg angezeigt werden. Die beiden Controls kommunizieren auch mit einander. Fährt man über eine Bild , wird die karte verschoben und umgekehrt, klickt man auf ein Markersucht der Slider das entsprechende Bild.

Bei der Erstellung dieser  Funktionalitäten haben sich zwei dinge gezeigt.

  1. das AJAX-ASP.NET Framework  lässt einen ziehmlich schnell im regen stehen, wenn manmehr will als nur den herkommlichen Postback in AJAX gegossen.
  2. Von vernünftigen Hochsprachen auf JavaScript zu wechseln ist doch ziehmlicher Brainfuck

Erst nachdem ich mal für einige Zeit alles vergessen hab, was ich biss her über guten Programmierstiel gelernt habe und alle Konzepte ignoriert habe die ich so kannte, kam ich mit JS klar. Nach zwei Stunden fluchen waren die ersten vorzeigbaren Ergebnisse zu bestaunen.

Der Port auf Mono  lief ohne Probleme.  Sowohl LINQ als auch die ASP AJAX Extensions machten keine Probleme. Einzige die Performance war nicht sooo berauschend. Das es in meiner Umsetztung noch 3 Dicke Perfomence-Fresser gibt, war mir klar. Dass diese aber zu einem Timeout führen hätt icch auf einem 1.7Ghz Dualcore nicht erwartet. Da knie ich mich am wochenende rein, nachdem ich mich mit JQuery beschäftigt habe

Apache und Mono die zweite

Unter ubuntu hat man ein „kleines“ Problem wenn man nur Mono 2.0 installiert und eine ASP WebtSeite via Apache hosten will. Es fehlt dann an einem symbolischen Link.

Es müssen sowohl /usr/bin/gmcs und /usr/bin/gmcs2 vorhanden sein. Ist nur letzteres vorhanden muss das erste über einen symbolischen Link „hergestellt“ werden.

Um es bei der administration/einrichten von Webspaces etwas einfacher zu haben bieten sich ‚mono-server2-admin‘ und ‚mono-server2-update‘ an. Damit lässt sich eine ASP Seite recht einfach einrichten. Die erste Testseite grinnst einen in wenigen „Sekunden“ an…

GeoTagging, Bilder und Galerien

Nunja seit einer Woche hab ich schon nichts mehr von mir hören lassen. Das hat einen guten Grund. Ich hab mein Urlaub beendet und nunja meine geschossenen Bilder gesichtet und gleich die Kamera eingeschickt… blöde Geschichte… egal kommen wir zum interessanten.

Wenn man Bilder über den Zeitstempel mit einer GPS-Strecken-Datei korreliert bekommt man was … ja was eigendlich. In erster linie mal gar nichts. Es Bedarf erst irgendwelcher Tools, meistens online, um diese getaggten Informationen auszuwerten. Da ich jedoch keine Lust hab meine Bilder auf Flickr oder ähnlichem Online zu stellen hab ich mich mal auf die Suche nach brauchbarer Software gemacht.

Das einzig sinnvolle was ich fand war GeoTag. Dies Programm stellt mittels GoogleMaps schön anschaulich dar, wo die Photos geschossen wurden. Leider sind die sonstigen Funktionen was die Präsentation betrifft unterirdisch. UNd auch sonst findet sich wenig was zumindestens Tags verarbeitet und gleichzeitig Bilder auf ner Karte darstellt, ohne dass dabei die Bilder gleich auf irgendwelchen Fremdrechnern gehostet werden…

Nun gut, seit einer Woche schlage ich mich mit JavaScript, GoogleMaps und erweiterten EXIF-Infos rumm. Selbst ist der Programmierer. Den ersten Protypen einer ASP anwendung die Daten aus Bilder ausließt und samt GPX Datei auf einer GoogleMaps Karte darstellt hab ich schon. Ich werde näheres dazu in Kürze veröffentlichen.

Über FN-Taste das Touchpad deaktivieren.

Der Controler des 1008HA benutzt für die Touchpad-Taste einen anderen KeyCode als die bissherigen EeePC-Modelle. Somit bedarf es einer Anpassung. Am leichtesten geht dies über das EeePC-Tooling von Statux.

Mit diesem wird eine „angepasstes“ ACPI-Tooling ausgeliefert welches die Events dem System zur Verfügung stellt. Dies ist nich alles weiter wild und wird auch von anderen ACPI-Implementierung geliefert (auch der Standartversion). Diese Variante bietet aber die Möglichkeit ohne größere Probleme in den „Verarbeitungsprozess“ einzugreifen.

Mittels einer Debugoption kann sich die KeyCodes ausgeben lassen. Damit lässt sich die folgende Configurationsdatei (/etc/default/eeepc-acpi.local) schnell zusammenstellen. Nach einem (Dienst)Neustart funktioniert der Key.

#KEY_SHOW=1 #Debugausgabe zuschalten oder nicht

KEY_WIFI="00000010"
#KEY_BT=  #die Seashell hat dafür keinen schalter
#KEY_CAM= #die seashell hat dafür keinen schalter
KEY_VOLU="00000015"
KEY_VOLD="00000014"
KEY_MUTE="00000013"
KEY_TOUCHPAD="00000037" #angepasster keycode
KEY_RESOLUTION="0000001b"

KEY_VGAOFF="00000016"
KEY_VGAOUTA="00000030" 
KEY_VGAOUTB="00000031" 
KEY_VGAOUTC="00000032" 

KEY_PERFMON="00000012"
KEY_PERFMON_COMMAND="/usr/bin/gnome-system-monitor"
KEY_PERFMON_NAME="System Monitor"
KEY_PERFMON_ICON="gnome-monitor"

TOUCHPAD_KEY_DISABLE="1"
TOUCHPAD_DELAY="0.5"

POWER_AC="00000050"
POWER_BAT="00000051"

MODE_AC="performance"
MODE_BAT="ondemand"

PAUSE_SERVICES="anacron cron ntp bluetooth"

USB_SUSPEND=1 #mit vorsicht zu genießen! dokumentation lesen
DONOT_SCALE_FSB="1"

Damit das Touchpad „on-the-fly“ abgeschaltet werden kann braucht es noch „einige“ Anpassungen.
Erstmal müssen alle Einträge in der XServer-Configdatei (/etc/X11/xorg.conf) entfernt werden die das Touchpad/Mause betreffen.
Die Seashell verwendet ein standart Synaptic-Touchpad, entsprechend müssen eventuelle Protokollanpassungen in der Datei „/etc/modules“ entfernt werden. Der Treiber funktioniert „out of the Kernel“.

Alle konfiguration betreffend des Touchpads sollte/muss über eine HAL-Policy erfolgen. Dazu einfach eine Datei unter /etc/hal/fdi/policy anlegen. Diese sollte die Endung .fdi haben.
folgenden Inhalt einfach reinkopieren

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
<device>
<match key="input.x11_driver" string="synaptics">
<merge key="input.x11_options.PalmDetect" type="string">true</merge>
<merge key="input.x11_options.SHMConfig" type="string">true</merge> 
</match>
</device>
</deviceinfo>

Auf „PalmDetect“ kann verzichtet werden, SHMConfig muss auf „true“ gesetzt werden. Alle weiteren möglichen Parameter können im Ubuntu wiki nachgeschlagen werden. Nach einem (HAL-Dienst)Neustart lässt sich nun auch das Touchpad auf Knopfdruck zu/abschalten.

Sehr praktisch das ganze.

Seashell RFKillswitch unter Ubuntu

Damit man auf Knopfdruck das WLan abschalten kann muss man das modul rfkill-input laden lassen. In der Datei „/etc/modules“ das modul angeben.

Man kann auch mit dem folgendem Befehl, das modul temporär laden und testen.

sudo modprobe rfkill-input

will man etwas mehr komfort braucht man eines der „vielen“ EeePC-Applets. Ein gutes wird über das statux.org-Repository. Danach kann man sich das EeePC-Tray installieren. Danach bekommt man eine Visualisierung ob der Tastendruck „gezogen“ hat, da der WPA-Supplicant ein wenig verzögert reagiert.