Recht haben, kriegen und behalten
Seit geraumer Zeit beschäftigt mich der Gedanke, inwiefern man jetzt mit "Ich hab aber Recht" verfahren soll. Dazu mal drei Beispiele aus meiner persönlichen Erfahrung:
- Ich fahre nachts um 23:00 auf dem "Bahnsteig" vor dem Karlsruher HBF. Anwesende Personen ausser mir: vielleicht 15. Auf einem Gelände so gross wie ein Sportplatz. Nun kommt eine Person mit zwei Roll-Trollies auf mich zu, macht sich extra breit und schreit (ja, schreit) mich an, "Ob das denn sein müsse, dass ich hier Fahrrad fahre".
- Ich fahre auf der richtigen Seite der Strasse, auf dem Fahrradweg, klingele einen Passanten an, er solle doch zur Seite gehen, werde angepflaumt: "Scheiss Radfahrer"
- Ich fahre verkehrt herum in einer Einbahnstrasse (mit Schild Fahrrad frei) und werde von einem Autofahrer angemault, wo ich denn die Verkehrsregeln gelernt hätte
Nun, bei 1) hat der Roll-Trolley-Boy Recht, bei 2) hab ich Recht und bei 3) hab auch ich recht. Jetzt stellt sich nur die Frage, inwiefern man auf sein Recht bestehen muss. Ich selber hab mich bei 2+3 dabei erwischt, wie ich innerlich geflucht hab, weil ich doch alles richtig gemacht habe, bei 1 war mir aber sofort klar, das jegliche Argumentation mit dem Herrn sinnlos ist, weil er ja Recht hat. Allerdings hab ich bei 1 ja auch niemanden wirklich gestört und bin "Schrittgeschwindigkeit" gefahren.
Wir sind hier also bei dem Thema: "Soll ich auf mein Recht bestehen"? Ich denke: Kommt drauf an. Klar gibt es Situationen, da sollte man das tun (Autounfall usw.), aber bei so Kleinigkeiten sollte der gesunde Menschenverstand einem doch sagen, dass man NICHT drauf bestehen muss, wenns gerade nicht stört. Klar, das Recht sagt was anderes und im Zweifelsfall hab ich dann das Nachsehen, aber mal ehrlich: Wenn stört sowas? Was sagt ihr dazu?
FURT – Die Wahrheit übers Lügen
1x "Die Wahrheit übers Lügen (ca. 1,5 CD)" Farin Urlaub Racing Team
[x] bestellt.
Relay, ein Verzeichnis-Manager
Online im Verzeichnis rumbrowsen wollte ich schon immer. Nun bin ich beim Lesen über Dependency Injection irgendwie auf relay gestossen. Nunja, leider scheitert das an einer Eigenart von MySQL:
CREATE TABLE IF NOT EXISTS `relay_clients` (
`id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`name` text NOT NULL ,
`display` text,
`path` text NOT NULL ,
PRIMARY KEY ( `id` ) ,
UNIQUE KEY `pn` ( `path` ( 250 ) , `name` ( 250 ) )
);
scheitert mit der Fehlermeldung:
Specified key was too long; max key length is 1000 bytes. Could not create the table relay_clients
Nun, warum? 250+250 sollten doch weniger als 1000 sein? Jein
Javascript-Objekte
Guter Artikel über Objekte in Javascript. Eher nur Grundsätzliches, trotzdem lesenswert: JavaScript's class-less objects im JavaRanch Journal.
empty vs. isset vs. array_key_exists
Ich zitier hier einfach mal. Hab ich nämlich nicht gewusst.
The problem is that there are situations where isset() and empty() are
not appropriate checks. For instance, try this:$test = array('foo' => null); echo ((isset($test['foo'])) ? 'true' : 'false'); // echoes 'false'!What about empty()?
$test = array('foo' => null); echo ((empty($test['foo'])) ? 'true' : 'false'); // echoes 'true' echo ((empty($test['bar'])) ? 'true' : 'false'); // also echoes 'true'!What does that mean? It means that if you want to test for the presence
of a key, you can't rely on isset() *or* empty()! array_key_exists() is
the only way to reliably verify that the key is present in the array.$test = array('foo' => null); echo (array_key_exists('foo', $test) ? 'true' : 'false'); // echoes 'true' echo (array_key_exists('bar', $test) ? 'true' : 'false'); // echoes 'false'
Quote von Matthew Weier O'Phinney, Zend Framework Developer
Newsgruppen in Thunderbird
Zur Zeit benutze ich wieder ein paar Newsserver. Das klappt alles wunderbar im Thunderbird, mich hat es immer nur genervt das beim Starten von Thunderbird diese Newsgruppen immer geschlossen sind und ich erst alles manuell aufklappen muss. Nunja, ich wusste das dies einstellbar ist, aber gewusst wo:
News-Server beim Programm-Start nicht immer zuklappen
Um News-Server nicht unnötig zu überlasten, zeigt Thunderbird die einzelnen News-Server beim Programm-Start immer "zusammengeklappt" an. Um dieses Verhalten abzustellen, fügen Sie folgenden Code zu Ihrer user.js hinzu:
// News-Server beim Programm-Start nicht immer zuklappen
user_pref("news.persist_server_open_state_in_folderpane", true);
Die zehnte Dimension
Schon eine Weile her, aber im Januar 2007 war ich in Paris. Dort hat mir 'nen Kumpel folgendes Video gezeigt. Ich finds nur gut
xUnit
Testen von Programmen ist wichtig. Das wurde schon recht früh erkannt. Ich hab ja schon früher über Unit-Testing und Refactoring geschrieben. Jetzt les ich gerade das Buch "xUnit Test Patterns - Refactoring test code" von Gerard Meszaros (ISBN-13: 978-0-13-149505-0). Dicker Schmöker mit knapp 890 Seiten. Ich werde hier jetzt ab und an ein paar Gedanken zu diesem Buch verfassen und wahrscheinlich auch Kapitelweise eine Zusammenfassung. Eigentlich dient das nur meinem Verständnis, aber vielleicht hat auch jemand anderes was davon
The Fragile Test Problem
In meinem Praxissemester bin ich über WinRunner gestolpert. An sich eine schöne Idee, einfach ein paar Mausbewegungen und Klicks aufzeichnen und schauen ob auch das rauskommt, was rauskommen sollte. Scheitert aber schon an diversen Sachen, z.B. wenn man die Sprache im Programm umstellt. Zwar sollte sowas nicht die Funktionalität eines Programmes verändern, aber wer weiss, Bugs sind überall. Meszaros kategorisiert das ganze (er nennt es "The Fragile Test Problem") in vier Fallgruben aufgeteilt.
Behaviour Sensitivity
Wenn sich das Verhalten eines Systems ändert (weil sich z.b. die Anforderungen geändert haben), dann ist die Wahrscheinlichkeit, dass die Tests, die die geänderte Funktionalität prüfen, scheitern sehr gross (uff, was ein Satzbau). Das ist jetzt nichts spezielles für so Programme wie WinRunner, das ist immer so. Wenn ich bei einem Auto auf vier Reifen teste, die Requirements aber plötzlich ein Dreirad wollen, dann MUSS das schiefgehen. Richtig fies wird es erst, wenn wir uns auf die Funktionalität verlassen um das System in einen Status zu bringen, in dem wir einen Test ausführen.
Interface Sensitivity
Grundsätzlich ist das Testen einen Systems über die Benutzeroberfläche eine schlechte Idee. Jede minimale Änderung bringt jeden Test zum Scheitern. Und dies ist völlig unabhängig von der Benutzeroberfläche (GUIs wie QT oder GTK, CLI (Command Line Interfaces) oder Weboberflächen (Buzzword: Ajax, Web 2.0)).
Data Sensitivity
Alle Tests starten an einem Zeitpunkt, an dem bestimmte Konditionen gegeben sind. Irgendwelche Datenstrukturen sind vorhanden und werden genutzt. Solange man nich immensen Aufwand investiert um die Tests von diesen Daten unabhängig zu machen, ist es höchstwahrscheinlich das die Tests scheitern.
Context Sensitivity
Nachdem der Datenkontext schon wichtig ist, kommen natürlich noch andere externe EInflüsse dazu. Das können so simple Dinge wie die Uhrzeit sein (Sommer-/Winterzeitumstellung), aber auch Geräte wie Drucker oder Server.
All diese Abhängigkeiten machen das deterministische Wiederholen von Tests sehr, sehr schwierig. Natürlich gibt es viele Möglichkeiten diese Abhängigkeiten zu umgehen, aber egal welche Methode man nimmt, sie bleiben bestehen. Die xUnit-Familie stellt ein paar Muster zur Verfügung die uns einen grossen Grad an Kontrolle ermöglichen. Wir müssen nur noch lernen sie zu nutzen.
Dieses Testen wird übrigens "regression testing" genannt. Regression bedeutet auf Deutsch "Rückwärtsbewegung" und spiegelt das auch gut wieder. Wir haben ein fertiges Produkt und bewegen uns beim Testen von Vorne nach Hinten (Von der GUI zum Backend). Einen völlig anderen Ansatz spielt hier die testgetriebene Entwicklung (test-driven development), die das Prinzip umkehrt. Mittels dieser Methode wird eher das Verhalten von Software die noch geschrieben wird beschrieben, als die fertige Software rückwärts getestet.
Heiraten
Quelle: Key figures on Europe - 2007/08 edition
Ich hab also noch bissle Zeit mitm Heiraten. Puuuh.

