moeffju.net

Fighting frameworks

Rant time!

So, back when I was still doing PHP, the story went like this: “We have this kinda okay framework which is documented okay and there are almost no plugins or contributions, so you’re on your own, and if things don’t work, well, you’re screwed, enjoy digging in the depths of the ‘magic’ code.” As soon as you try to do something the framework creators haven’t thought of, it’s like clubbing wild bears to death with only your bare hands and small sticks, in the mud, while torrential rain is falling on you and the air reeks of sulphur. Boy, am I glad I’m done with PHP.

With Rails, it’s different: “We have this super awesome framework which is pretty well documented [ed: in blog posts], oh, except, the new version [ed: rails 3] isn’t, and we have a gazillion of plugins and stuff, but they’re mostly not documented at all, so you’re best off reading the source, and the plugins might or might not work with your version of rails, or they might eat your soul.” You still end up fighting the framework and the plugins, but at least you’re doing it with rapiers. It’s a very civilized form of combat.

(A vaguely related side note, it’s a damn shame how much Yahoo! sucks. They had this great search engine, owned the market, and then they got the idea that they were a ‘media company’ with ‘producers’ managing ‘properties’ and they turned the suck up to eleven. Nowadays, they have a great bunch of very bright people, yet still manage to turn out mostly products that suck. It is quite astonishing. Also, what is it with them launching products and then just discontinuing them a few months later? Are they trying to be like Google?)

Motorola Milestone / Droid and 802.11n Access Points

At UX Camp Europe 2010, my Motorola Milestone could not connect to the barcamp wifi, a WPA2/PSK WLAN running on a mesh of Enterasys APs. The phone would not even manage to associate to the AP, the debug log (adb logcat) showing the following:

E/wpa_supplicant( 3892): ERROR - \
    wpa_driver_tista_private_send - error sending \
    Wext private IOCTL to STA driver \
    (ioctl_cmd = 8021501,  res = -1, errno = 95)
E/wpa_supplicant( 3892): ERROR - Failed to do tista scan!
W/wpa_supplicant( 3892): Failed to initiate AP scan.

So there was never a visible attempt at connecting in the UI.

After a lot of searching, reading source, asking around and debugging, I managed to solve my problem by modifying the configuration of the WLAN driver module (tiwlan.ini) as follows (requires the Android SDK / adb and root access on your phone, or a adb-root recovery partition):

No warranty if you brick your phone, if you don’t feel confident doing this, have someone with Android expertise do it for you or wait for a fix from Motorola. Or try disabling 802.11n (draft-n) in your AP if you can control it.

  1. Connect your phone via USB, make sure you enable USB debugging in Settings > Applications > Development.
  2. Get the configuration file from your phone:

    adb pull /system/etc/wifi/tiwlan.ini tiwlan.ini

  3. Change HT_Enable=1 to HT_Enable=0 in the file.

    sed -i -e s/HT_Enable=1/HT_Enable=0/ tiwlan.ini

  4. Push the changed file back onto your phone (you can’t directly overwrite the file in /system/etc/wifi/ because adb is not running as root on the phone):

    adb push tiwlan.ini /tmp/tiwlan.ini

  5. Start an adb shell on your phone, get root, make /system writable and move the file to the right location:

    adb shell
    su
    mount -o remount,rw -t yaffs2 /dev/block/mtdblock6 /system
    cp -f /tmp/tiwlan.ini /system/etc/wifi/

  6. Reboot your phone

    reboot

Your phone should now be able to associate with the AP.

People have reported similar problems with APs by other manufacturers (Enterasys, D-Link, some old Linksys WRT), so this might work for you.

Rewriting Favcharts - Part 1

Um in Form zu bleiben, widme ich möglichst jeden Tag 30-90 Minuten Nebenprojekten.

Diese Woche baue ich die favcharts neu. Die momentante Implementation der favcharts ist ein Haufen von “Hacks upon hacks”, weil die Charts aus einem Satz hastig programmierter Scripte und viel Zeitdruck entstanden sind. Es funktioniert irgendwie, aber so richtig super ist es nicht. Ein Rewrite ist schon seit einiger Zeit überfällig, jetzt ist es soweit.

