DropBox with TrueCrypt on Lion and Windows

After receiving my new MacBook, I wanted to sync a whole set of files between both systems. For convenience, I decided to use DropBox instead of a thumb drive and for security reasons, I decided to use TrueCrypt to encrypt some of my confidential data within the DropBox folders.

Using a TrueCrypt container within DropBox is quite convenient as I am syncing my DropBox folders with various machines (e.g. at work). However, I do not want to access these file there nor do I want that an admin might check out my “oooh so secret” files (not saying they would, though).

DroppBox with TrueCrypt on Lion and Windows

With my rusty Mac OS kung-fu, I had to install TrueCrypt first. Of course, this failed and being the first app I did install on Lion, this was somewhat demotivating. Before you have install a version from MACFuse. It seems that the official version is not up to date, however, there are rumors you might use the latest version provided at Tuxera.com.

Once MACFuse and TrueCrypt are set up and the machine is rebooted, create a TrueCrypt container within DropBox. When creating on OS X Lion, you might want choose FAT for the containers file system so you can mount it on the Windows system as well. However, any change within this container will synchronize the container as a whole. Not being very efficient if this is a 256 MB file, it seems that one can turn of the timestamp of the TrueCrypt container to avoid syncing it. This will prevent that the container gets synced after files within the container are changes, however, the itself files are still updated. To turn it of, open TrueCrypt and select Settings / Preferences… chose the Security tab and uncheck the Preserve modifications timestamp of file container checkbox.

TrueCrypt Settings on OS X Lion

Of course, the same has to be done on your Windows system.

TrueCrypt Settings on Windows 7

Once both settings are applied, only the initial sync of the container will take some time. Thereafter, only the files within the container are updated. for me this seems to be a quite good solution to keep my boxes in sync and to avoid rubbernecks seeking through my private stuff. The setup is done quite easily, only the hassle with MACFuse was quite annoying.

Heavy WPF Commands – Part I

Recently, I had a conversation about how much logic a WPF command in .NET might provide and how few implementation it should contain. Basically, this conversation was triggered by different understanding of the semantics of WPF commands. I realized that there is a lot misunderstanding how to implement and use commands in WPF that causes trouble in understanding the program flow and hard to maintain code in the long term. Therefore, I decided this is definitely worth some research on WPF commands and their usage. This is the first articles in a series, I will focus on the usage of WPF commands, their meaning, various implementations and best practices.

The intention of commands are pretty clear described in the Commanding Overview MSDN article:

The first purpose is to separate the semantics and the object that invokes a command from the logic that executes the command.

Therefore, commands allow you to reuse parts of your application logic for different targets of of application while separating this logic from the actual user experience (UIX). Regardless whether implementing the logic using the code behind approach in WPF with RoutedCommands, following the MVVM pattern using RelayCommands or building composite applications using DelegateCommands and CompositeCommands, the concept behind commands stays always the same.

All this is made possible by the ICommand interface with its two method declarations CanExecute and Execute. Basically, this allows your UIX to ask if a certain action can be performed and of course to trigger this action. The one who asks for this is called command source. If the command tells it cannot execute this action, is usually disables itself.

The Idea behind WPF Commands

Which logic to perform is not within the concern of the command source. The command maps the “Do Something” call from the command source to the actual logic and invokes this logic on behalf of the command source. Consequently, the logic to be invoked should not be implemented at an instance of the command itself. Any command serves simply as a protocol between application logic and UIX and allows you to separate both from each other.

In a following articles, I will focus on various best practices how to implement commands before having a look in the different possibilities how to use them in common WPF as well as in composite applications.

Hello world, again!

After running my own blog for several years on a self-hosted Windows server, I finally decided to move my software engineering blog to wordpress.com. For both, security and maintenance reasons, I decided to use the WordPress service instead of running my own installation.

Over time, maintaining the WordPress installation just turned out as quite time consuming tasks. Frequent updates on WordPress itself, the plugins and themes, the hosting operating system, the Perl, PHP and .NET packages almost became a full time job.

At the time, I set up my own server, there were only little possibilities to host all the services I used on the Web (or let’s say meanwhile cloud). While I used to host my own Web Servers (IIS and Tomcat), SVN repository, SMTP server and various databases you can find most of these nowadays offered by third parties, most of the time for free. Most of these offers are sufficient for the experiments you perform to keep up to date with the technology or to experiment with new approaches.

