96dpi

Andreas Levers / Fotografie und Bildbearbeitung

Making Of

Abbildung 1Ein Vorteil meines Berufs ist die Mitwirkung an spannenden Projekten. Natürlich stehen Kreation und Wirkung dabei im Vordergrund, abseits des sichtbaren Teils gibt es aber hinter den Kulissen für mich eine Menge zu lernen. Für meinen Arbeitgeber habe ich im August eine Anwendung entwickelt, die es uns und damit unserem Kunden ermöglichte MMS-Nachrichten mit Fotos auf dem Videoscreen am Kurfürstendamm darzustellen. Für den Werbekunden war es wichtig die Digicam des Geräts eindrucksvoll zu inszenieren. Dazu konnte man sich täglich von einem Promotion Team vor Ort fotografieren lassen. Diese Bilder wurden dann per MMS an unseren Server gesendet. Weiter geht es mit den technischen Aspekten.

Der erste Schritt war die Auswertung der eingehenden MMS. Der einfachste Weg war hier der Versand der MMS an einen E-Mail Empfänger. Der Mobilfunk-Provider sendet die Nachricht dann als normale MIME-Mail an unseren Mailserver. Der MTA - in diesem Fall Postfix - leitet die eingehende Mail per Pipe an PHP weiter. Dadurch konnte ich es vermeiden, dass ein Script in Intervallen per POP3 nach neuen Nachrichten suchen muss musste.

Die Mail wird als Textstrom per STDIN in PHP verfügbar gemacht. Zuerst wurde die Mail-Struktur auf bestimmte Kriterien geprüft: Unter anderem musste ein Schlüsselwort im Betreff gesetzt sein, um einem Missbrauch vorzubeugen. Nach der erfolgten Prüfung wurde die Mail nach JPEG-Bildern durchforstet. Da jeder Mobilfunkprovider die aus einer MMS generierte Mail anders aufbaut war es notwenig einen flexiblen Parser einzusetzen. Die MIME-Parts von E-Mails können grundsätzlich verschachtelt sein. Deswegen war eine Rekursion unumgänglich. An der Stelle bin ich über die mangelhafte Dokumentation von Mail_mimeDecode gestolpert. Da die für mich gewohnte Entwicklung lokal mit Debugger oder remote per Browser und Trial and Error nicht möglich war, blieben mir hier nur selbsterstellte Logfiles.

Bei dem ersten gefundenen Bild bricht die Suche ab. Dieses Bild wird zur Protokollierung zunächst als Datei mit zufälligem Namen gespeichert. Per ImageMagick wurden danach zwei Varianten erstellt. Ein Thumbnail für die Administration war der einfachere Teil und wäre auch ohne ImageMagick ausgekommen. Aufwändiger war die Konvertierung für die Darstellung auf dem Videoscreen. Das Motiv sollte in dem dargestellten Handydisplay eingebettet gezeigt werden. Da das Display perspektivisch verzerrt sichtbar wurde das Bild zuerst rotiert, dann gekippt, anschließend skaliert und dann per Unscharfer Maske geschärft. In diesem Fall sah der Aufruf folgendermaßen aus:

PHP:
  1. exec('convert ' . $filename . ' -unsharp 1.5x1.2+1.0+0.10 -rotate 6 -shear 2x2 -quality 60 -geometry 480x360 ' . $new_filename);

Extrem wichtig bei der Ausführung von Befehlen via exec ist, dass alle variablen Teile geprüft und bereinigt werden. Die Variablen filename und new_filename wurden in diesem Fall ohne Verwertung von Nutzerdaten gefüllt und trotzdem vorher escaped. Lieber paranoid und 10ms langsamer als hochperformant und gefährlich. Abschließend wurden die Meta-Infos wie Eingangsdatum, Dateiname etc. in einer MySQL-Datenbank gespeichert. Die Verarbeitung einer eingehenden Mail/MMS bei einem Foto in VGA-Auflösung dauerte im Schnitt 2 Sekunden. Damit war eher der Versand über den Mobilfunk bestimmend für die Reaktionszeit.

Abbildung 2Die Digital-Signage Software zeigte das Kundenmotiv für 30 Sekunden pro Minute an. In der Zeit, in der die Kreation nicht sichtbar war, prüfte ein Script im Hintergrund per HTTP ob ein neues Foto vorliegt. Dazu wurde eine FIFO Puffer verwendet. Wenn keine Fotos vorlagen - z.B. in den Nachstunden - wurde ein generisches Motiv mit anderen Texten gezeigt. Natürlich prüfte die Software im Vorfeld, ob überhaupt ein Download notwendig ist und verwendete gegebenenfalls eine Version aus dem lokalen Cache.

In diesem Projekt war PHP der ideale Kleber, um verschiedene Dienste zusammenzuhalten. Auch wenn die Scriptsprache wegen der syntaktischen Unsauberkeit und mangelnder Eleganz nicht mit dem im Moment gehypten Ruby oder Python mithalten kann, wäre die Aufgabe ohne für mich nicht zu lösen gewesen. Besonders interessant fand ich die Anwendung außerhalb des gewohnten Apache-Kontexts. Die Ausführung per Cron, Anbindung per PIPE und das arbeiten mit externen Binaries waren für mich Neuland.

Bildquelle: ADXXL

Kommentieren