Meedeo

Meedeo ist mein neues Open-Source-Projekt. Es ermöglicht das Abspielen von vertonten Bilderbüchern. 

Vertonte Bilderbücher?

Man nehme ein Bilderbuch und scanne es zum Beispiel ein. Dann liest man es in ein Mikrofon und nimmt dies am Pc auf. Dann legt man jeweils das Bild und die Tondatei mit dem gleichen Namen in einen Ordner. Fertig ist ein vertontes Bilderbuch, welches jetzt über einen Mausklick durchgeblättert werden kann.

Die Idee basiert auf dem Fotokuckiphon und ist für Rett-Kinder entwickelt worden. Mein Programm ist ein Klon auf der Adobe Air Technologie und steht unter der Apache Open Source Lizenz.

Es ist die erste Version, hat aber noch starkes Ausbaupotential. Das Programm wird ein Weihnachtsgeschenk für meine Schwester. Aber psssst, nicht verraten.

Remember the tab

Gerade kam ich wieder in den Genuß eines tollen Firefox-Features, was nicht kompatibel zu Kontaktformularen ist.
Zurück zum Anfang der Geschichte. Bei einem wichtigen Anliegen, gab es mal wieder keine andere Möglichkeit als ein Kontaktformular. Also brav mein Anliegen formuliert und abgesendet. Die Bestätigungsseite kam und zum Weitersurfen habe ich natürlich weitere Tabs im Firefox verwendet. Eine Minute später kam auch die Bestätigung per E-Mail, dass das Kontaktformular erfolgreich abgesendet wurde und demnächst bearbeitet wird.
Firefox beendet und beim erneuten Start gemerkt, dass alle 10 Tabs wiederhergestellt wurden. Gut, habe ich so eingestellt, weil beide Varianten nerven. Entweder alle Tabs weg oder alle 10 Tabs wiederhergestellt. Vielleicht wäre ein Flag praktisch, dass man den wichtigen Tabs mit auf den Weg gibt. Nachdem ich mich durch die ersten Tabs mit CMD+W gekämpft habe, stelle ich fest, dass mir die frohe Botschaft: Ihre Nachricht wurde versendet entgegenlächelt. Eine Minute später ist auch die E-Mail im Posteingang.
Unschön, vorallem hoffe ich, dass die Bearbeitung nicht im Round-Robin-Verfahren erledigt wird und ich auch zwei Antworten erhalte.
Wer hat Schuld? Im Zweifel der Anwender, ist aber zu einfach. Firefox, naja, warum muss der auch die POST-Parameter abspeichern. Reicht es nicht, GET-Anfragen erneut zu senden? Nach der Spezfikation verändern POST-Parameter den Status auf dem Server. Von daher ist das unglaublich ungeschickt. Man stelle sich eine Anwendung vor, die Items nicht per Id, sondern per Index löscht. Dreimal im Firefox wiederhergestellt, dreimal das erste Item gelöscht. Aua – verdammt unschön.
Und was macht die Web-Anwendung? Sie hätte ein Token mitgeben können. Somit wäre zumindest das mehrfache Versenden unterbunden. Ist im Zusammenhang mit POST immer eine gute Idee. Gerade bei Abwehr von Cross Site Request Forgery (CSRF) sollte man sich richtiges Token-Handling mal ansehen.
Also haben wir nicht einen Übeltäter, sondern gleich drei:

  • Der Benutzer, der seine Tabs nicht ordnungsgemäß schließt
  • Firefox, der POST-Parameter erneut sendet
  • Die Web-Anwendung, die nicht genügend Überprüfungen hat