As a fist step. I decided to purchase the domain mapping feature from wordpress.com to use my own subdomain http://www.hack-the-planet.net. Following the technical documentation and Matthias’ post, all you have to do is to set up a CNAME entry with your current registrar (if you just want to map a subdomain). As I use domainFactory as my registrar, this was pretty easy using their Web interface.

31.07
Moving to wordpress.com, I hope to free up more time for researching and blogging in the future again.

Kaizen for Inbox Zero and Outlook 2010

Um Inbox Zero möglichst effektiv umzusetzen, hat es sich bewährt die Aktionen mit E-Mails auf ein Minimum zu reduzieren. Inbox Zero wende ich nun schon seit mehr als zwei Jahren konsequent an. Da sich aufgrund beruflicher Veränderungen derzeit mein E-Mail-Volumen erheblich steigert (obgleich bereits bei Microsoft bereits ein absurder E-Mail-Durchsatz erreicht wurde), ist es an der Zeit den Inbox-Zero-Prozess zu verbessern und ein Fazit über die letzten zwei Jahre Inbox Zero zu ziehen.

Grundsätzlich kann in Inbox Zero der Umgang mit E-Mails auf wenige Aktionen reduziert werden, nach deren Anwendung die betreffende E-Mail sich nicht mehr im Posteingang befindet:

  1. Beantworten
  2. Archivieren
  3. In eine Aufgabe umwandeln
  4. Löschen

Grundsätzlich sollte jede E-Mail aber nur ein einziges Mal angefasst werden. Kein zwei, drei oder gar viermal.

Was Du heute kannst verschieben…

Die einfachste Art, mit einer E-Mail umzugehen ist diese sofort zu beantworten. Dies sollte der Regelfall sein, schließlich wird der Sender etwas vom Empfänger erwarten. Ob beantwortet oder nicht, eine der drei folgenden Regeln wird sofort danach greifen.

Ablage ‘A’ für Archiv

Suche mit Xobni plusEs könnte sein, dass eine Nachricht weder zu beantworten noch weiter zu bearbeite ist. Vielleicht steht in der E-Mail eine wichtige Information (Reisedaten, Login-Daten etc.) auf die man tatsächlich später einmal zugreifen möchte oder muss. Bei vielen Nutzern habe ich die kompliziertesten Taxonomien und Ablagesysteme gesehen, um E-Mails zu archivieren. Jede einzelne E-Mail wird hier eingepflegt, und oft dauert die Auswahl der geeigneten Ablage länger als das eigentlich Lesen und ggf. das Beantworten der E-Mail. Je komplexer das Ablagesystem, desto höher ist jedoch die Wahrscheinlichkeit, dass die gesuchte Nachricht nicht an der vermuteten Stelle gefunden wird. Der Aufwand der betrieben wird, die E-Mail zu archivieren steht in keinem Gegenwert für deren Archivierung. Für mich hat sich daher ein einzelner Ordner ‘Archiv’ bewährt, in dem sich alle archivierten Mails wiederfinden. Alle archivierten Mails in einem Ordner kann auch schnell mit den Outlook-hauseigenen Filtern z.B. nach Datum oder Absender sortiert werden. Für alles andere verwende ich seit seiner Einführung das Outlook-Plugin Xobni. Vor knapp einem Jahr wurde mir sogar eine Xobni plus Version von Xobni direkt spendiert. der wichtigste Punkt bei der Verwendung eines einzelnen Archivs: Es ist nicht notwendig Energie aufzubringen wo und weshalb eine E-Mail in einem speziellen Ordner oder einer spezifischen Struktur abgelegt werden muss. Wenn es tatsächlich notwendig erscheint eine E-Mail aufzuheben, dann sollte dies an einem einzigen Ort sein, schließlich ist der Platz an dem etwas gefunden wird immer der Ort an dem zuletzt nachgeschaut wurde.

Tolle Idee, das kommt ins Backlog

