Google Analytics mit Privoxy filtern

Meine Meinung über Google Analytics ist ambivalent: Einerseits ist Google Analytics ein hervorragendes Analysetool, das Möglichkeiten bietet, die kostenlos sonst nirgends zu finden sind. Andererseits beunruhigt mich, dass die von Google Analytics gesammelten Daten von Google beliebig verwendet werden können. Schon alleine die Daten, die Google für Webmaster aufbereitet, zeichnen das Bild vom gläsernen Surfer – und es darf davon ausgegangen werden, dass Google durch Kombination verschiedener Analyticsdaten noch weitaus mehr über die Besucher einer Website in Erfahrung bringen kann, als sich dem Webmaster offenbart. Derzeit überwiegen meine Bedenken gegenüber Google Analytics. Darum arbeitet meine Privoxyinstallation seit heute mit folgendem Filter:

FILTER: google-analytics Zapp Google Analytics Tracking
s@<script \s&#91;^>]*google-analytics\.com/urchin\.js[^>]*>[\s.]*</script>@>@Uig                 
s@urchinTracker\(\);@@Uig
s@]*;@@Uig

Die regulären Ausdrücke lassen sich gewiss noch verfeinern, aber für mich arbeitet der Filter momentan zufriedenstellend. Verbesserungsvorschläge sind aber natürlich immer willkommen. 🙂

Neben dem wiedergewonnenen Stückchen Anonymität ergibt sich ein erfreulicher Nebeneffekt: Die Ladezeit vieler Websites, die Google Analytics verwenden, verkürzt sich wesentlich.

Ich will einen neuen Mac

1 GB RAM sind anscheinend zu wenig für mein kleines MacBook. Nach drei Stunden Arbeit (nichts außergewöhnliches: TextMate, CyberDuck, Terminal, iPhoto, iTunes, Mail und Safari) hat Darwin 370688 Speicherseiten ausgelagert. Das dürfte bei 1024 MB RAM eigentlich nicht sein. Kann es denn sein, dass OS X so verschwenderisch mit Speicher umgeht?

370688 Seitenauslagerungen

Da Arbeitsspeicher auch nicht mehr die Welt kostet, könnte ich auch auf 2 GB aufrüsten. Doch so richtig zufrieden bin ich mit meinem MacBook ohnehin nicht mehr: Der Spannungswandler pfeift, die Backspace-Taste ist klapprig, das Gehäuses nicht richtig verschraubt, der Displaydeckel knackt beim Öffnen und das Gerät wird einfach viel zu heiß. Der pfeifende Spannungswandler und die klapprige Tastatur sind allgemeine Mängel der ersten Revision des MacBooks, die zwar enttäuschend sind, aber wahrscheinlich keine Reklamation rechtfertigen würden. Die übrigen Mängel ließen sich zwar auch als Kleinigkeit verbuchen, könnten aber in ihrer Summe genügen um das MacBook auszutauschen.
Mich ärgert ohnehin, dass gut einem Monat nach dem Kauf die Revision 2 des MacBooks mit schnelleren Prozessor, verdoppelten Arbeitsspeicher und größere Festplatte zum gleichen Preis zu haben war. Ob es möglich ist das MacBook gegen eines der zweiten Revision auszutauschen und in diesem Zuge auf 2 GB aufzustocken? Wir werden sehen.

MyISAM Tabellen reparieren

MyISAM Tabellen arbeiten nicht transaktionsorientiert und können beschädigt werden, zum Beispiel wenn mysqld während eines Schreibzugriffs gewaltsam beendet wurde, ein Hardwarefehler vorliegt und ähnliche Katastrophen. Aufmerksam auf ein solches Problem macht neben unvollständigen oder fehlerhaften Ergebnissen einer Datenbankabfrage die Fehlermeldung:

Incorrect key file for table: ‚…‘. Try to repair it