Wie behebt man das Problem am besten?
In dem man Kontaktadressen anstatt Formularen anbietet. Bitte liebe Webseiten-Auftraggeber: kein Kontaktformular, die sind die Pest schlecht hin. Neben meinem Problem sind das herrliche Einfallstore für Spam aller Art. Gibt man eine E-Mail-Adresse an, gibt es genügend fähige Filter, um Spam recht zuverlässig auszusortieren. Wie wertet man aber das Kontaktformular aus? Ein schönes Skript kann ein paar Tausend Einträge hinterlassen. Wie Filtern? Wie Gutes vom Schlechten trennen? Ah, wir sind bei Captchas. Toll, sehr benutzerfreundlich. Achso, kaum lesbar, na dann runter mit dem Störungen. Oh, jetzt gibt es doch wieder Spam-Attacken, weil es sich um eine wichtige Webseite handelt oder die verwendete Library schon gut genug von Spammern und deren OCR trainiert wurde. Es ist die Pest. Warum sollte man sich diese an den Hals holen, wenn man für die Bereiche E-Mail-Adressen hinterlegen kann. 99% der User kommen damit super klar (herrlich pauschalisiert). Man hat diese in seiner Mail-History und eine abgelaufene Session innerhalb eines Login-Bereiches führt nicht dazu, dass eine lange Kontaktabfrage einfach mal so verloren geht.
Ja, es gibt Bereiche wo es notwendig ist. Wo es aber nicht sein muss, gebt dem Nutzer zumindest die Wahl.
Amen.

Backup

Vor kurzem hatte ich von den tollen Möglichkeiten von wget berichtet. Mittlerweile läuft mein Backup und für alle interessierten will ich noch meine Lösung in den Blog stellen.
Wer Wunder oder fantastische Shell-Skripting-Lösungen erwartet ist sicherlich falsch, aber es geht ja auch nur um Backups.
Ziel war das Backup von Webspace, bei dem nur FTP zur Verfügung steht. Zusätzlich habe ich mir noch lokal MySQL installiert und kann nun auch die Datenbanken entfernt sichern. Einfacher als lokale Perl oder sonstige Skripte (meiner Meinung nach).

Erst einmal das Skript:

#!/bin/bash
cat sites.lst | while read line; do 
        if [ '#' != `echo $line | cut -c 1,1` ]; then
                echo $line
                wget -mirror -X=log,logs,usage,cgi-bin ftp://"$line" -P page 
        fi
done

cat db.lst | while read line; do
        if [ '#' != `echo $line | cut -c 1,1` ]; then
                hostname=`echo $line | cut -d: -f1`
                user=`echo $line | cut -d: -f2`
                password=`echo $line | cut -d: -f3`
                db=`echo $line | cut -d: -f4`
                filename=`echo $line | cut -d: -f5`
                mysqldump -h $hostname -u$user -p$password $db > 
                    database/$hostname-$filename.sql
        fi
done

Als Input dienen zwei Dateien (sites.lst und db.lst), die folgendes Format haben.

sites.lst

USERNAME:PASSWORD@HOSTNAME

db.lst

HOSTNAME:USERNAME:PASSWORD:DATABASE:FILE_DESCRIPTION

Wer es hilfreich findet, kann gerne einen Kommentar hinterlassen. Würde mich freuen zu hören, ob noch jemand diese Art der Lösung mag.

Automatisiertes Webspace Backup

Wer kennt es nicht? Man hat eine Webseite und sollte regelmäßig Backups davon machen. Bisher hatte ich einen vollen Webserver mit SSH Zugang und Cronjobs, wobei ich den Großteil der Arbeit auf dem Server erledigen konnte. Aufgrund meiner Verkleinerung benötige ich diesen nicht mehr und habe jetzt normalen Webspace. Mit diesem bin ich sehr zufrieden, allerdings werden seitens des Hosters nur Notfall-Backups gezogen, an die man nicht herankommt und die auch nicht 100%ig aktuell sein müssen.

Also muss das Backup von zuhause aus erfolgen. Zwar läuft noch mein Linux-Router, aber weder NcFTP noch WGet sind so aktuell, dass sie meine Wünsche erfüllen. Also mal unter Windows Cygwin aktualisiert und geschaut was möglich ist. Zuvor hatte ich nach Programmen gesucht, aber nichts davon hat mich wirklich überzeugt.

Um es nicht allzu lang zu fassen: ich liebe WGet. So schön einfach, so schnell, so ohne Overhead. Wie lade ich zum Beispiel regelmäßig alle Dateien eines Verzeichnisses möglichst effizient herunter?

wget –mirror ftp://USER:PASS@url.de

Ist das nicht großartig? Rekursiv, Datumsvergleich, FTP, … Jetzt fehlt nur noch ein Dump der MySQL-Datenbanken und ein Packen der letzten Versionen, um zumindest für einige Tage und im monatlichen Abstand Versionen nachhalten zu können.