Viele Nutzer missbrauchen ihren E-Mail-Eingang als Aufgabenliste. Aber mal ehrlich, welches Datum hat die allerletzte Mail? Dieses Jahr, letztes Jahr oder älter? Sicher, dass der Sender noch auf die Antwort wartet oder die Aufgabe noch aktuell ist? Hier tritt das gleiche Problem wie bei den zuvor bereits besprochenen Lazy Lists auf: Sie neigen dazu schneller zu wachsen als sie abgearbeitet werden können. E-Mails, die eine andere Aktion als Beantworten erfordern sollten in eine Aufgabe umgewandelt werden. Im optimalen Fall sollte diese Aufgabe an den zentralen Platz wandern, an dem alle Aufgaben gesammelt, priorisiert und abgearbeitet werden. Ähnlich ist es bei Scrum: Jede neue Idee, jede neue Anforderung mit der das Team in Scrum konfrontiert wird wandert ohne Umwege in das Backlog. Bei meiner Implementierung von Zero Inbox habe ich lange Zeit E-Mails in “Remember The Milk”-Aufgaben umgewandelt. Aber auch hier kamen die Nachteile von Lazy Lists zum zu Tage. Mit der Umstellung auf Peronal Kanban habe zumindest ich nun den zentralen Platz gefunden in den E-Mails als Aufgaben auftauchen. Der Medienbruch, die Aufgabe auf ein Post-It zu notieren ist dabei von Vorteil, da man sich nochmal bewusst machen muss, was überhaupt zu erledigen ist. sofern nötig wird in meiner Implementierung die E-Mail sofort gelöscht oder, falls nötig, archiviert. Auf jeden Fall ist sie nach der Umwandlung in eine Aufgabe nicht mehr in der Inbox wiederzufinden. Mit Papierpost verhält es sich nicht anders. Schließlich lässt man die Post nicht im Briefkasten liegen oder steckt den gelesenen Brief wieder in den Briefkasten zurück. Rechnungen oder ähnliches, die eine Aktion nach sich ziehen, also eine Aufgabe darstellen, landen oft in einer Ablage “Zu erledigen” wo sie zu gegebenem Zeitpunkt bearbeitet werden.

Weniger ist Mehr

Die für mich wichtigste Regel für Inbox Zero habe ich vor mehr als zwei Jahr gelesen, gelernt und seither befolgt:

Be liberal with your delete key.

"Be liberal with your delete key"Die Regel freizügig mit der Entfernentaste umzugehen, zu beherzigen kostet die meisten Inbox-Zero-Anfänger sehr viel Überwindung. Der Mensch, von Natur aus Sammler und Jäger, hat anscheinend eine natürliches Grundbedürfnis alles, wirklich alles, zu Sammeln, aufzuheben und zu archivieren. Die zunehmende Digitalisierung verstärkt diesen Drang zusehends. So gesehen, zehntausende Musikdateien, hunderte Filme, abertausende Bilder, tausende von E-Mails. Aber braucht man wirklich jede E-Mail? Während ich anfangs die meisten E-Mails archivierte, landen zwischenzeitlich 98 von 100 E-Mails im Papierkorb. Und wie mit allem gilt hier: Übung macht den Meister. Man lernt schnellerer zu entscheiden, ob es notwendig ist eine E-Mail zu archivieren oder nicht. Einmal vom inneren Zwang alles aufzubewahren gelöst fällt es immer leichter sich von unnötigen E-Mails zu trennen. Ein Feature das bei dieser Einstellung helfen könnte ist die Anzeige wie oft eine archivierte E-Mail aus den letzten drei Jahren wieder benötigt wurde – nur so als Idee.

Kaizen – Den Erfolg visualisieren

Number of unread mails  vs. all mail in  in OutlookA very simple way to visualize in Outlook 2010 how Inbox Zero works, is switching the numbers of mails indicated by default as unread. Nothing shown at your inbox does not mean there are not sitting 1,000 maybe checked but at least marked as read mails in your inbox which is definitely not the idea behind Inbox zero. Said that, checking mails is not forbidden. Maybe there are situation when it makes sense to check for timebombs on a regular base. Especially in such a situation it does make a lot of sense to concentrate on all mail, not just those not read. You can change the view in Outlook by a right click on the Inbox and selecting Properties. There you can switch the number of shown emails from unread to the number of total mails in your inbox.

Kaizen – Archive or don’t -There is no Try

Outlook 2010 Quick StepsMaintaining a single archive, the process of archiving mails using Outlook 2010 is pretty easy. Using Quick Steps creating a shortcut only needs a few clicks.The Quick Step is available within the Ribbon as well as a optional keyboard shortcut. Said that, every mail could be moved using the keys [CTRL]-[SHIFT]-1 directly into the archive folder. Previous versions of  Outlook only provided this capability using custom macros. Especially when thinking of automating processes using Outlook 2010, Quick Steps are worth a try.

