dWing — die Welt ist nicht gerecht

sign in

Tagesrückblick 2010-08-11

Ich habe gestern den ganzen Tag mit node.js und MongoDB herum gespielt. Leider gibt es keine Standardbibliothek für MongoDB unter node. Es gibt einige Projekte, die leider sehr unterschiedliche APIs haben, manche basieren nur auf Node, für andere muss man selbst ein C++ Modul übersetzen.

Das aktivste Projekt scheint node-mongodb-native zu sein, auf das man zusätzlich Mongoose aufsetzen kann, was einerseits die asynchrone auf Callbacks basierte Natur der API versteckt und außerdem eine super Schnittstelle zur Modellierung bietet.

Das große Problem dabei ist, dass die Bibliothek über einen Socket mit MongoDB kommuniziert und dabei BSON (Binäres JSON) benutzt wird. Dieses muss leider im Treiber geparst werden, was sehr langsam ist. Die Leistung bricht sauber ein und der node Prozess ist völlig ausgelastet, der Mongo Server stattdessen wird absolut nicht ausgelastet.

Zum Glück arbeitet der Entwickler des Treibers daran das BSON parsing in nativen Code auszulagern. Dann muss ich zwar trotzdem mich mit dem Übersetzen des Codes herumschlagen aber ich hoffe das es damit dann schnell gehen wird.


Auch an einer anderen Stelle ist mir das schlechte Packetmanagement aufgefallen. Es gibt die Möglichkeit die Ausgabe mit gzip zu komprimieren. Dazu kann das compress Modul verwendet werden. Naja, nun gibt es aber mehrere compress Module die den selben Namen tragen aber eine völlig unterschiedliche API zur Verfügung stellen. Sehr verwirrend. Aktuell wird ein Fallback verwendet der in einem Kind Prozess das gzip Programm ausführt. Funktioniert, ist aber sicherlich weniger performant als ein direkt auf die gzip Bibliothek zugreifendes Modul. Aber dann gibt es wieder das Problem dass man den Code in C selbst übersetzen muss.


Alles in allem scheint mir node.js bisher eine Art Spielwiese zu sein die noch stabilisiert werden muss, vor allem benötigt es eine offizielle Modulbörse wo der Umgang mit Modulen in C und die große Duplizierung die es aktuell gibt gelöst werden muss. Im Prinzip ist node bisher eh noch keine stabile (Version 1.0) Software, also kann man diese Probleme noch verkraften. Für Datenbankschnittstellen fehlt es auch an offiziell abgesegneten Modulen. Möglicherweise könnte man die Schuld aber den MongoDB Entwicklern in die Schuhe schieben, die eine Offizielle Schnittstelle für CommonJS pflegen sollen. Ich frage mich aber wie man implementierungsübergreifende native Module anbieten will. Schließlich gibt es mehrere Implementierungen für CommonJS, nodejs ist nur eine davon. Es gibt also noch viele Probleme zu lösen in der CommonJS Welt.

Namen ändern

Nun habe ich endlich eine lange überfällige Funktion in dWing eingebaut. Es ist nun möglich seinen Namen zu ändern. Vor allem für die ganzen Google und Yahoo Nutzer ist dies sehr gut, denn diese Dienste unterstützen nicht den Austausch von Nutzerdaten wie Name bei der Anmeldung.

Diesbezüglich habe ich auch probiert von der veralteten OpenID Simple Registration Erweiterung auf Attribute Exchange umzusteigen, nur um festzustellen, das keiner der Provider, nicht einmal MyOpenID diese Erweiterung unterstützen. Oder aber ich habe etwas falsch gemacht, kann natürlich auch sein.

Für OpenID habe ich auch ein sehr interessantes Widget gefunden, das es sicherlich wert ist ausprobiert zu werden.


Als ich also gestern mal wieder an dWing gearbeitet habe ist mir aufgefallen wie unbequem es doch ist damit zu arbeiten, und das es vielleicht viel besser wäre wieder einmal von null anzufangen. Möglicherweise sogar mit einem ganz anderen Technologiestapel als den altbekannten PHP und MySQL.

Ich habe also intensiv in die Richtung serverseitiges Javascript und NoSQL Datenbanken recherchiert. Node.JS und ExpressJS scheinen sehr interessante Lösungen zu sein. Zusammen mit einer Template Sprache wie Embedded JS, die ich in einer abgespeckten Version schon ein paar mal eingesetzt habe bietet dies sicher eine gute Kombination. Mit serverseitigen JS und Templates die am Server und am Client gleich sind kann man sicherlich schneller zu einem konsistenteren Ergebnis kommen.