Noch in ein Skript gießen, um alle Accounts abzugrasen und fertig. Kompliziertes kann so einfach werden.

JUG-Cologne: IntelliJ + Teamcity

Gestern Abend fand im Rahmen der JUG-Cologne-Veranstaltungen eine Art Power-Workshop zu IntelliJ und Teamcity statt. Tools mit denen man erfolgreich mehrere Stunden am Tag arbeitet schließt man besonders ins Herz. Dazu zählt in meinem Fall die IDE IntelliJ mit der ich Java, HTML, XML, Javascript, Groovy, Grails, Flex, … … quasi alles bearbeite. Der Workshop wurde von Vaclav Pech gehalten und zeigte, wie produktiv man mit der IDE arbeiten kann. Auch als erfahrener Nutzer konnte man doch wieder neue Tipps mit auf den Weg nehmen, weswegen ich den guten Vortrag genießen konnte. Die Veranstaltung fand im Café Teba statt, welches aufgrund seiner multikulturellen Atmosphäre ein ganz besonderes Ambiente gab.

Nach der IntelliJ-Präsentation, welche in dauerhafter Diskussion und Erklärung mit den Zuhörern stand, ging es dann zu Teamcity über, welches der Continuous Integration Server von Jetbrains ist. Wir nutzen ihn bei uns im Team, wo er Cruisecontrol abgelöst hat. Das Zusammenspiel von IntelliJ und Teamcity ist vorbildlich und die Konfiguration des CI-Servers sehr einfach. Interessantes Feature sind die Build-Agents, welche die Build auf ein Grid von verschiedensten Rechnern verteilen. So können mehrere Builds parallel abgearbeitet werden oder in unserem Fall verschiedene Szenarien (Datenbank, OS, Browser, …) bedient werden. Über einen Build-Agent starten wir zum Beispiel Frontend-Tests in verschiedenen Browsern mit Selenium.

Der Teamcity-Vortrag brachte für mich nicht sehr viel neues, wobei ich das Feature des Remote-Build noch nicht genutzt hatte. Damit werden eigene Änderung erst in die Versionsverwaltung übernommen, wenn diese erfolgreich die Builds bestanden haben. Dies verhindert, dass andere Arbeitskollegen nach einem fehlerhaften Check-In nicht mehr bauen können. Von Vaclav sehr gut mit 5 o’clock check-in beschrieben.

Nach den Vorträgen gab es dann noch die Verlosung einer IntelliJ-Lizenz. Und kaum zu glauben, ich habe gewonnen. Für mich also noch mehr Motivation mich in die Features und Möglichkeiten von IntelliJ IDEA einzuarbeiten. Hat mich auf jeden Fall sehr gefreut.

Aufgrund der netten Atmosphäre löste sich der Kreis der Zuhörer nach dem Vortrag nicht auf, sondern es ergab sich eine gemütliche Runde, die sich zum Kennenlernen eignete und offen gebliebene Fragen aus den Vorträgen beantwortete.

Im weiteren Verlauf gab es dann noch einen wunderschöne Bauchtanz-Performance, die eine tolle Stimmung im mittlerweile voll gefüllten Café Teba auslöste. So zogen wir auch nicht mehr weiter, sondern blieben bis zum Ende der Location treu. Zum Glück erwischte ich am Hansaring noch den letzten Bus, mit dem ich erschlöpft nach Hause kam.

Fazit: Ein wirklich gelungener Abend, der auch den JetBrains-Leuten gefallen haben sollte.

JUG-Cologne: heute Terracotta

Bei schwül warmen Wetter habe ich pünktlich den Vortrag von Jonas Bonér zum Thema Terracotta erreicht.

Zum Vortrag:
Der Vortrag war gut. Zwar eine typische Powerpoint-Präsentation, die aber nicht abgelesen werden brauchte. Jonas erzählte angenehm viel um die Punkte herum und man konnte dem Vortrag gut folgen. Zwar kein Presentation-Zen, aber angenehm.