Sum Up

After two years Inbox Zero, I am pretty pleased.After improving my personal process, it is even better to deal with the information overload. Switching to Kanban maintaining one central list was the very last step implementing Inbox Zero. One very positive aspect of Inbox Zero is the fact you think much more about the mails you send out. Is this answer really necessary? Does the recipient await an answer at all? The more one thinks about these questions, the more one feels that a very first step towards Inbox Zero is to send less mails.

Kaizen und Personal Kanban

Als frischgebackener ScrumMaster, habe ich mir einen Rat aus dem zugrundeliegenden Training bei Boris Gloger zu Herzen genommen: Scrum als Einstellung zu verstehen, jeden Tag etwas zu verbessern. Mehr als jeden anderen im Team betrifft das den ScrumMaster, denn letztendlich ist er dafür verantwortlich dem Team die Impediments aus dem Weg zu räumen. Ein ScrumMaster sollte also mit gutem Beispiel vorangehen und nicht nur sein Team sondern auch sich selbst ständig verbessern.

Von MIT und WIP

Personal KanbanViele Baustellen schaffen natürlich viel Verwirrung, daher habe ich im Sinne von Kaizen damit begonnen schrittweise Verbesserungen einzuführen. Ein erster Schritt ist dabei die Einführung von Personal Kanban. Während des Scrum-Trainings wurde ich als “Coach” zum Thema Konsequenz durch einen Mitteilnehmer ausgewählt. Dabei habe ich unter anderem kurz den “Most Important Task”-Ansatz von Leo Babuta angerissen, die drei (oder auch fünf) wichtigsten Aufgaben (MIT) jeden Tag in Form eines Post-It-Zettels zu visualisieren und nacheinander abzuarbeiten. Der ausschlaggebende Punkt, ist die Auswahl der drei wichtigsten Aufgaben und der dadurch generierte Fokus darauf. Ähnlich ist der Ansatz im Personal Kanban. Durch die Festlegung der WIP (Work-In-Progress-Artefakte) wird der Fokus verlagert. Weg von der “erdrückenden” Liste an zu erledigenden Dinge, hin zu der überschaubaren Liste an Aufgaben, die tatsächlich erledigt werden. Da ich den MIT-Ansatz bereits seit langer Zeit verfolge, fällt mir die Implementierung von Personal Kanban nicht sonderlich schwer. Gleichgültig, ob “Most Important Task” oder “Work In Progress”: Beide Ansätze unterscheiden sich zunächst nicht sonderlich. Was in The Power of Less als Goal bezeichnet wird, kann in Personal Kanban als langfristige Aufgabe (z.B. Jahresprojekt) in einem eigens hierfür gedachten Abschnitt geführt werden. Die Gestaltungsspielräume in Personal Kanban sind dabei jedem einzelnen überlassen.

Der erste Value Stream

Die erste Implementierung meines Personal Kanban umfasst daher zunächst die drei “Standardspalten” Backlog, WIP und Done. Die Verfeinerung entsteht im Laufe der Zeit während man sich selbst über den eigenen Value Stream im klaren wird. Ein komplexeres Schema eines Value Streams bereits zu Beginn einzuführen erfordert ein höheres Maß an Konsequenz dies umzusetzen und erhöht somit das Risiko, dass das Unterfangen scheitert. Der einfache Value Stream stellt sicher, dass bereits am Ender der ersten Woche zumindest einige Tasks in der Done-Spalte ein subjektiv gutes Gefühl vermitteln. Hierin besteht auch der größte Unterschied im Umgang MITs. Die Visualisierung der erledigten Aufgaben dürfte ein entscheidender Motivationsfaktor sein um den Ansatz konsequent weiterzuführen.

Von Lazy Lists zum Backlog – Der Erweiterte Value Stream