Kurz zu den aktuellen favcharts: Der Code ist in PHP geschrieben, die Daten liegen in MySQL, klassischer LAMP-Stack also. Ein Crawler durchforstet regelmäßig die Favorites aller bekannten Nutzer und packt diese Daten in die Datenbank. Das Webfrontend liest aus der DB, macht Auswertungen, und speichert die Resultate dann zwischen, je nach Ansicht (täglich, monatlich, User-spezifisch, etc.) für ein paar Stunden bis mehrere Monate. Beim nächsten Zugriff wird dann nur der Cache gelesen, die Datenbank muss also nicht nochmal ran.

Soweit die Theorie. In der Praxis treten jedoch gehäuft Probleme auf: Viele Requests treffen den Cache gar nicht, weil z.B. jeder seine eigenen Charts abruft, und der User Cache dann irgendwann voll läuft und verdrängt wird. Oder es kommen Suchmaschinencrawler und fragen uralte Charts ab. Außerdem bieten die favcharts relativ viele Ansichten (verschiedene Zeiträume, verschiedene Gewichtungen, etc.), so dass die Anzahl der Cache-Einträge schnell hoch wird. Die Requests, die nicht vom Cache abgehandelt werden können, tun dann richtig weh: Je nach Scoring-Methode muss über riesige Datenmengen berechnet werden. Das kostet Zeit und I/O. Für die gewichtete Bewertung muss sogar das ganze Resultset zweimal durchlaufen werden. Dank mod_php wird dann für geraume Zeit ein Apache-Prozess blockiert und schluckt mehr und mehr Speicher und CPU, und der Rest der Apaches wird dadurch auch nicht schneller. In Stoßzeiten brauchen Requests so manchmal über zehn Sekunden. Der Crawlingprozess funktioniert dafür hervorragend - neue Favs sind oft schon nach wenigen Minuten erfasst. Das Datenbankzugriffsmuster ist allerdings eher ungesund: Gleichzeitig finden viele Writes (von den Crawlern) und viele lange Reads (vom Webfrontend) statt. Das führt zu Congestion, schlechten Indexen, und generell sehr unpraktischen Zugriffsmustern.

All das soll mit dem Rewrite besser werden. In den folgenden Posts beschreibe ich den Prozess des Rewrites, und mit welchen Ansätzen diese Probleme gelöst und in Zukunft verhindert werden sollen.

Und weil ich schon lange nichts mehr mit Ruby gemacht habe, und Rails nach wie vor “in” ist, wird die neue Version auf Ruby on Rails gebaut. Yee-haw.

Twitter-Status mit XING synchronisieren via Xwitter

Mit Xwitter kann man seinen Twitter-Status selektiv mit XING synchronisieren. Dazu muss man nur auf xwitter.de die Schritte durchlaufen und danach Tweets, die nach XING laufen sollen, mit ‘#xwitter’ taggen. Man benötigt dazu aber noch einen XING Premium-Account.

Interessant daran finde ich, dass sich bei XING endlich was zu bewegen scheint. Vor dem Hintergrund sinkender Neuanmeldungen und sinkender Premium-Mitgliedszahlen, außerdem dem sehr großen Momentum, das LinkedIn hat, ist XING nach Ansicht vieler meiner Bekannten jetzt im Zugzwang. Ein erster, zögerlicher Schritt war damals die Übernahme von SocialMedian durch XING und damit einhergehend die Öffnung für interne OpenSocial-Anwendungen. Den großen Schritt einer offenen API hat man sich aber noch nicht getraut, und mit SocialMedian/OpenSocial ist auch nicht all zu viel passiert - es geht schleppend langsam voran, gerade, wenn man das Innovationstempo im “umliegenden” Web sieht.

Um so erstaunlicher dann, dass Xwitter nur wenige Tage nach der Einführung eines ähnlichen Features beim großen Konkurrenten LinkedIn erscheint, noch viel erstaunlicher aber: bei Xwitter handelt es sich um ein halb-offizielles Projekt des VP Engineering Rails von XING, Andreas Gehret. Und er nutzt dazu eine inoffizielle API namens XWS, und bezeichnet es auf Xwitter öffentlich als ‘unfortunate’, dass diese inoffiziell sei.