Zu Terracotta:
Wie die meisten wohl wissen, bin ich Frontender. Zwar Java-lastig, aber bisher nie in der Situation gewesen, selber einen Cluster aufzusetzen. Das genau ist die Aufgabe von Terracotta. Einen Cluster aufzusetzen, ohne auf API-Level arbeiten zu müssen. Vorraussetzung ist Multi-Threading-Code, der dann von Terracotta genommen wird und auf einen Cluster aufgeteilt wird. Somit hat man ein Network-Attached-Memory, welches von allen Server-Knoten geteilt wird. Fällt ein Knoten aus, so kann ein anderer die Arbeit übernehmen. Das ganze passiert auf JVM-Ebene, sodass der eigentliche Code nicht davon beeinflusst wird. Die Verwaltung übernimmt dabei der Terracotta-Server, der mindestens auf zwei Server aufgeteilt sein sollte (Single-Point-of-Failure vermeiden). Diese Server managen dann die Verteilung des Memories über alle Knoten. Dabei können zwei Terracotta-Server schon einige Knoten verwalten. Die Rede war von bis zu 100 Knoten bei nur zwei Terracotta-Servern. Die Konfiguration kann für die eigene Anwendung vorgenommen werden, existiert aber bereits für viele Frameworks und Server. Neben Hibernate, Spring, Struts, Tomcat, JBoss, … waren viele weitere dabei. Zu Terracotta gehört auch eine Admin-Konsole, in der man den Status des Clusters sehr schön betrachten kann. Vorteile sieht Terracotta selber in der Geschwindigkeit seiner Cluster-Lösung, die besser funktionieren soll, als hausgemachte von z.B. Applikationsservern. Terracotta ist sein 1,5 Jahren OpenSource, wobei ein Copyright-Vermerk „Powered by Terracotta“ zur Lizenz gehört.
Sicher ein interessantes Thema, da man mit Amazon in Kürze große Servermengen hochziehen kann.

CMS Entscheidungen

Da ist sie wieder: Die Qual der Wahl.

Eine bestehende Webseite soll ohne HTML Kenntnisse gepflegt werden. Bisher liegt das CMS phpCMS darunter, mit dem ich zu Beginn meiner CMS Karriere gute Erfahrungen gemacht habe. Für einen Admin ein Traum. Nah am Code, sehr schnell XHTML nach seinen Vorstellungen gestalten, einfach unkompliziert. Leider für Nicht-Admins auch kaum zu bedienen. Vorallem wenn es in Erweiterungen, wie Gästebücher, Galerien, Termine, … geht.

Der nächste Schritt war die Webseite des Gymnasiums auf Mambo/Joomla. Nie habe ich eine Entscheidung so bitter bereut. Ja, es wird überall gelobt, räumt Preise ab und sieht im Admin-Bereich nett aus. Aber hat mal wirklich jemand eine echte Seite damit aufgesetzt? Fertige Codeblöcke für Menüs, hunderte CSS-Klassen im Content-Bereich, die verbogen werden müssen, … Für eine Webseite, die eine Webseite sein soll, ok. Aber seinen HTML/CSS Entwurf mal eben in ein Template packen? Kannste vergessen. Ich habe auch bei keinem anderen System so oft am Core nach einem Update patchen müssen. Da war jedes Update erst einmal eine Suche durch die Foren. Ok, etwas übertrieben, aber Joomla und Ich, das wird keine Freundschaft mehr. Vielzusehr schein als sein und eine Roadmap, die gut klingt, aber nie eingehalten wurde.

Dann war da noch Typo3. Jeder warnt davor, weil die Administration verdammt aufwendig ist. Ja, sie ist es. Typoscript sei verdammt, aber das System ist einfach mächtig. Spaß macht es meist nicht wirklich, aber es kann einfach Kundenwünsche umsetzen und ist von der Codebasis sehr stabil. Bekommt man es bezahlt, ist Typo3 immer noch die Wahl für eine Webseite, deren genauer Umfang noch nicht feststeht.

Kunde:

  • Oh ja, ich will mehrere Loginbereiche, deren User sich aber ausschließen
  • Können wir nicht die linke Spalte mit Teasern füllen, die auf jeder Seite eingebunden werden
  • Meine Webseite hat aber 5 Navigationsebenen in der Tiefe
  • Achja, das Hauptbild sollte für jede Kategorie unterschiedlich sein und einen gerenderten Titel haben