199 Taks zu vielDer nächste Schritt und eines der ersten Items im Backlog besteht darin, sämtliche “Lazy Lists” abzuschaffen. Vor ungefähr einem Jahr hatte ich den Versuch gewagt, meine Aufgaben von Microsoft Outlook nach Remember The Milk (RTM) zu migrieren und ab da an in RTM zu verwalten. Grund hierfür war die erdrückende Anzahl von Tasks, der Mangel an einer Priorisierung von Tasks und die konsequente Umsetzung von Inbox Zero.  Wie alle Lazy Lists, neigen jedoch auch die Listen in RTM dazu, schneller anzuwachsen als sie abgearbeitet werden können. Dies führt unweigerlich dazu, dass vor allem die Aufgaben am Ende der Listen lange Zeit unbeachtet bleiben. Sowohl in The Power of Less als auch in Personal Kanban wird propagiert, nur eine Liste mit allen Aufgaben zu pflegen und somit Anzahl der Eingangsfächer zu minimieren. Während die Visualisierung mittels eines Whiteboards in Personal Kanban die bevorzugte Lösung darstellt, möchte ich jedoch nicht auf die Möglichkeit verzichten, auch von unterwegs neue Items in das Backlog einzutragen.  Hier habe ich mich entschieden mein Value Stream durch ein vorgelagerten Schritt zu erweitern. RTM sowohl auf dem iPhone als auch im Web bleibt die Lösung um spontane Einfälle oder aktuelle Aufgaben zu erfassen.  Regelmäßig, im besten Fall jeden Tag, werden diese Aufgaben in den Backlog des Personal Kanban übertragen. Hier kommt der gleiche Effekt zum tragen, der auch bei Zero Inbox ausschlaggebend ist und weswegen im ersten Schritt zu Zero Inbox alle Items aus der Inbox gelöscht oder archiviert werden. Eine Liste mit drei Einträgen auf Null zu bringen ist wesentlich leichter als eine mit 200 oder gar 1.000 Einträgen.

Von Digital zu Physisch

Während meiner Recherche zu Personal Kanban bin ich auf verschiedene Anwendungen (Desktop und Web) gestoßen, mit denen sich ein Personal Kanban einrichten lässt. Die bewusste Entscheidung gegen ein digitales Personal Kanban ist mit der vorangehenden Abschaffung von Lazy Lists begründet. Ein physisches Whiteboard hat schlicht und ergreifend einen begrenzten Platz für Backlog-Items. Das Backlog kann schon aus diesem Grund nicht uneingeschränkt anwachsen. Und auch hier lässt sich zum Abschluss eine Analogie zu Scrum zu herstellen. Während die Menge an User Stories überschaubar ist (in der Regel um die 60), wachsen Bug-Listen oder Listen in Ticketsystemen schnell ins Absurde (mit hunderten oder gar tausenden Einträgen).

Fazit

Die Umstellung von einem reinen MIT-Ansatz zu Personal Kanban stellt einen nicht allzu großen Schritt dar, sofern man bereits seit einiger Zeit mit MITs gearbeitet hat. Der Hauptunterschied liegt meines Erachtens in einer nachhaltigeren Visualisierung der erledigten Aufgaben und der Priorisierung der Backlog-Items während die Grundprinzipien einer einzelnen Inbox für Aufgaben und einer überschaubaren Menge an abzuarbeitenden Aufgaben vom Grundprinzip ähneln.

Bookmark Backup

Today, TechCrunch reported about Yahoo shutting down the widely used bookmark  service del.icio.us.Right after this, a statement from Yahoo showed a possible alternate future of the service.

Many of you have read the news stories about Delicious that began appearing yesterday. We’re genuinely sorry to have these stories appear with so little context for our loyal users. While we can’t answer each of your questions individually, we wanted to address what we can at this stage and we promise to keep you posted as future plans get finalized.

However, who still wants to quick backup his/her boomarks could use curl following the tips from Martin Koser:

curl --user username:password -o DeliciousBookmarks.xml -O "http://api.del.icio.us/v1/posts/all"

Wo sind meine Signaturen in Outlook 2010 hin

Ein anscheinend weit verbreitetes Problem mit Outlook 2010 scheint eine Fehler mit dem Signatur-Editor Signatures & Stationary zu sein, der es eigentlich ermöglicht Signatur-Dateien für E-Mails zu erstellen und zu verwalten. Der Editor öffnet sich nicht und der Benutzer kann daher keine Signaturen anlegen oder gar auswählen. Speziell für den Geschäftsverkehr sind Signaturen jedoch unerlässlich. Dabei gibt es grundsätzlich zwei Wege an den Dialog zu gelangen.

In einer Nachricht kann über die Schaltfläche Signatures / Signatures… der Editor geöffnet werden.

Signaturen in Outlook 2010 aus Mails bearbeiten