Ich bin gespannt, was da noch kommt. Ich hoffe, dass XING nicht in einer knee-jerk reaction Xwitter offline nimmt und Andreas Gehret Ärger bekommt. Statt dessen sollte XING die Gelegenheit nutzen und die internen ‘Change Agents’ mal machen lassen: Einen Teil der API öffnen, OpenSocial für alle zulassen, und einige Features von Premium auf Basic-Mitgliedschaften übertragen. Ansonsten wird der mächtige Konkurrent LinkedIn (oder vielleicht sogar Facebook) in gar nicht allzuferner Zukunft XING verdrängen.

Verbesserungsvorschläge habe ich auch schon: 1. Scheint Xwitter momentan regelmäßig zu pollen, also alle registrierten Nutzer abzuklopfen. Das bedeutet, dass es immer eine Weile dauert, bis der Status übernommen wird, und dass man irgendwann in die Twitter-Limits reinläuft. Ich würde daher auf die Twitter Realtime-API umstellen, und nur bei Protected Accounts pollen; 2. würde ich den Hashtag kürzer machen; und 3. würde ich den Hashtag auf XING-Seite dann aus dem Tweet entfernen.

Update: Xwitter ist jetzt Teil der neuen XING Labs, womit die Datenschutzbedenken ausgeräumt sein sollten. Außerdem ist der Hashtag auf #xng verkürzt worden.

München!

FYI: Ich bin ab dem 16. November 2009 für eine Weile in München.

Where it's at

Ich gehe zum 1. September 2009 nach Berlin, um mich dort der Erforschung und Umsetzung neuer Lebens- und Arbeitsformen zu widmen. Schließlich sind immer noch viel zu viele Menschen da draußen überzeugt, dass die Gesellschaft sowie der Einzelne nur dann funktionieren, wenn jeder von morgens 9 bis nachmittags 5 an einem Schreibtisch sitzt und ein Telefon bewacht, und dass möglichst alle Menschen arbeiten sollen. Oder, dass Liebesbeziehungen oder Ehen nur von je einem Mann und einer Frau eingegangen und gelebt werden können. Außerdem will ich die politischen Aktivitäten fortführen, die wir im Rahmen der Netzsperren-Diskussion begonnen haben, denn wir brauchen dringend eine Lobby für diese “Internet-Generation”, “Generation C64”, oder wie auch immer man uns nennen will.

Falls jemand Wohnraum in Berlin hat, der eine der folgenden Anforderungssets erfüllt, bitte ich um kurze Nachricht:

  1. ~30m², Garten / Grünfläche / ruhige Lage (lies: draußenkatzengeeignet)
    oder
  2. >300m² (in Worten: Dreihundert), Garten / Terrasse / Dachterrasse, schnelles Internet, für WG/OpenSpace/Kommune-Dings.

Hamburg wird natürlich einen Platz in meinem Herzen bewahren und sicherlich häufig besucht werden. Vielleicht lege ich mir ja eine Black Mamba zu, dann wird ganz Deutschland regelmäßig bereist. Gepriesen sei das UMTS.

See you in Berlin!

Es klüngelt

Martin Dörmann, der für die SPD die Verhandlungen mit der CDU geführt hat, und uns, der “Netzgemeinde”, mehrfach versichert hat, unsere “Bedenken und Anregungen sehr ernst” zu nehmen, hat, so scheint es, statt dessen hintenrum mit der CDU geklüngelt, und man hat sich - undemokratisch, will sagen, “unbürokratisch” - geeinigt. Damit liegt es sehr nahe, dass das “Gesetz zur Bekämpfung der …” - was sag ich, das Netzsperrengesetz - mit minimalen Veränderungen am Donnerstag in der 2./3. Lesung beschlossen wird.

Auf dem SPD-Bundesparteitag wurde indes der Initiativantrag von Björn Böhning, Franziska Drohsel und Jan Mönikes zum Thema erst vom Parteivorstand “überarbeitet” und dann - inklusive Wortmeldung vor Ort - übergangen. Die Diskussion war nicht gewünscht, wegen der potentiellen Medienwirkung. Hintenrum hörte man, dass man sich über die Berichterstattung der BILD sorgte - die hatte Tags zuvor nämlich Björn Böhning zum “Verlierer des Tages” erklärt (und damit auch halb Twitter). Der Antrag stellte nämlich das in Frage, was Martin Dörmann und Dr. Martina Krogmann ausgehandelt hatten.