Bei Typo3 treiben die meisten Wünsche keine Schweißperlen auf die Stirn, sondern man weiß, dass man mit etwas Suche zum Ziel kommt. Schade nur, wenn die Webseite nur aus 10 einfachen Seiten besteht und sich in Zukunft daran auch nichts ändern wird. Dann war der ganze Krampf vielzuviel Overhead. Meine Entscheidungen für Typo3 habe ich zumindest nicht bereut.
Und jetzt eine private Webseite, ohne Lohn (aber mit viel Dank). Die sollte zumindest Spaß machen. Leider bin ich seit bald zwei Jahren aus der aktiven Zeit der CMS-Untersuchungen heraus. Viel getan hat sich aber scheinbar nicht, zumindest sind die großen Namen groß geblieben und die kleinen Namen klein. Als Plattform dient der berühmte LAMP, auch wenn eine Webseite auf Java-Basis schon seinen Reiz hätte. Aber die Pflege über die nächsten Jahre klebt auch an mir. Also ein CMS in der Größe von Typo3 mal eben zum Spaß mit all seinen Problemen, Sicherheitslücken und Updates über die Jahre betreuen, nein danke.
Etwas leichtgewichtiges muss her, welches folgende Anforderungen erfüllt:
  • Texte (mit WYSIWYG)
  • News (mit WYSIWYG)
  • Galerie (sehr einfach zu pflegen, am besten mit automatischer Skalierung der Größe)
  • Gästebuch
  • Forum (vermutlich nicht in die Seite eingebunden)
Klar, kann man mit mehr Plugins hantieren, aber mehr Plugins bedeuten immer mehr Arbeit in Einrichtung, Konfiguration und Pflege. Somit fällt eine Suche, ein Kontaktformular, Login-Bereiche, … schon mal raus aus dem Konzept.
Über folgende Systeme mache ich mir im Moment Gedanken:
  • WordPress, weil es einfach leichtgewichtig ist und ich es selber einsetze. Leider fehlen ein paar CMS Funktionen, wie vernünftige Menüs und mehr. Achja, WordPress-Templates stinken. Zumindest habe ich noch keins im Code gesehen, welches wie ein Template aussah. PHP wollte ich so direkt dann doch nicht sehen.
  • CMS Made Simple, sieht zumindest auf den ersten Blick ganz gut aus. Schön nur, dass deren Seite wegen MySQL-Fehlern kurz down war.
  • Drupal, hm naja
  • Contenido, hm naja
Bei Ideen und Erfahrungen gerne einen Kommentar zum Austausch hinterlassen.

Typing

Man sitzt den ganzen Tag vor dem PC und was macht man: tippen, tippen, tippen. Wer hinterfragt sich aber nach einiger Zeit noch, ob das effizient ist, was man dort in die Tasten haut. Ich habe mir irgendwann (noch zu AOL-Zeiten) mal eine CD mit zum 10-Finger-System geholt und mich bei meinen damaligen Chat-Orgien gezwungen auch das 10-Finger-System anzuwenden. Wie sich herausstellte eine sehr gute Entscheidung, denn es hat meine Geschwindigkeit sehr positiv beeinflusst. Ein Schritt, dem man jedem einfach nur raten kann. Nach ein paar Jahren fragt man sich aber dann, ob man sein Tippen nicht optimieren kann. Klar kann man, aber dröge JJJJjjjjKKKKkkkkk abtippen ist nicht wirklich das, was wirklich Spaß macht. Bei mir habe ich gemerkt, dass gezieltes sehr schnelles Tippen hilft, auch die Grundgeschwindigkeit zu erhöhen. Natürlich ist die Fehlerquote bei dem schnellen Schreiben höher, aber man übt gezielt und das hilft die Technik zu verbessern.

Damit das Spaß macht kann ich folgende Javascript-Webanwendungen empfehlen:

  • Speedtest von schnell-schreiben.de (Einfach und gut)
  • Typeracer (im Rennen gegen andere Tipper. Allerdings auf Englisch, was es schwieriger macht, aber somit auch wieder das Schreiben von englischen Texten verbessert)

Im Moment lese ich mich in den Fachbereichs des Trainings für meinen geplanten Marathon ein. Ich frage mich, ob man das auch auf das Tippen übertragen kann. Intervalltippen, Tippen mit Pulssensor, Bergtraining mit extra schweren Tasten, Aufwärmübungen, Stretching, … sollte unbedingt wissenschaftlich untersucht werden. Falls es noch weitere Trainingsmethoden geben, so können diese gerne in den Kommentaren hinterlassen werden.