Alternativ kann dies auch über das Backstage von Outlook unter dem Menüpunkt File / Options / Mail / Signatures … geschehen.

Signaturen in Outlook 2010 aus den Einstellungen bearbeiten

Aus unerklärlichen Gründen kann es nun passieren, dass trotz wiederholtem Betätigen der Schaltflächen nichts passiert. Es erscheint kein Dialog, keine Fehlermeldung kein Nichts. Warum? Man weiß es nicht. Muss die Signatur bei jedem Geschäftsbrief von Hand eingefügt werden, steigt der Frustfaktor recht schnell an und Outlook fällt schnell in Ungnade.

Überwiegend lässt sich dieses Phänomen auf Systemen mit einer 64-Bit-Version von Windows 7 und einer 32-Bit-Version von Office 2010 beobachten. Lösen lässt sich das Problem mit wenigen Handgriffen.

Zunächst öffnet man den Registry Editor (regedit.exe) und navigiert zu

HKEY_LOCAL_MACHINESOFTWAREClassesWow6432NodeCLSID{0006F03A-0000-0000-C000-000000000046}LocalServer32

hier ersetzt man den Wert für Schlüssel Default den Wert

C:Program Files (x86)Microsoft OfficeOffice14Outlook.exe

ein. Nun wiederholt man das gleiche für

HKEY_LOCAL_MACHINESOFTWAREClassesCLSID{0006F03A-0000-0000-C000-000000000046}LocalServer32

Nach einem Neustart von Outlook sollte dann der Dialog zum Editoren von Signaturen ohne Widersprüche starten und das Wochenende ist gerettet.

Signatures & Stationary Dialog von Outlook 2010

xUnit and xUnit.BDDExtensions using ReSharper 5.1

Wer von MSTest auf xUnit (derzeit 1.6.1.1521) und ggf. xUnit.BDDExtenions umsteigt wird schnell die integrierte Unterstützung innerhalb von Visual Studio vermissen. Mit ReSharper alles kein Problem, denkt man. Die aktuelle Version 5.1 von ReSharper (ich verwende derzeit Build 5.1.1727.12) macht hier allerding ein paar Probleme, die sich innerhalb weniger Minuten jedoch lösen lassen.

Laut der Plug-In-Seite von ReSharper bringt xUnit.net Contrib die gewünschte Unterstützung mit sich. Hier ist s jedoch erforderlich derzeit auf die Version 0.4.1 alpha auszuweichen. Dabei sollte man sich nicht davon abbringen lassen, dass die angegebene Version einen speziellen ReSharper-Build adressiert.

Die Installation bedarf es lediglich eine Reihe von Schritten aus der readme.txt zu befolgen. Zunächst muss der Inhalt des Ordners xunitcontrib.runner.resharper.5.1 aus dem Archiv in das Verzeichnis

C:Program FilesJetBrainsReSharperv5.0binplugins

oder auf 64-Bit-Maschinen

C:Program Files (x86)JetBrainsReSharperv5.0binplugins

kopiert werden. Wurden auf dieser Maschine zuvor noch keine ReSharper-Plug-Ins installiert, muss der Ordner plugins manuell angelegt werden.

Nun ist der die Datei xunit.xml aus dem Ordner resharper.external.annotations nach

C:Program FilesJetBrainsReSharperv5.0binExternal Annotations

bzw. dem entsprechenden Ordner auf 64-Bit-Maschinen

C:Program Files (x86)JetBrainsReSharperv5.0binExternal Annotations

zu kopieren.

Im letzten (optionalen) Schritt gilt es das Live Template zu importieren. Hierüber lassen sich xUnit-Code-Snippets nutzen. Dazu über das Menü ReSharper / LiveTemplates… den Templates Explorer starten und über das Import-Icon entweder die Datei xunit-ae.xml oder xunit-xe.xml aus dem Ordner resharper.live.templates auswählen.

Der Unterschied der beiden Live Templates ist lediglich  ist ob die Code-Snippets mit dem Buchstaben a oder x aufgerufen werden können.

ReSharper Live Templates

Nach der Installation (und einem Neustart von Visual Studio) lassen sich die xUnit-Tests direkt über den ReSharper Unit Test Explorer ausführen. Eine positive Überraschung war, das die xUnit.BDDExtenions ebenfalls sofort über den Unit Test Explorer ausgeführt werden konnten. Zuvor habe ich lediglich die xUnit.BDDExtensions gegen die aktuelle xUnit-Version (1.6.1.1521) kompiliert.