Node basiert auf der V8 Engine aus Chrome, ich weiß also nicht genau wie viele der erweiterten Funktionen von Spidermonkey wie beispielsweise Array Comprehension oder Generators es unterstützt. Als Mozilla Entwickler würde es mich auch sehr interessieren, wie sich Jägermonkey in so einem Einsatzgebiet schlagen würde. Bisher ist allerdings ExpressJS sehr schnell. Mit keepalive Anfragen ergibt es über 5000 Anfragen die Sekunde für ein Hallo Welt Skript. PHP kommt auf vielleicht 2000. Hinter einem Lighttpd Proxy ohne keepalive kommt es immerhin noch auf etwas über 2000, also in etwa PHP Niveau. Ich denke aber, dass sich mit der Performance mehr ausgeht, denn die JS Engines haben bessere JIT Compiler und deren Performance wird auch ständig weiter verfeinert.

Wenn man eine andere Syntax mag kann man auch CoffeeScript benutzen. Dies ist eine etwas einfachere Syntax, die zu JS compiliert wird und ebenfalls Funktionen wie Array Comprehension unterstützt.

Als Datenbanklösung könnte sich MongoDB anbieten. Eine Dokumenten- und JSON-basierte Datenbanklösung wäre sicherlich sehr interessant auszuprobieren. Allerdings schweben mir einige Dinge vor von denen ich keine Ahnung habe wie diese damit zu lösen wären.

Für die Arbeit mit CSS finde ich Sass sehr interessant, macht die Arbeit in manchen Situationen sicherlich einfacher. Haml ist auch eine interessante Möglichkeit für Templates, allerdings gefällt mir die Syntax nicht ganz so sehr, und meine sehr alten Erfahrungen mit Smarty haben bewiesen, das es doch sehr viel sinnvoller ist eine echte Programmiersprache in den Templates zu haben.


Alles in allem sehr interessante Projekte die ich gerne mal ausprobieren würde, möglicherweise zuerst in TinderboxPushlog bevor ich mich daran wage aus meinem PHP dWing ein JS dWing zu machen.

Spielen unter Linux

Ich habe mir vor drei Wochen das Humble Indie Bundle gekauft. Ich finde die Idee toll und alle Spiele funktionieren auch unter Linux. Nachdem ich nun drei der Spiele ausprobiert habe sind mir einige Sachen zum Thema Spielen unter Linux aufgefallen. An sich funktionierte bis auf eine Kleinigkeit das ganze super.

Was gleich zu Anfang auffällt ist die Installation. Jedes Spiel ist dort anders. Entweder es wird ein Paket für den Paketmanager bereitgestellt, oder aber ein eigener Installer, oder ein einfaches Archiv zum selbst entpacken. Die Deinstallation ist im ersten sowie im letzten Fall einfach. Das Spiel mithilfe des Paketmanagers löschen oder einfach den aus dem Archiv entpackten Ordner. Beim zweiten Fall ist es komplexer. Das Spiel wird in einen Ordner installiert den man löschen muss, allerdings weiß ich nicht wo die Verknüpfung im Startmenü liegt. Zu diesem Thema braucht es noch etwas Arbeit unter Linux, um den Installations- und Deinstallationsprozess besser zu gestalten.

Ein weiteres Problem was mir aufgefallen ist, dass das Spiel die absolute Kontrolle über die Eingabemedien an sich reißt. Tastatur und Mauseingaben werden nicht an den Fenstermanager durchgereicht. Somit gibt es keinerlei Möglichkeit aus dem Spiel rauszutabben. Bei Penumbra Overture, das recht viel zu Lesen mitbringt hat sich nach fünf Minuten Untätigkeit der Bildschirmschoner aktiviert. Danach war das Spiel in den Fenstermodus gewechselt, allerdings hat weder das Spiel, noch der Fenstermanager auf Eingaben reagiert. Ich musste in eine Systemkonsole wechseln und meine gesamte Desktopumgebung neu starten. Dies ist absolut nicht hinnehmbar. Raustabben ist für mich ein absolutes Kriterium wenn es um Spiele geht, hier hat Linux noch gewaltig nachzubessern.