This is what you need for speed

Schon lange ist es her, dass ich einen Webbrowser als schnell bezeichnet habe. Man versucht mit allen Möglichkeiten Webseiten zu beschleunigen. Dies fängt bei purem XHTML an, geht über intelligent beschnitte Grafiken und Komprimierung. Man treibt sehr viel Aufwand und dann kommt ein neuer Browser und überrascht. Der Safari Browser von Apple rast durch das Netz. Und das schöner als jemals zuvor.

Der Internet Explorer ist als Volksbrowser unterwegs, der wie ein Kombi unnötig viel Balast mit sich rumschleppt, aber für die meisten Personen vollkommen ausreichend ist. Der Firefox zählt zu den aufstrebenden Browsern wie ein Mini Cooper, der verdammt cool ist, mit aller Sonderausstattung aber schon wieder fast auf dem Niveau eines Kombis liegt. Klar ist er besser als der Internet Explorer, aber der Unterschied ist für den normalen Surfer nicht sehr groß (*naja, stellt halt Webseiten dar*). Und dann kommt er um die Ecke. Lange als Prototyp weiterentwickelt, um jetzt den nächsten Clou von Apple zu starten. Kein Browser ist so schnell, leichtgewichtig (im Design wie auch gefühlt) und stellt trotz seines vollständig eigenständigen Motors (Webkit) ein echtes Auto dar. Vielleicht der Mercedes SLR unter den Browsern, da Ferrari in der WM bisher nicht so gut wegkommt.

Trotz des Lobes muss man mal sehen, was der Browser im Alltag wirklich leistet. Meine eigene Seite landet leider bei voller Prozessorauslastung, wobei ich hoffe, dass dies ein Einzelfall ist. Ansonsten wurde auch an die Entwickler gedacht und in den Einstellungen kann ein Developer-Menüeintrag hinzugefügt werden. Darüber kann man schon ohne Plugins eine Menge über die aktuelle Seite erfahren.

Ein Debugger ist im Nightly-Build von Webkit auch vorhanden, dieser streckte allerdings bei unserer Ajax-Applikation die Flossen von sich. Schade eigentlich, denn es wird noch eine richtig gute Alternative zum Firebug benötigt. Man kann nur sagen: weiter so, dann kann man recht schnell Marktanteile erobern.

Mehr zum Safari unter:

http://www.apple.com/de/safari

Router oder Intranet-Server

Nachdem ich mir vor drei Monaten einen WLAN-Router Asus WL-500GP geholt hatte, waren die ersten Schritte schwer, aber dann doch erfolgreich. Allerdings stellten sich Probleme mit dem WLAN ein, weswegen ich meinen alten Router doch parallel betreiben musste. Leider hatte der alte Router keine Möglichkeit diesen in den Bridge-Modus zu schalten, weswegen nun zwei Router im Netzwerk konkurierten, was von der Konfiguration her, nicht sehr gut war. Somit startete ich einen neuen Anlauf, um das lokale Netzwerk stabiler zu bekommen und auch alle Geräte entsprechend einzubinden.
Leider blieb das WLAN entsprechend instabil, weswegen ich den bewährten alten Router für diese Funktion einsetze. Da der Asus einen Bridge-Modus hat, vertauschte ich die Reihenfolge der Router am Modem, wodurch der MSI RG54GS2 Einwahl, WLAN, Routing und DHCP übernimmt. Der Asus dient somit nur noch als NAS, an das eine USB-Platte angeschlossen ist. Dabei ist nur noch der falsche Begriff, denn dank Linux als Betriebssystem, erfüllt der zweite Router als NAS folgende Dienste SSH, FTP, Samba, iTunes-Server, Subversion und Webserver.
Dank des zweiten Konfigurationsanlaufs ist der Router wesentlich besser aufgesetzt und auch Samba ist nach anfänglichen Problemen für die Rechner im Netzwerk sauber aufgesetzt. Falls jetzt noch das WLAN zu stabilisieren wäre, könnte ich vollständig auf den weiteren Router verzichten. Ansonsten ist die Lösung immer noch besser, als ein voller Rechner, der 24h am Tag läuft und Lärm verursacht.