ReSharper Unit Test Explorer

Dem Testen mit xUnit innerhalb von Visual Studio steht damit nichts mehr im Weg.

Starting BDD

Immer wieder einmal taucht der Begriff Behavior Driven Development oder BDD auf. Obwohl das verhaltensgetrieben Entwickeln einige interessante Vorzüge fällt der Einstieg oftmals schwer. Dabei basiert BDD auf den Techniken im Test Driven Development. Das größte Problem scheint eine vor allem das Fehlen einer für Einsteiger verständliche Einführung in BDD zu sein. Im Folgenden werden daher einige Grundprinzipien des BDD zusammengetragen, die den Einstieg erleichtern sollen.

Test Driven Development (TDD) ist eine Entwicklungsmethode die seit einigen Jahren immer mehr Verbreitung findet. Dabei geht es hauptsächlich darum, Tests vor der eigentlichen Implementierung zu entwerfen und zu schreiben. Eine Möglichkeit stellen hierzu Unit-Tests dar, die i.d.R. auf die kleinste zu testende Einheit (Unit) angewendet werden. Da  das Konzept prinzipiell vielversprechend ist, haben sich Unit-Tests auch in der Clean-Code-Developer-Bewegung eingefunden. Das bekannteste Werkzeug zum Erstellen von Unit-Tests in der .NET-Welt ist derzeit NUnit, das ursprünglich von JUnit portiert und für die .NET-Plattform angepasst wurde. Ein noch immer gutes Buch für den Einstieg in die NUnit ist Pragmatic Unit Testing in C# with NUnit von Andy Hunt und David Thomas.

Während in der Theorie alles wunderbar klingt, hat sich bei zahlreichen Gesprächen mit Kollegen und Freunden immer wieder eine Reihe von Frage gestellt.

Wo fange ich überhaupt an zu testen?  Was soll ich jetzt testen? Wie soll das ich testen? Wann höre ich endlich auf zu testen?

Im Bestreben möglichst viele Tests zu schreiben und eine 100%ige Code-Abdeckung zu erreichen schleichen sich jedoch schnell Trivial-Tests (z.B. für einfache Properties) ein, denn diese sind einfach und schnell zu schreiben, schlagen nie (oder zumindest selten) fehl und erwecken den Anschein, dass der Code aufs Ausführlichste getestet sei.

Ein alternativer Ansatz, der zumindest einige der Fragen beantwortet, ist das Behavior Driven Development (BDD). Ein guter Einstiegspunkt ist der Artikel Introducing BDD von Dan North. Als Ausgangspunkt dient hierbei die Beschreibung einer User-Story.

As a [ROLE]
I want [GOAL]
so that [MOTIVATION]

Im Laufe des Artikels wird die Verhaltensbeschreibung der Implementierung weiter in ein Given-When-Then-Muster ausgebaut.

Given some initial context (the givens),
When an event occurs,
then ensure some outcomes.

Bei BDD ist durchaus die richtige Wortwahl für entscheidend. Anders als beim reinen TDD stellt sich jedoch nicht die Frage, was getestet werden soll, sondern wie sich das System verhalten soll. Verwendet man Dan Norths Einstiegspunkt As-I-So, kann man das Verhalten aus Nutzersicht beschreiben, und dadurch Test auf Basis von User-Storys schreiben.

Konzentriert man sich darauf, nur die für den Test benötigte Funktionalität zu implementieren hilft das unter anderem dazu den Fokus nicht zu verlieren und Feature Creep zu vermeiden. Code der nicht benötigt wird um das Verhalten zu erreichen ist vermutlich nicht notwendig, egal wie viel Spaß es vermutlich macht ihn zu schreiben. In diesem Sinne unterstützt BDD das YAGNI-Prinzip. Im Artikel Getting started with BDD style Context/Specification base naming von Jean-Paul Boodhoo finden sich einige Spezifikationen, die einen ersten Eindruck geben, wie diese aufgebaut sein könnten.

Ein wenig verwirrend ist die Tatsache, dass nur wenig klare Beschreibungen bezüglich des Vorgehens bei BDD sind. Ein Blick beispielsweise in den Code Magazine-Artikel Behavior-Driven Development zeit einige der Grundkonzepte von BDD auf.

