Ich habe 4 Jahre lang ausschließlich Ubuntu benutzt. Nein, die Steuererklärung habe ich nach wie vor mit Elster auf dem Windows-Notebook meiner Frau gemacht. Auf diese Bequemlichkeit will ich nicht verzichten, einfach die Formulardaten vom letzten Jahr kopieren, ändern und abschicken.
Ich kann wirklich nicht bestätigen, dass Ubuntu grenzenlos stabil ist. Ich erinnere mich da an die Systemabstürze, die durch zerkratzte DVD meiner Kinder verursacht wurden. Jedes Mal musste ich dann die Festplatte mit *Werkzeug vergessen* reparieren. Einmal jedoch schlug das fehl und eine Neuinstallation war fällig. Das Gleiche, wenn mein Sohn den Stecker bei laufendem Betrieb aus der Steckdose zog. Eine Maßname, die mir sehr oft weiter geholfen hat: Die System- von der Datenpartition zu trennen und öfter mal ein Systemimage anzufertigen. Oft zerschießt man sich ja auch das System, weil man mal eben einen Befehl ausprobiert. Von daher kann ich Ubuntu nicht die alleinige Schuld für manche Abstürze geben.
Neuerdings habe ich mal wieder Windows 7 installiert. Ich wollte nämlich der Weiterbildung frönen und mich in .NET einarbeiten. Ich dachte mir, mit C++ bin ich etwas antiquiert. Vor allem, weil ich beruflich sehr gerne agil entwickeln will und man dies wohl viel häufiger in modernen Sprachen tut, während man in C++ nur Anwendungen zu Tode wartet.
Nun, da ich meine Erfahrung mit .NET gesammelt habe, habe ich mir wieder ein Linux gegönnt. Ich habe also Unbuntu 10 installiert und: Mein lieber Herr Gesangsverein! Das funktioniert ja überhaupt nicht. Ich nahm an, so richtig gut läuft es nur mit proprietärem Grafikkartentreiber. Aber nach dessen installation war die Soundausgabe gemutet und ich bleibe beim herunter fahren beim Anmelden-Dialog hängen! Das Ganze ist auf meinem Rechner reproduzierbar. Für eine große Verwirrung sorgte auch, dass nach installieren des Treibers der kleine am VGA angeschlossene Bildschirm angepeilt wird, den ich für gewöhnlich ausschalte. Der große Monitor am DVI bleibt dunkel. Bis ich das gerafft hatte, das kleine Dinge einzuschalten. Also versuche ich es mit Kubuntu. Ich habe auch an OpenSuse gedacht, aber Ubuntu hat mich so lange treu begleitet und schließlich hat jede Distribution ihre Macken. Und Kubuntu ist ja auch ein Schlingel. Ich habe aus Angst zunächst mal den Grafikkartentreiber weg gelassen. Nachdem ich meine 2 Monitore auf Ausrichtung und Auflösung eingestellt habe und neu starte, hat KDE diese Einstellung vergessen! Ich musste diese Einstellungen tatsächlich per Hand in eine Datei eintragen. Mißtrauisch geworden, will ich zunächst meine Installation mit partimage sichern. Doch das unterstützt das neue Dateisystem ext4 nicht. Ich habe dann fsarchiver gefunden, dass den Dienst tat. Dieses Mal hat der Treiber nicht mehr das System zerschossen, Glück gehabt. Eine Schande: Lege ich eine Daten-CD ins Laufwerk, erkennt der KDE-Dateimanager Dolphin dies nicht. Erst nachdem ich Nautilus von Gnome installiere und diesen über die Shell starte kann ich meine CD öffnen.
Damit kann ich leben, eindeutig. Jetzt habe ich auch wieder ein lauffähiges System. Aber diese Frickelei !!! Wahnsinn! Warum mache ich das? An Linux hat mich immer die Tatsache fasziniert, dass es aus freiem Antrieb sozusagen freiwillig entwickelt wurde. Dass es so prächtig funktioniert kann eindeutig kein Grund sein. In dieser Hinsicht bin ich aus rein ideellen Gründen überzeugter Linux-Benutzer. Beruflich hätte ich aber grundsätzlich nichts gegen .NET einzuwenden.
Softwareplaudertäschchen
Hin g’frickelt is’
ASP.NET MVC – Tutorials im Umbruch
Wie beginnt man am besten das Erlernen von ASP.NET MVC? Da MVC allermeist für große und wartbare Anwendungen eingesetzt wird, sind Schreiber von Tutorials versucht, ihr ganzes designtechnisches Können einzubringen. Das kann aber leicht den Blick auf das reine MVC verschleiern. Zudem ist ASP.NET MVC 2 gerade aktuell und alle raffiniert entworfenen Tutorials auf einen Schlag veraltet. Kommen noch sehr spezielle Techniken wie z.B der Inversion of Control-Container Castle Windsor hinzu, wird das Tutorial noch kurzlebiger. Aber schließlich bedeutet MVC erst einmal nichts anderes als die Trennung von Model, View und Controller. Die Persistenzschicht ist davon völlig unabhängig. Also lege ich mir für eine Beispielanwendung zuerst eine Grundlage, indem ich ein Datenmodell entwerfe und denke gar nicht daran, dass ich ja ASP.NET MVC lernen will. Mit dem Entity Framework 4 habe ich ja schon gute Erfahrungen gesammelt und entwerfe nachfolgend abgebildetes Modell: Ein Carsharing-Unternehmen hat verschiedene Autos und verschiedene Personen, die am Unternehmensmodell teilnehmen. Eine Person kann mehrere Buchungen machen und mehrere Buchungen können sich auf ein Auto beziehen.

