Das PHP-Manual lügt

Gehen wir von folgendem Codeschnippsel aus:

$a = 'a';
$a++;
echo $a;

$b = 'a';
$b = $b + 1;
echo $b;

Wer vermag ohne Ausprobieren zu sagen, welchen Wert $a und welchen Wert $b hat?
Wäre PHP eine konsistente Programmiersprache, sollten $a und $b den gleiche Wert haben. Gemäß der Logik von PHP ist jedoch a == 'b' und b == 1.
Eine Sprache, die zu solchen Überraschungen führt, wird tatsächlich als besonders einsteigerfreundlich gehandelt. Als Argument für PHP wird neben der flachen Lernkurve immer wieder auf die hervorragende Dokumentation verwiesen. Wie gut kann wohl ein Manual sein, dass zu oben genannten Phänomen folgendes verklärt?

PHP follows Perl’s convention when dealing with arithmetic operations on character variables and not C’s. For example, in Perl ‚Z’+1 turns into ‚AA‘, while in C ‚Z’+1 turns into ‚[‚ ( ord(‚Z‘) == 90, ord(‚[‚) == 91 ). Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.

Dass ‚Z’+1 ‚AA‘ ergeben soll, halte ich für eine Lüge.

Simulierte Wahrnehmung

Keine Ahnung, wie genau der Algorithmus hinter ViewFinder HeatMap die optische Wahrnehmung und Reizverarbeitung eines Menschen simuliert. Doch zumindest gemessen an der Simulation wäre mein Blog sehr schlecht gestaltet, da die Aufmerksamkeit fast ausschließlich auf den Header anstatt auf die Inhalte gelenkt wird.

HeatMap von Toms Blog

Beruhigend wirkt der Umstand, dass auch Google von dem Algorithmus nicht wesentlich besser wahrgenommen wird: Die Aufmerksamkeit eines Menschen würde demnach hauptsächlich auf dem Logo ruhen – das mag zwar der Markenbildung zuträglich sein, würde aber zugleich Googles Paradigma Dienste auf das Wesentlich zu beschränken diametral durchkreuzen.

Google HeatMap

Dabei macht es Google schon genau richtig: Sitzen wir vor einem Computer, so ist unser Blick für gewöhnlich auf den unteren Abschnitt des ersten Drittels des Bildschirms oder des Displays zentriert. Oberhalb und unterhalb sowie rechts und links davon lässt unsere Aufmerksamkeit nach. Darum könnte die Suchbox von Google nicht besser platziert sein als mittig im unterem Abschnitt des ersten Drittels unseres Sichtfeldes.
Dieses Kriterium scheint der verwendete Algorithmus, der unter research viel zu knapp beschrieben wird, eben so wenig zu berücksichtigen wie die Eigenschaft der menschlichen Wahrnehmung bekannte Reize wie etwas das Google-Logo gezielt auszublenden.
Der letzt genannte Effekt der gezielten Ausblendung eines visuellen Reizes lässt sich übrigens einfach nachvollziehen: Besondere Feiertage nimmt Google immer wieder zum Anlass ein abgewandeltes Logo zu verwenden. Wem fällt das tatsächlich beim ersten (B)Klick auf?

Tools wie HeatMap bergen großes Potential um die Usability von Onlinemedien kostengünstig zu optimieren, doch die menschliche Wahrnehmung ist sehr komplex und im Details noch nicht ausreichend erforscht. Bis simulierte Wahrnehmungsanalysen tatsächlich repräsentative Ergebnisse liefern, wird wohl noch einiges an Grundlagenforschung nötig sein.

Ubuntu Kernel 2.6.17-11 crasht NdisWrapper

Nach dem Update auf Kernel 2.6.17-11 verweigerte mein über NdisWrapper eingebundener D-Link DWL-G122 Revision C1 den Dienst. Ein Blick in /var/log/messages offenbarte auch schnell den Grund dafür:

Feb 26 21:34:46 linbook loadndisdriver: loadndisdriver: main(546): version 1.9 doesn't match driver version 1.8

Beheben ließ sich das Problem durch vollständiges deinstallieren des NdisWrappers und anschließende Neuinstallation:

sudo make uninstall
make distclean
make
sudo make install

Der Windowstreiber musste dann ebenfalls über sudo ndiswrapper -i /Dr71WU.inf eingebunden werden. Seitdem läuft wieder alles reibungslos. 🙂

Ob andere Distributionen von dem Problemchen ebenfalls betroffen sind, vermag ich nicht zu sagen.

Wenn doch sich bloß mehr Hersteller von WLAN-Chipsätzen an der Entwicklung entsprechender Kernelmodulen beteiligten oder wenigstens die Spezifikationen ihrer Hardware offenlegen würden, wäre das Leben so viel einfacher.

Doch ich möchte mich nicht beschweren: Unter unixartigen Betriebssystemen vermochte ich bislang jeden WLAN-Adapter zu installieren – auch wenn es schon mal umständlich gewesen sein mag.
Vor der Windows XP Installation auf dem Notebook meiner Schwester jedoch musste ich kürzlich kapitulieren: Der alte Adpater Marke Noname unterstützte leider nur WEP, so dass ein Wechsel der Hardware nötig war. Die alten Treiber ließen sich jedoch offenbar nicht vollständig entfernen, so dass der neue WLAN-Adapter (ebenfalls ein ein DWL-G122) nicht korrekt arbeitete. Die Verbindung zum AP wird sporadisch getrennt, die Bandbreite bricht ein und gelegentlich setzt es sogar einen Bluescreen. Das Problem konnte bis heute nicht gelöst werden und wird wohl in einer Neuinstallation des Betriebsystems münden. Möglicherweise gelingt es mir sogar meine Schwester für Ubuntu zu begeistern…. Also wenn jemand gute Argumente für Linux hat, die auch bei weniger geekigen Menschen ziehen: Immer her damit!

PHP nervt

Gibt es eigentlich irgendeinen logischen Grund, warum es keine einheitliche Namensgebung für PHP-Funktionen gibt? Jedes mal sitze ich vor der Tastatur und überlege, wie denn nun der Funktionsname geschrieben wird. Heißt es nun stripcslashes oder strip_cslashes? Und wenn es stripcslashes, warum heißt es dann strip_tags und nicht striptages? Das gleiche Problem bei strtolower und bin2hex. Klar: PHP ist eine gewachsene Sprache und wurde von Version zu Version um Funktionalität erweitert; da lassen sich Innkonsistenzen nicht immer vermeiden. Aber was hindert das Entwicklerteam daran die Namensgebung zu vereinheitlichen, indem sie Synonyme zulassen und von der Norm abweichenden Funktionsnamen als deprecated kennzeichnen?

PHP unterstützt mittlerweile eine sinnvolle Fehlerbehandlung durch Exceptions – dumm nur, dass kritische Funktionen wie file() keine Exception werfen.

PHP6 lässt zumindest hoffen, dass in kommenden Versionen die Sprache endlich von den Altlasten befreit werden kann. Denn es ist zwar schön, dass mensch seit PHP5 fortgeschrittene objektorientierte Implementierungstechniken anwenden kann, aber es macht eben wenig Spaß, diese auf Relikten der strukturierten Programmierung aufsetzen.

La Fonera mit Intel-Macs

Das OS X WLAN-Kernelmodul unterstützt den in Intel-Macs verbauten IO80211-Chipsatz nur unzureichend. Auf meinem MacBook etwa gelang es mir nicht, mich an der privaten SSID MyPlace des La Fonera anzumelden. Wie eine kurze Recherche ergab, war der Grund dafür in der gemischten WPA/WPA2-Verschlüsslung der La Fonera Firmware zu suchen.

Zum Glück lässt sich das umstellen:

  • In der Systemeinstellung unter Netzwerk die IP-Adresse der Ethernetschnittstelle auf 169.254.255.2 legen und als Router 169.254.255.1 (der La Fonera) angeben.
  • Den La Fonera direkt an die Ethernetschittstelle des Mac Books anschließen.
  • La Fonera neu starten.
  • Mit einem Browser deiner das La Fonera-Webinterface unter http://169.254.255.1 aufrufen.
  • Sofern die Benutzerkennung noch nicht geändert wurde, kannst du dich mit admin / admin einloggen.
  • Unter dem Menüpunkt Private WiFi nun über Authentication die Verschlüsslung auf WPA2 umstellen. Bei der Gelegenheit ist es auch eine gute Idee, SSID und Passwort zu ändern. Als Werkseinstellung wurden MyPlace für die SSID und die Seriennummer auf der Rückseite des La Fonera als Passwort hinterlegt

Fonera auf WPA2 umstellen

Tipp: Wenn bei diesem und anderen Eingriffen in die Konfiguration etwas schief gehen sollte oder das Passwort vergessen wurde, kann der La Fonera wieder auf Werkseinstellungen zurückgesetzt werden. Dazu muss lediglich bei eingeschaltetem Gerät der Resetschalter an der Unterseite beispielsweise mit einem Kugelschreiber für gut 20 Sekunden gedrückt werden.

Pumpenrätsel

Gerade bekam ich ein unterhaltsames Rätsel gestellt: Angenommen ein Pool mit 2400 Litern Fassungsvermögen soll leer gepumpt werden. Dazu stehen zwei Pumpen zur Verfügung. Alleine bewältigt die eine Pumpe den Pool in 2 Stunden, die andere in 3 Stunden. Wie schnell ist der Pool trockengelegt, wenn beide Pumpen zusammen eingesetzt werden?

Das interessante an dieser Aufgabe ist, dass das Fassungsvermögen des Pools für die Lösung völlig unerheblich ist.
Es genügt zu wissen, dass der Pool mit der einen Pumpe nach a Minuten geleert werden kann und mit der anderen in b Minuten. Nach x Minuten ist der Pool vollständig trockengelegt. Demnach muss gelten, dass der Pool nach a Minuten zu

\frac{x}{a}

geleert ist und nach b Minuten zu

\frac{x}{b}

. Der Pool ist leer, wenn a = x bzw. b = x gilt. Werden beide Pumpen eingeschaltet, ist das Wasser x Minuten zu einem Anteil von

\frac{x}{a} + \frac{x}{b}

aus dem Pool gepumpt. Es befindet sich kein Wasser mehr im Pool, wenn

\frac{x}{a} + \frac{x}{b} = 1

gilt. Nun können wir die Gleichung nach x auflösen:

x = \frac{1}{\frac{1}{a} + \frac{1}{b}}

.

Für a = 2 und b = 3 ergibt das:

x = \frac{1}{\frac{1}{2} + \frac{1}{3}} = \frac{6}{5}

Und

\frac{6}{5}

entsprechen nun wie vielen Stunden? Tipp:

\frac{60}{60}

sind die Entsprechung einer Stunde. 😉

TextMate – der Editor meiner Wahl

Bislang habe ich mit vim unter OS X gearbeitet, jedoch die mangelnde Integration in die Deskopumgebung vermisst. Vor kurzem bin ich dann nach einigen Zögern auf TextMate umgestiegen. Die Trialversion von Textmate hatte mich von Anfang an überzeugt, aber eigentlich wollte ich einer Open Source Software den Vorzug leisten. So probierte ich Smultron aus, doch konnte mich mit der eigenwilligen Oberfläche nicht anfreunden und vermisste auch einige Funktionen. So entschied ich mich entgegen meiner Prinzipien Abstand von Closed Source zu nehmen dann doch für Textmate. Die 39 Euro erwiesen sich als gut investiertes Geld: TextMate bietet alles, was ich mir von einem Editor wünsche und ich konnte ohne lange Einarbeitungsphase effizient sowohl an Websites, Java- und Ruby-Projekten, PHP-Scripts als auch an meinem Diplom arbeiten. Als besonders gelungen empfinde ich dabei die Integration von

\LaTeX{}

. Einzig bei PHP-Code innerhalb einer lstlisting-Umgebung gerät der Parser ins Straucheln und interpretiert den eingebetteten PHP-Code als

\LaTeX{}

, was dazu führt, dass der Parser nicht das Ende der lstlisting-Umgebung findet. Dadurch werden im folgenden sämtliche Autovervollständigungen und Fehlerkorrekturen einschließlich der Rechtschreibprüfung blockiert. Aber die für

\LaTeX{}

hinterlegte Grammatik kann zum Glück angepasst werden, so dass eingebetteter PHP-Code auch als solcher erkannt und geparst wird. Für Java und Python funktioniert das schon sehr gut. Ich werde mich demnächst intensiver damit befassen.

Textmate mit geöffneten Latexdokument