Eine gemeinsame Sprache (Shared Language/Ubiquitous Language) ist die Grundvoraussetzung zur Erstellung von Spezifikationen (Specifications) beispielsweise nach dem As-I-So Ansatz. Das Ergebnis hiervon ist eine Reihe von Akzeptanzkriterien die zur Abnahme der gewünschten Funktionalität zu erfüllen sind. Dabei könnte die Granularität der Spezifikation wie folgt verfeinert werden: User Story (Akzeptanzkriterium) –>  Kontextspezifikation –> Code (Ausführbare Spezifikation). Die Kontextspezifikation (Context Specification) besteht aus dem Tripel Concern – Context – Obersvation.

Die Beobachtung (Observation) beschreibt was der eigentliche Test überhaupt macht bzw. was überhaupt getestet wird. Die Organisation von Tests sollte dabei nach dem Concern erfolgen, wobei mehrere Beobachtungen pro Belange (Concern) möglich sind. Im dotnetpro Artikel Die Gleiche Sprache Sprechen von Stefan Lieser (Ausgabe 11/2009) findet sich ein recht gutes Beispiel, dass dies verdeutlichet. Der Kontext (Context) beschreibt Systemzustände (oder Voraussetzungen), die mehreren Beobachtungen gleich sind.

Im Gegensatz   zu TDD sollte die Benennung von Tests keine technischen Details kommunizieren sondern das gewünschte Verhalten auf Basis der gemeinsamen Sprache (Shared Language) wiederspiegeln. D.h. nach dem Hinzufügen des ersten Kunden in eine Kundenliste anstelle der Test-Methode IsNotNullTest könnte in BDD eine Beobachtung ContainsOneCustomer lauten.

Der Mechanismus dahinter (gleichgültige welche Werkzeuge verwendet werden) ist immer noch TDD, allerdings wird nicht mehr die kleineste Funktionseinheit getestet sondern (im optimalen Fall) ein in sich abgeschlossenes Teil-Verhalten des Systems. Natürlich schließt der Einsatz von BDD der Einsatz von TDD nicht aus.

Grundsätzlich kann jedes TDD-Framework für BDD genutzt werden. Dariusz zeigt diesem Artikel wie BDD mittels MSTest aussehen könnte. Vorteil ist ganz klar, dass alles innerhalb der Visual Studio-IDE stattfindet, die Code-Abdeckung berechnet werden kann und die Tests mit nur wenigen Handgriffen ausgeführt werden können. Reine TDD-Frameworks werden jedoch das Problem auf, das sich die Sprache der Spezifikation nicht ohne weiteres ändern lässt.

Eine Alternativen sind z.B. die auf xUnit.net basierenden  xUnit.BDDExtensions von Björn Rochel, die auch von Alex Zeitler in Behavior Driven Development (BDD) leicht gemacht mit ReSharper und XUnit.NET verwendet werden.

Deutsche Rechtschreibung im Windows Live Writer

Windows Live Writer dürfte auf der Windows Plattform derzeit eines der beliebtesten Blogging-Tools sein. Mit Anbindung an die meisten Blogging-Plattformen und zahlreichen Plug-Ins lässt das Tool kaum wünsche offen. Allerdings ist bisher keine deutsche Rechtschreibprüfung vorhanden. Anstelle dessen konnten unterschiedlichste English-Derivate (es gibt eben Englisch und Englisch) ausgewählt werden. Die Möglichkeit die deutsche Rechtschreibkorrektur zu aktivieren oder eine zusätzliche Sprache hinzuzufügen fehlt bisher gänzlich.

Die Lösung ist recht jedoch einfach. Vorausgesetz auf der betreffenden Maschine ist Office 2010 (32-bit) mit deutscher Rechtschreibkorrektur installiert. Ein Blick in den Ordner

C:\Program Files (x86)\Microsoft Office\Office14\PROOF

sollte Gewissheit verschaffen. Hier gilt es die Dateien

MSSP7GE.DLL
MSSP7GE.dub
MSSP7GE.LX

in den Ordner

C:\Program Files (x86)\Windows Live Writer\Dictionaries

zu kopieren. Nach einem Neustart von Windows Live Writer sollte nun unter Options / Spelling auch der Eintrag German (Reform).

Deutsche Rechtschreibung im Windows Live Write aktivieren