Das Letzte Mal, als ich mit dem EF 4 arbeitete, schrieb ich meine POCO-Entitäten und den Datenzugriff selbst. Meine Intuition verrät mir, dass das auch besser gehen kann und ich stoße auf den C# POCO Entity Generator, der von Microsoft bezogen werden kann. Mit dessen Hilfe werden beim Speichern des Datenbankmodells nach einem Template (T4-Template?) sowohl POCO-Entitäten als auch der Datenzugriffskontext generiert. Das Schöne: Ich kann das Template ändern. Will ich weiterhin den Kontext ein Interface implentieren lassen, ist das Template der Ort für diese zusätzlichen Codezeilen. Denn den generierten Code sollte man nicht anfassen, da bei einem lebenden Modell die Codegenerierung immer wieder erneut angestoßen wird.
Nachdem ich nach gewohntem Muster wieder ein Repository mit austauschbarem Kontext angelegt habe, zeigt mir ein Unittest im folgenden Code, dass die Persistenz ignorierenden generierten Entitäten die Konsistenz der Datenbank auch ohne mein Zutun gewährleisten. Die Tests sind nicht umfangreich, denn ich vertraue Microsoft.
[TestMethod]
public void TestConsistency()
{
Person p1 = _repository.GetPersonByEmail("h@d.de");
Person p2 = _repository.GetPersonByEmail("o@s.de");
IEnumerable<Booking> bookings = _repository.GetBookings(p1);
foreach (Booking b in bookings)
Assert.IsTrue(p1.Id == b.PersonId);
Booking b1 = bookings.ElementAt(0);
Assert.IsTrue(p1.Bookings.Contains(b1));
b1.Person = p2;
Assert.IsTrue(!(p1.Bookings.Contains(b1)));
Assert.IsTrue(p2.Bookings.Contains(b1));
}
Nun, da ich meine Persistenzschicht sauber abgetrennt habe, kann ich mich auf das eigentliche ASP.NET MVC-Framework stürzen. Ich habe keine Angst mehr vor dem ’schmutzigen’ Tutorial ASP.NET MVC Music Store von Microsoft. Ich genieße, dass es hier mal nicht ums Design geht und nun tut das Tutorial seinen Dienst und ist sehr gut nachvollziehbar. Das Übertragen auf meine eigene skizzierte Beispielanwendung Car Sharing zeigt mir, dass ich es verstanden habe. Interessant finde ich, dass die View-Schicht nichts mit dem Style zu tun hat, den man wiederum in einem separaten Stylesheet definiert. Die nachfolgenden Abbildungen kann ich mir nicht verkneifen.