In der Regel lassen sich die beschädigten Tabellen mit repair table your_table; wieder in einen definierten Zustand versetzen. Wenn es schlecht läuft, können aber auch einzelne Datensätze dabei zerstört werden. Kluge Menschen halten darum ein tägliches Backup ihrer Datenbank vor. 🙂

Wenn Datenbanktabellen ohne erkennbaren Grund (zum Beispiel Strom- oder Hardwareausfall) öfters beschädigt werden, ist gut beraten die Serverkonfiguration genauer zu untersuchen oder den Hoster zu wechseln.

Ultimate Tag Warrior: URL-Rewriting

UTW ist ein tolles Plugin für WordPress, um Postings mit Tags zu versehen und Tagclouds als Navigationsmittel zu erzeugen. Dabei ist sogar eine Option vorgesehen, mit der sich schöne URL in Form von BASEURL/tag/tag erzeugen lassen. Bislang blieb diese Funktionalität meiner WordPress Installation jedoch versagt. Zwar konnte ich die Option aktivieren, die Tag Links verweisen auch auf URLs wie BASEURL/tag/linux, aber WordPress vermochte sie nicht auf den eigentliche URL BASEURL/index.php?tag=linux umzuschreiben.
Des Rätsels Lösung fand ich während ich mich in das Rewriting von WordPress einarbeitete.
Wenn Permalinks (so der von WordPress gewählte Name für scheinbar statische, saubere URLs) aktiviert werden, schreibt WordPress eine .htaccess mit folgendem Inhalt (gekürzt):

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Sofern es sich bei der angeforderten Ressource nicht um ein tatsächlich auf dem Webspace vorhandenes Verzeichnis oder File handelt, wird die Anfrage auf die index.php umgeschrieben.
Hier übernimmt dann die Klasse WP_Rewrite, die mit eigenen Regelwerk die sonst an mod_rewrite delegierte Aufgabe übernimmt statische URLs in dynamische umzusetzen. Geparster PHP-Code ist zwar nicht ansatzweise so effizient wie das in C implementiere und bewährte mod_rewrite, bringt aber den entscheidenden Vorteil einer durch Plugins nutzbaren API mit sich. Von der macht der Entwickler des Ultimate Tag Warrior auch Gebrauch, indem er in der Funktion ultimate_rewrite_rules (zu finden in der Datei ultimate-tag-warrior-actions.php) ein neues Rewrite-Tag registriert und zwei neue Rewrite-Regeln hinzufügt.

$wp_rewrite->add_rewrite_tag('%tag%', '([^/]+)', 'tag=');
// without trailing slash
$rules += $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%");
// with trailing slash
$rules += $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%/");

Soweit so gut, funktioniert nur leider nicht. Ich vermutete, dass die von UTW registrierte Rewrite-Regel mit anderen, zuvor hinterlegten, kollidierte. Darum passte ich versuchsweise den Code dahingehend an, dass die UTW-Rewrite-Regeln vor allen anderen abgearbeitete würden.

$wp_rewrite->add_rewrite_tag('%tag%', '([^/]+)', 'tag=');
// without trailing slash
$rules = $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%") + $rules;
// with trailing slash
$rules = $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%/") + $rules;

Und tatsächlich: Nun sind auch saubere URLs mit dem Ultimate Tag Warrior möglich. Alles andere scheint auch zu funktionieren. Jedoch ist das weder eine saubere noch befriedigende Lösung. Ich wüsste gerne, warum und mit welchen Regeln die von UTW registrierten zusammenstoßen. Mir fehlt es momentan allerdings an Zeit und Lust den Code zu debuggen – zumal ich mir nicht sicher bin, ob UTW kaputt ist, WP_Rewrite oder mir nur ein anderes Plugin in die Quere kommt.

Mr Wong codes wrong

Mich erschreckt immer mehr, wie dilletantisch proffessionelle Websites mit hohen Bekanntheitsgrad und Besucherzahl implementiert sind. Heute Morgen zum Beispiel hat der Social-Bookmarking-Dienst Mr Wong einen Totalausfall:

Mr Wong Fehlermeldung