Noch eine Kleinigkeit die mir aufgefallen ist, dass Benachrichtigungskästchen, wie bei neuen Jabber Nachrichten, im Spiel zu sehen sind. Dies hat keinerlei Leistungseinbußen zu folge, es stört einfach nur.

Fazit: Spielen unter Linux hat noch einiges aufzuholen im Vergleich zu Windows.

Wochenrückblick 2010-05-08

Mein erstes (bzw eigentlich zweites) Mobiltelefon ist das größte was man überhaupt kriegen kann: Das N900. Eigentlich mehr ein Internet Tablet. Das N900 läuft mit Maemo Linux und bietet daher nahezu unbegrenzte Möglichkeiten. Es wäre mir auch möglich recht einfach Debian zu installieren oder andere Werkzeuge die es möglich machen WLAN Netzwerke zu knacken.

Im Prinzip hatte ich die Wahl zwischen dem extrem geschlossenen iPhone, dem auf Java basierenden Android, Windows Mobile und Symbian. Bei der Auswahl fiel die Entscheidung für das N900 nicht schwer.

Und ich habe bereits Erfolge damit zu vermelden die ich auf anderen Plattformen möglicherweise nicht erreicht hätte. Ich habe es nach langem hin und her geschafft über das extrem restriktive FH WLAN einen OpenVPN Tunnel aufzubauen um dadurch Dienste wie SIP, und IM auf dem N900 und IRC auf meinem Laptop zum Laufen zu kriegen.


Dabei gab es folgende Probleme zu lösen, die ich kurz darstellen will. Erstens erlaubt das FH Netzwerk generell keine ausgehenden UDP Verbindungen, die OpenVPN standardmäßig verwendet. Also musste eine TCP Verbindung her. Und das am besten auch über einen wohlbekannten Port. Da ich auf meinem Server kein FTP Verwende, habe ich den 20-er TCP Port für VPN verwendet. Verbindungsaufbau funktioniert, sonst nichts. Nach wirklich langer rumprobiererei ist mir dann das Problem aufgefallen. Der von der FH Verwendete DNS Server ist in einem anderen Subnetz als der Laptop im WLAN. Dies bedeutet, dass die Verbindung zum DNS Server auch über den VPN getunnelt wird, vergeblich, denn die Interne IP ist über den Tunnel logischerweise nicht verfügbar. Dies zu beheben war kein großes Problem. In den Einstellungen des VPN Servers wurde eingestellt, dass es die IP eines erreichbaren DNS Servers beim Verbindungsaufbau an den Client überträgt.

Funktioniert am Laptop wunderbar, am N900 nicht. Das N900 hat einen integrierten DNS Server. Dieser muss über ein up/down Skript in der VPN Client Konfiguration ausgeschaltet und gegen den über den Tunnel bezogenen DNS Server ausgetauscht werden.

Nun konnte ich also in einem fremden Land, in einem restriktiven WLAN über meinen Tunnel Festnetzgespräche über meine deutsche Festnetznummer führen. Ziel erreicht. Über welches andere Mobiltelefon Betriebssystem ist so etwas noch möglich?


Ansonsten läuft es mit meiner Bachelorarbeit gut, ich werde noch letzte Korrekturen anbringen und diese am Dienstag fix abschicken, danach wartet ein langer Urlaub in Siebenbürgen auf mich.


Im Juli werde ich außerdem nach Kanada fliegen auf den Mozilla Summit. Anschließend werde ich einige Wochen Kanada erkunden. Wenn ich eh schon da bin bietet sich das an.

Wochenrückblick 2010-04-09

Ich habe am Wochenende meinen Laptop auf die aktuelle Lucid Beta aktualisiert. Verlief fast reibungslos. Nun startet er rund 20 Sekunden schneller, siehe Bootchart. Dennoch ist in der Disziplin noch viel zu machen.

Ich habe mich auch für das diesjährige Google Summer of Code beworben. Ich würde gerne einen Cairo State Tracker für Gallium3D schreiben. Damit werden Cairo Befehle direkt auf Gallium3D Shader umgeschrieben, die dann im weiteren Schritt vom Hardware Backend auf der Hardware ausgeführt werden. Ist extrem kompliziert und herausfordernd. Ich hoffe ich packe es ;)

Bachelorarbeit und Praktikumsbericht gehen gut voran.


older posts