Übrigens: Frau Krogmann ist mit dem stellvertretenden Chefredakteur der BILD-Zeitung verheiratet.

Ist aber vermutlich besser so. Sonst wäre man am Ende gar

[…] Gefahr gelaufen, Straftaten im Internet Vorschub zu leisten, von der Vergewaltigung und Erniedrigung kleiner Kinder bis hin zu Urheberrechtsverletzungen in breitestem Ausmaß gegenüber Künstlern und Kreativen. (Quelle)

Und Urheberrechte verletzen, das will man ja nun wirklich nicht.

Mehr dazu:

Bestätigt: netzpolitik.org, Alvar Freude, eigene Quellen

Aufgeräumt: History-Leaks (nebenbei)

Seit geraumer Zeit geistern immer mal wieder Links zu Seiten herum, die die History der besuchten Webseiten auslesen. Mal mittels JavaScript, mal ohne. Momentan ist making-the-web recht frisch. Daher, damit nicht immer wieder selbe Panik aufkommt und ich immer wieder die selbe Argumentation führen muss:

  • Ja, die History kann in gewissem Maße ausgelesen werden.
  • JavaScript ist dafür nicht nötig.
  • CSS schon.
  • Es kann nur ausgelesen werden, was auch vorhanden ist. Wer seine History auf 7 Tage begrenzt, bei dem sind auch maximal 7 Tage ‘auslesbar’.
  • Es können nur exakte Treffer ausgelesen werden.

Das Verfahren sieht so aus: Die Seite fragt den Browser, ‘wurde die URL bereits besucht?’ - volle URLs, wohlgemerkt! Wenn man also nur eine Unterseite von Slashdot, Heise, oder meinetwegen YouPorn aufgerufen hat, und die Ausleseseite nur nach ‘http://slashdot.org/’, ‘http://www.heise.de/’ oder eben ‘http://www.youporn.com/’ fragt, dann wird der Besuch nicht erkannt. Das bedeutet außerdem: Um das Surfverhalten breit genug zu erfassen, braucht man eine sehr, sehr lange Liste mit Adressen und ausreichend Zeit.

Also - seid euch bewusst, welche Daten gespeichert sind und wie sie genutzt (oder missbraucht) werden können. Panik jedoch ist unangebracht.

Versuch des Schilderwaldes zu Netzsperren

Es ist auch anderen jetzt ja aufgefallen, dass Stopschilder vielleicht nicht so das beste Symbol sind. Aber was wäre dann richtig?

Vielleicht…

![Verbot für Fahrzeuge aller Art](http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Zeichen_250.svg/120px-Zeichen_250.svg.png) ![Verbot für Fußgänger](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Zeichen_259.svg/120px-Zeichen_259.svg.png) ![Verbot für Reiter](http://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Zeichen_258.svg/120px-Zeichen_258.svg.png)

Oder…

![Betreten der Fläche verboten](http://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/D-P015_Betreten_der_Flaeche_verboten_ty.svg/120px-D-P015_Betreten_der_Flaeche_verboten_ty.svg.png)

Oder aber…

![Verboten](http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/DIN_4844-2_Verbot_D-P000.svg/120px-DIN_4844-2_Verbot_D-P000.svg.png)

Oder: Man lässt diese ganze Internetsperrensache einfach bleiben. Wie wär’s?

Verlierer des Tages: Wir alle

“Verlierer des Tages” bei der BILD ist heute:

Der Sprecher der SPD-Linken, Björn Böhning (31), will den Gesetzentwurf der Großen Koalition zur Sperrung von Kinderporno-Seiten im Internet zu Fall bringen. Der Entwurf sieht vor, dass solche Websites durch Stoppschilder gekennzeichnet werden. Wer sie trotzdem aufruft, wird strafrechtlich verfolgt. Für Böhning ist das laut „Spiegel Online“ nur „Alibi-Politik“.

BILD meint: Stoppt Böhning!

Das muss dieser Journalismus sein, von dem man so viel hört, und den Blogs bedrohen, weil sie so undifferenziert sind und einseitige polemische Schnellschüsse ohne Recherche abfeuern.

Und wenn ihr auch Verlierer des Tages seid, findet ihr hier fertige Avatare und Vorlagen für GIMP und Photoshop.