Das kann passieren, auch bei Profis. Die Frage ist nur, wie man mit solchen Fehlern umgeht. PHP-Fehlermeldungen in einem Produktivsystem über den Browser auszugeben, ist eine schlechte Idee. Oftmals geben diese Fehlermeldungen Auskunft über Implementierungsdetails aus, die einem potentiellen Angreifer Sicherheitslücken offenbaren können. Normale Benutzer können mit Fehlermeldungen des PHP-Interpreters gar nichts anfangen, darum sollten sie in verständlichen Worten darüber informiert werden, warum der Dienst momentan nicht funktioniert. Etwa in der Form von: „Unsere Datenbank ist ausgefallen. Unser Administrator wurde informiert. In Kürze wird der Dienst wieder zur Verfügung stehen. Wir bitten den Ausfall zu entschuldigen.“ Und bevor solche Meldungen überhaupt ausgegeben werden, sollte der Administrator benachrichtigt werden. Mit Exceptions wäre das alles kein Problem:

try {
	// Hier kann was schiefgehen!
} catch (Exception $fehler)
{
	// Gib was sinnvolles aus, informiere den Sysadmin, don't panic!
}

Um keinen Code duplizieren zu müssen und Exceptions gezielter behandeln zu können, lassen sich in PHP5 sogar eigene Exceptions implementieren. Außerdem bringt die PHP-SPL vordefinierte Exceptionklassen mit. Doch dazu wann anders mehr.

Ironischerweise hat die Agentur hinter Mr Wong vor kurzem eine Stelle für PHP-Entwickler ausgeschrieben. 😉

Neues Airport-Extreme-Update

Ärgerlicherweise verursachte das letzte Airport-Extreme-Update 2007-001 mehr Probleme als es löste, zumindest bei einigen vielen Usern. Apple reagierte erst über zwei Monate später mit der überarbeiteten Version 2007-002 des Airport-Extreme-Updates.

Airport Extreme Update 2007-002 in der Softwareaktualisierung

Schon darauf eingestellt abermals mit nackter Gewalt das Update aus meinem System entfernen zu müssen, habe ich gerade das neue Update eingespielt. Bislang scheint jedoch alles zu funktionieren. Na bitte, es geht doch!
Dennoch ist eine Unverschämtheit Kunden so lange auf das Bugfix eines kaputten Updates warten zu lassen – zumal sich das Update 2007-001 auf normalen Wege nicht mehr entfernen lässt und mitunter die komplette WLAN-Schnittstelle stilllegt.

Professionelle Softwareentwicklung mit PHP5

Professionelle Softwareentwicklung mit PHP5Der Code der meisten in PHP implementierten Anwendungen ist schlecht. Schlecht bedeutet nicht etwa, dass er nicht funktionieren würde. Aber er ist schlecht zu warten, kaum wiederverwendbar und anfällig für Fehler. Die Objektorientierung bietet Paradigmen und Patterns, die konsequent angewandt zu guten Code führen, doch bis zu Version 4 wurde ein objektorientierter Ansatz in PHP gar nicht oder nur nominell unterstützt. Seit Version 5 beginnt die populäre Scriptsprache sich zu professionalisieren, allerdings können nur wenige Entwicklern einen Nutzen daraus ziehen. Denn viele, wenn nicht die meisten PHP-Programmierer lernten PHP als erste Programmiersprache und sind nicht mit professionellen Entwurfs- und Implementierungstechniken vertraut. Abhilfe schafft das Buch Professionelle Softwareentwicklung mit PHP5 von Sebastian Bergmann: Der Autor richtet sich an den fortgeschrittenen PHP-Entwickler und erläutert ihm Objektorientierung, Entwurfsmuster und Modellierung mit UML aufs Wesentliche reduziert, abstrakt und doch praxisnah. Wer professionell in PHP entwickeln möchte, meistert mit diesem Buch den bequemen Einstieg.

Die erste Auflage des Buchs stellt der Autor auf seiner Website als HTML-Version kostenlos zur Verfügung.