<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rash thoughts about .NET, C#, F# and Dynamics NAV.</title>
	<atom:link href="http://www.navision-blog.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.navision-blog.de</link>
	<description>This Blog is about Microsoft Dynamics NAV (f.k.a Navision incl. C/SIDE and C/AL), C#, F# and .NET in general.</description>
	<lastBuildDate>Wed, 14 Jul 2010 11:12:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>&quot;Fake &#8211; F# Make&quot; 1.40.5.0 released &#8211; Bugfixes for CruiseControl.NET</title>
		<link>http://www.navision-blog.de/2010/07/14/fake-f-make-1-40-5-0-released-bugfixes-for-cruisecontrol-net/</link>
		<comments>http://www.navision-blog.de/2010/07/14/fake-f-make-1-40-5-0-released-bugfixes-for-cruisecontrol-net/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 09:15:05 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[F#]]></category>
		<category><![CDATA[FAKE - F# Make]]></category>
		<category><![CDATA[docu]]></category>
		<category><![CDATA[F-sharp Make]]></category>
		<category><![CDATA[Fake]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/07/14/fake-f-make-1-40-5-0-released-bugfixes-for-cruisecontrol-net/</guid>
		<description><![CDATA[Today I released “FAKE – F# Make” version 1.40.5.0. This release fixes some issues with CruiseControl.NET compatibility and improves the MSBuild task. Important links: Project page Download HTML Documentation Repository Changes for CruiseControl.NET Daniel Nauck created a FAKE task for CC.Net. This task allows a much easier configuration of FAKE. Please download the latest CC.NET [...]]]></description>
			<content:encoded><![CDATA[<p>Today I released “FAKE – F# Make” version 1.40.5.0. This release fixes some issues with <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">CruiseControl.NET</a> compatibility and improves the MSBuild task.</p>
<p>Important links:</p>
<ul>
<li><a href="http://bitbucket.org/forki/fake/wiki/Home">Project page</a></li>
<li><a href="http://bitbucket.org/forki/fake/downloads">Download</a></li>
<li><a href="http://www.navision-blog.de/fake/">HTML Documentation</a></li>
<li><a href="http://github.com/forki/FAKE">Repository</a></li>
<li><script src="http://www.ohloh.net/p/483999/widgets/project_thin_badge.js" type="text/javascript"></script></li>
</ul>
<h5>Changes for CruiseControl.NET</h5>
<p><a href="http://twitter.com/dnauck">Daniel Nauck</a> created a <a href="http://confluence.public.thoughtworks.org/display/CCNET/FAKE+Task">FAKE task for CC.Net</a>. This task allows a much easier configuration of FAKE. Please download the <a href="http://ccnetlive.thoughtworks.com/CCNet-builds/1.6.0/">latest CC.NET build</a> if you want to use it.</p>
<p>Daniel also created a <a href="http://build.nauck-it.de/server/build.nauck-it.de/ViewServerReport.aspx?Category=FAKE">FAKE build project on his server</a> which showed us some compatibility issues:</p>
<ul>
<li>In FAKE:
<ul>
<li>Race condition in FAKE’s trace functionality</li>
<li>Better XML tracing if something fails</li>
<li>The tracing buffer will be flushed after every build target</li>
<li>Every task has a Timeout property (Default: 5 min.)</li>
<li>Setting of environment variables fixed</li>
<li><a href="http://www.nunit.org/index.php?p=consoleCommandLine&amp;r=2.2">Showing labels in NUnit</a> is now the default</li>
</ul>
</li>
<li>In <a href="http://docu.jagregory.com/">Docu</a>:
<ul>
<li><a href="http://github.com/forki/docu/commit/80daa6b48cb7f652ff5646a45fce4b94619fad1f">Unhandled exception in Docu.exe</a></li>
</ul>
</li>
<li>In CC.NET:
<ul>
<li>Implemented <a href="http://confluence.public.thoughtworks.org/display/CCNET/Git+Source+Control+Block">support for git submodules</a> (<a href="http://jira.public.thoughtworks.org/browse/CCNET-1922">CCNET-1922</a>)</li>
</ul>
</li>
</ul>
<p>@Daniel: Thank you very much for helping me on this CruiseControl.NET stuff. I really appreciate this.</p>
<h5>MSBuild task changes</h5>
<p>The MSBuild task in FAKE gets a sequence of project files and compiles them in the given order. This might be slow if you have lots of dependent projects. Then MSBuild might analyze the dependencies over and over again. To fix this issue I currently see two possible solutions:</p>
<ol>
<li>Generate a temporary solution file and use this for compilation.</li>
<li>Analyze the given projects and remove all dependent projects from the list.</li>
</ol>
<p>FAKE 1.40.5.0 implements the second idea. If you have a better idea please contact me.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/07/14/fake-f-make-1-40-5-0-released-bugfixes-for-cruisecontrol-net/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>&#8220;Fake &#8211; F# Make&#8221; 1.33.0 released</title>
		<link>http://www.navision-blog.de/2010/07/11/fake-f-make-1-33-0-released/</link>
		<comments>http://www.navision-blog.de/2010/07/11/fake-f-make-1-33-0-released/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 15:11:49 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[F#]]></category>
		<category><![CDATA[FAKE - F# Make]]></category>
		<category><![CDATA[F-sharp Make]]></category>
		<category><![CDATA[Fake]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[SideBySideSpecification]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[XPath]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/07/11/fake-f-make-1-33-0-released/</guid>
		<description><![CDATA[Yesterday I released “FAKE – F# Make” version 1.33.0. This release has lots of small bug fixes and a couple of new features. Important links: Project page Download Repository Git helpers -Fake.Git.dll Git is a distributed revision control system with an emphasis on speed. Git was initially designed and developed by Linus Torvalds for Linux [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I released “FAKE – F# Make” version 1.33.0. This release has lots of small bug fixes and a couple of new features.</p>
<p>Important links:</p>
<ul>
<li><a href="http://bitbucket.org/forki/fake/wiki/Home">Project page</a></li>
<li><a href="http://bitbucket.org/forki/fake/downloads">Download</a></li>
<li><a href="http://github.com/forki/FAKE">Repository</a></li>
</ul>
<h5>Git helpers -Fake.Git.dll</h5>
<blockquote><p>Git is a distributed revision control system with an emphasis on speed. Git was initially designed and developed by Linus Torvalds for Linux kernel development. Every Git working directory is a full-fledged repository with complete history and full revision tracking capabilities, not dependent on network access or a central server.</p>
<p>[<a href="http://en.wikipedia.org/wiki/Git_%28software%29">Wikipedia</a>]</p></blockquote>
<p>In the last couple of months I worked on small helper library for controlling <a href="http://en.wikipedia.org/wiki/Git_%28software%29">Git</a>. This library is now released as part of “FAKE – F# Make”. You can find the source code at <a title="http://github.com/forki/FAKE/tree/master/src/app/Fake.Git/" href="http://github.com/forki/FAKE/tree/master/src/app/Fake.Git/">http://github.com/forki/FAKE/tree/master/src/app/Fake.Git/</a>.</p>
<p>Features:</p>
<ul>
<li>Repository handling
<ul>
<li>init, clone</li>
</ul>
</li>
<li>Submodules
<ul>
<li>init, clone, information about submodules</li>
</ul>
</li>
<li>Branches
<ul>
<li>checkout, create, delete, merge, rebase, tag, pull, push, reset, commit, …</li>
</ul>
</li>
<li>SHA1 calculation</li>
</ul>
<h5>Documentation generation with James Gregory&#8217;s docu tool</h5>
<blockquote><p><strong>What&#8217;s a docu?</strong> A documentation generator for .Net that isn&#8217;t complicated, awkward, or difficult to use. Given an assembly and the XML that&#8217;s generated by Visual Studio, docu can produce an entire website of documentation with a single command.</p>
<p>[<a href="http://docu.jagregory.com/">docu website</a>]</p></blockquote>
<p>Fake comes bundled with James Gregory’s documentations generator “<a href="http://docu.jagregory.com/">docu</a>”, which converts <a href="http://msdn.microsoft.com/en-us/library/b2s063f7%28VS.71%29.aspx">XML-Documentation</a> comments into HTML files. All you need to do is downloading a <a href="http://bitbucket.org/forki/fake/downloads/templates.zip">template</a> and calling the docu task inside your build script:</p>
<pre style="font-family: consolas;">!+ (buildDir + <span style="color: maroon;">"*.dll"</span>)
     |&gt; Scan
     |&gt; Docu (<span style="color: blue;">fun</span> p <span style="color: blue;">-&gt;
</span>         {p <span style="color: blue;">with
</span>             ToolPath = docuPath + <span style="color: maroon;">"docu.exe"</span>
             TemplatesPath = templatesSrcDir
             OutputPath = docsDir })</pre>
<p>Since FAKE builds its own documentation with docu I started to add more (and hopefully better) XML doc comments. My plan is to describe more and more of the internal FAKE functions in the next releases. An updated HTML-document (generated via a <a href="http://docu.jagregory.com/">docu</a> task) can be found at <a title="http://www.navision-blog.de/fake/" href="http://www.navision-blog.de/fake/">http://www.navision-blog.de/fake/</a>.</p>
<h5>Side by side specification</h5>
<p>For Test-driven development (TDD) it’s sometimes nice to have the specifications next to the implementation files since the specs are considered as documentation.</p>
<p>By using a tool like <a title="VsCommands" href="http://mokosh.co.uk/vscommands/">VSCommands</a> it is possible to group the implementation with the specs (see also <a href="http://gist.github.com/457248">http://gist.github.com/457248</a>).</p>
<p>This “side by side specification” makes TDD a lot easier but of course  we don&#8217;t want to deploy the specification classes and the test data.</p>
<table>
<tbody>
<tr>
<td><img style="display: inline; border-width: 0px;" title="Side by side specification" src="http://www.navision-blog.de/images/FakeFMake1.33.0released_B55F/image.png" border="0" alt="Side by side specification" width="221" height="201" /></td>
<td>==&gt;</td>
<td><img style="display: inline; border-width: 0px;" title="After &quot;RemoveTestFromProject&quot;" src="http://www.navision-blog.de/images/FakeFMake1.33.0released_B55F/image_3.png" border="0" alt="After &quot;RemoveTestFromProject&quot;" width="142" height="117" /></td>
</tr>
</tbody>
</table>
<p>FAKE has a new feature which automatically removes all specification files and test framework references according to a given convention:</p>
<pre style="font-family: consolas;">Target <span style="color: maroon;">"BuildApp"</span> (<span style="color: blue;">fun</span> _ –<span style="color: blue;">&gt;
</span>      !+ <span style="color: maroon;">@"src\app\**\*.csproj"</span>
         |&gt; Scan
         |&gt; <strong>Seq.map (
             RemoveTestsFromProject
                 AllNUnitReferences      <span style="color: green;">// a default references convention</span>
                 AllSpecAndTestDataFiles <span style="color: green;">// a default file convention
</span>                 )</strong>
         |&gt; MSBuildRelease buildDir <span style="color: maroon;">"Build"</span>
         |&gt; Log <span style="color: maroon;">"AppBuild-Output: "</span>
)</pre>
<p>The conventions are simple functions and can be customized e.g.:</p>
<pre style="font-family: consolas;"><span style="color: green;">/// All Spec.cs or Spec.fs files and all files containing TestData</span>
<span style="color: blue;">let</span> AllSpecAndTestDataFiles elementName (s:string) =
     s.EndsWith <span style="color: maroon;">"Specs.cs"</span> ||
       s.EndsWith <span style="color: maroon;">"Specs.fs"</span> ||
       (elementName = <span style="color: maroon;">"Content"</span> &amp;&amp; s.Contains <span style="color: maroon;">"TestData"</span>)</pre>
<h5>Miscellaneous</h5>
<ul>
<li>SQL Server helpers are moved to Fake.SQL.dll
<ul>
<li>Additional functions for attaching and detaching databases.</li>
</ul>
</li>
<li>FileHelper.CopyCached function was added
<ul>
<li>Copies the files from a cache folder. If the files are not cached or the original files have a different write time the cache will be refreshed.</li>
</ul>
</li>
<li>EnvironmentHelper.environVarOrDefault added
<ul>
<li>Retrieves the environment variable or a given default.</li>
</ul>
</li>
<li>Fixed <a href="http://github.com/forki/FAKE/issues/closed#issue/3">Issue 3</a>: toRelativePath calculates paths with ..\..\ if needed</li>
<li>Added a build time report to the build output.</li>
<li>XPathReplace and XMLPoke tasks added.
<ul>
<li>Replaces text in an XML file at the location specified by an XPath expression.</li>
</ul>
</li>
<li><a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx">ILMerge</a> task added</li>
<li><a href="http://wix.sourceforge.net/">Windows Installer XML (WiX)</a> task added</li>
</ul>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/07/11/fake-f-make-1-33-0-released/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Strange bug in Dynamics NAV client</title>
		<link>http://www.navision-blog.de/2010/07/07/strange-bug-in-dynamics-nav-client/</link>
		<comments>http://www.navision-blog.de/2010/07/07/strange-bug-in-dynamics-nav-client/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 07:34:18 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[Dynamics NAV 2009]]></category>
		<category><![CDATA[Navision]]></category>
		<category><![CDATA[bugs]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/07/07/strange-bug-in-dynamics-nav-client/</guid>
		<description><![CDATA[My colleague Mathias Meissner found a strange bug in the Dynamics NAV Client (occurs at least in the native clients for NAV 403, 501 and 601). It seems the following code creates a strange memory allocation issue. (Download sample) OBJECT Codeunit 99500 NAV Bug { OBJECT-PROPERTIES { Date=17.06.10; Time=14:30:30; Modified=Yes; Version List=; } PROPERTIES { [...]]]></description>
			<content:encoded><![CDATA[<p>My colleague Mathias Meissner found a strange bug in the Dynamics NAV Client (occurs at least in the native clients for NAV 403, 501 and 601). It seems the following code creates a strange memory allocation issue. (<a href="http://www.navision-blog.de/download/NavBug.txt">Download sample</a>)</p>
<pre><font color="#3c3c3c">OBJECT Codeunit 99500 NAV Bug
{
  OBJECT-PROPERTIES
  {
    Date=17.06.10;
    Time=14:30:30;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            TestMiddleCase;</font>  <font color="#008000">// comment this line out and ReverseString works!</font><font color="#3c3c3c">
            TestReverseString;
          END;

  }
  CODE
  {

    PROCEDURE TestMiddleCase@5128500();
    BEGIN
      MiddleCase('fooo AnD bar');
    END;

    PROCEDURE TestReverseString@5128502();
    VAR
      l_String@5128500 : Text[1024];
      l_Result@5128503 : Integer;
    BEGIN
      l_String :=
        '1101101111011011110110111101101111011011110110111101101111011011' +
        '1101101111011011110110111101101111011011110110111101101111011011' +
        '1101101111011011110110111101101111011011110110111101101111011011' +
        '1101101111011011110110111101101111011011110110111101101111011011' +
        '1101101111011011110110111101101111011011110110111101101111011011' +
        '1101101111011011110110111101101111011011110110111101101111011011' +
        '1101101111011011110110111101101111011011110110111101101111011011' +
        '1101101111011011110110111101101111011011110110111101101111011011';

      IF STRLEN(l_String) &lt;&gt; 512 THEN
        ERROR('Wrong strlen');

      l_Result := TestReverseStringSub(l_String);

      IF l_Result &lt;&gt; 512 THEN
        ERROR('Error: Actual: ' + FORMAT(l_Result) + ' ' + ' Expected: 512');
    END;

    PROCEDURE TestReverseStringSub@5128521(p_String@5128500 : Text[1024]) r_Int : Integer;
    VAR
      l_StringMgt@5128501 : Codeunit 5128519;
    BEGIN
      p_String := ReverseString(p_String);
      EXIT(STRLEN(p_String));
    END;

    PROCEDURE ReverseString@5128509(p_In@5128502 : Text[1024]) Result : Text[1024];
    VAR
      i@5128500 : Integer;
      l_Length@5128501 : Integer;
    BEGIN
      l_Length := STRLEN(p_In) + 1;

      FOR i := 1 TO l_Length - 1 DO
        Result[i] := p_In[l_Length-i];
    END;

    PROCEDURE MiddleCase@1000000000(p_StringToConvert@1000000000 : Text[250]) ConvertedString : Text[250];
    BEGIN
      ConvertedString :=
        UPPERCASE(COPYSTR(p_StringToConvert, 1, 1)) +
        LOWERCASE(COPYSTR(p_StringToConvert, 2));
    END;

    BEGIN
    END.
  }
}
</font></pre>
<p>Since we don’t do anything evil here my only advice is to <strong>initialize every return parameter with a default value</strong>. This seems to fix the bug.</p>
<pre><font color="#3c3c3c">
    PROCEDURE ReverseString@5128509(p_In@5128502 : Text[1024]) Result : Text[1024];
    VAR
      i@5128500 : Integer;
      l_Length@5128501 : Integer;
    BEGIN
      Result := ''; </font><font color="#008000">// Init return value – this fixes the issue!</font><font color="#3c3c3c">
      l_Length := STRLEN(p_In) + 1;

      FOR i := 1 TO l_Length - 1 DO
        Result[i] := p_In[l_Length-i];
    END;
</font></pre>
<p>Interestingly I didn’t find a smaller sample which reproduces this memory issue.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/07/07/strange-bug-in-dynamics-nav-client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CodingDojo in TDD &#8211; Die einfachste L&#246;sung siegt</title>
		<link>http://www.navision-blog.de/2010/06/20/codingdojo-in-tdd-die-einfachste-loesung-siegt/</link>
		<comments>http://www.navision-blog.de/2010/06/20/codingdojo-in-tdd-die-einfachste-loesung-siegt/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 18:27:48 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Coding Dojo]]></category>
		<category><![CDATA[Kata]]></category>
		<category><![CDATA[.Net Open Space Süd]]></category>
		<category><![CDATA[CodingDojo]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/06/20/codingdojo-in-tdd-die-einfachste-loesung-siegt/</guid>
		<description><![CDATA[Auf dem .NET OpenSpace S&#252;d in Karlsruhe hatte ich heute die Gelegenheit bei einem Coding Dojo mit Ilker Cetinkaya mitzumachen. Leider ist das Dojo nicht so richtig in Fahrt gekommen und wir haben es praktisch nicht geschafft auch nur eine einzige Regel der Kata.RomanNumerals zu implementieren. Der Grund daf&#252;r war (sicherlich nicht nur) aus meiner [...]]]></description>
			<content:encoded><![CDATA[<p>Auf dem <a href="http://karlsruhe.netopenspace.de">.NET OpenSpace S&#252;d</a> in Karlsruhe hatte ich heute die Gelegenheit bei einem Coding Dojo mit Ilker Cetinkaya mitzumachen. Leider ist das Dojo nicht so richtig in Fahrt gekommen und wir haben es praktisch nicht geschafft auch nur eine einzige Regel der Kata.RomanNumerals zu implementieren. Der Grund daf&#252;r war (sicherlich nicht nur) aus meiner Sicht, dass es zwei starke Fraktionen innerhalb des Teams gab. Auf der einen Seite “Coder”, die sich tats&#228;chlich von den Tests treiben lassen wollten und auf der anderen Seite eine Gruppe der “Knobler”, die sich nicht mit dem Test-first-Ansatz identifizieren k&#246;nnen und lieber am Board einen Algorithmus entwickeln.</p>
<p>Aus meiner Sicht sind beide Ans&#228;tze f&#252;r sich betrachtet auch v&#246;llig in Ordnung und k&#246;nnen zu sehr guten L&#246;sungen f&#252;hren.</p>
<p>Wer z.B. nicht glaubt, dass der strikte Test-first-Ansatz f&#252;r Kata.RomanNumerals funktioniert, der kann gern die Teilnehmer vom <a href="http://www.navision-blog.de/2010/06/18/bericht-vom-2-ten-net-coding-dojo-in-hamburg/">2.ten Hamburger Coding Dojo</a> fragen oder das <a href="http://github.com/forki/DojoHamburg/commits/master">github-Repository</a> dazu durch browsen und die Entwicklung der Commits verfolgen. </p>
<p>Was aber offensichtlich &#252;berhaupt nicht funktioniert ist der Mittelweg. Wenn sich beide Gruppen nicht auf das Vorgehen einigen und im Zweifel immer nur der “lauteste” &#196;nderungsvorschlag gewinnt, dann wird das Ergebnis mitunter unbefriedigend f&#252;r beide Seiten. Beim Karlsruher-Dojo hatten wir am Ende nach einer gescheiterten Implementierungsphase und abrupten Abbruch sogar nur 7 rote und einen gr&#252;nen Test vorzuweisen. Bei dem Gr&#252;nen frage ich momentan sogar immer noch warum ausgerechnet dieser Test &#252;berhaupt gelaufen ist.</p>
<p>Um also eine solche Situation zu vermeiden sollte man sich also am Anfang entscheiden wie man sein Dojo gemeinsam durchziehen will. Im weiteren werde ich jetzt eher auf die von mir favorisierte Variante mit striktem TDD eingehen, auch wenn mich eine Knobler-Session mit ausgepr&#228;gter Analysephase auch mal als Vergleichswert interessieren w&#252;rde. </p>
<p>Wie gesagt: Ich bin ausdr&#252;cklich davon &#252;berzeugt, dass beide L&#246;sungswege funktionieren k&#246;nnen – je nach Problem mal besser und mal schlechter.</p>
<h5>Striktes TDD und der einfachste L&#246;sungsvorschlag gewinnt</h5>
<p>Ein oft genanntes Argument der “Knobler”-Fraktion am TDD-Ansatz ist, dass nicht vorrausschauend entwickelt wird. Hey Jungs &#8211; das ist doch genau der Trick. Solange ich keine Anforderung f&#252;r irgendwelche Dinge habe (nicht im Kopf oder auf dem Papier, sondern als Test) wird keine Komplexit&#228;t hinzugef&#252;gt. Es wird dann behauptet, dass bei Test-first am Anfang sinnfreie Implementierungen gew&#228;hlt werden und dass man diesen Code am Ende ganz offensichtlich sowieso wieder wegschmei&#223;en w&#252;rde. Aber das stimmt einfach nicht. Auch wenn ich immer mehr Tests hinzunehme und meine Implementierung immer generischer wird, so wird die vorherige L&#246;sung letztlich immer ein Spezialfall der generischen Variante sein und geht somit nie verloren.</p>
<p>Gerade der Fokus auf diese minimal m&#246;gliche Generalsierung der aktuellen Implementierung sorgt daf&#252;r, dass der Algorithmus am Ende korrekt herausf&#228;llt. Das Knobeln kommt an dieser Stelle nat&#252;rlich wieder in den Ablauf herein. Allerdings knobeln wir so an wesentlich kleineren und damit leichteren Problemen&#160; – selbstverst&#228;ndlich nun viel &#246;fter und in k&#252;rzeren Zyklen.</p>
<p>Bei zuk&#252;nftigen Coding Dojos w&#252;rde ich also gern als Regel sehen, dass der einfachste Vorschlag, der zu Gr&#252;n f&#252;hrt implementiert wird.</p>
<h5>Temposteigerung durch gruppenweises Anlegen von roten Tests</h5>
<p>Zu bestimmten Zeitpunkten und insbesondere auch am Anfang von vielen Katas sieht man jedoch oft Implementierungsmuster die gleich eine ganze Klasse an Tests abdecken k&#246;nnten. Wenn man so eine Idee hat, dann sollte man die nat&#252;rlich auch nutzen und so das Tempo steigern. Anstatt aber diese Idee einfach zu programmieren w&#252;rde ich erst die komplette Gruppe von Tests schreiben und sicherstellen, dass alle neuen Tests auch wirklich &quot;rot sind. Dieser Shortcut ist aus meiner Sicht methodisch v&#246;llig unproblematisch, da zu diesem Zeitpunkt nur neue Anforderungen im System dokumentiert werden und diese dann als Begr&#252;ndung f&#252;r neue Komplexit&#228;t herangezogen werden k&#246;nnen.</p>
<p>Aber auch hier sollte die selbe Regel gelten: Die leichteste Implementierung gewinnt. Wenn also ein Teilnehmer eine einfachere L&#246;sung anbieten kann, dann wird die genommen.</p>
<h5>Training durch Wiederholung</h5>
<p>Wie Ilker in der Auswertung bereits gesagt hat, w&#252;rde ich auch gern nochmal in der selben Truppe ein Dojo machen. Vielleicht ergibt sich das ja sogar beim n&#228;chsten OpenSpace. Denn selbstverst&#228;ndlich geht es beim Coding Dojo nicht nur um Code sondern auch um die beteiligten Menschen.    <br />Obwohl wir am Ende keine L&#246;sung vorweisen konnten, habe ich in der kurzen Zeit sehr viel &#252;ber die Entwicklungsmethodik anderer Teilnehmer gelernt &#8211; ich denke das hat mir wirklich eine Menge gebracht.</p>
<h5>Training durch Wiederholung &#8211; Reloaded</h5>
<p>Da ein wichtiges Element bei Katas auch die Wiederholung ist (und mir im Zug langweilig ist), habe ich zus&#228;tzlich f&#252;r mich selbst und andere noch eine aufger&#228;umtere Variante der Kata mit minimalen Commits in das Repository hochgeladen. Unter <a title="http://github.com/forki/DojoHamburg/commits/Karlsruhe" href="http://github.com/forki/DojoHamburg/commits/Karlsruhe">http://github.com/forki/DojoHamburg/commits/Karlsruhe</a> kann man die &#196;nderungen von unten nach oben genau nachvollziehen. Wenn jemand ein Stelle findet wo ich zu viel implementiert habe oder wo die &#196;nderung nicht sinnvoll und einfach erscheint, dann w&#252;rde ich mich freuen dar&#252;ber diskutieren zu k&#246;nnen.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/06/20/codingdojo-in-tdd-die-einfachste-loesung-siegt/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Bericht vom 2.ten .NET Coding Dojo in Hamburg</title>
		<link>http://www.navision-blog.de/2010/06/18/bericht-vom-2-ten-net-coding-dojo-in-hamburg/</link>
		<comments>http://www.navision-blog.de/2010/06/18/bericht-vom-2-ten-net-coding-dojo-in-hamburg/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 18:52:37 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Coding Dojo]]></category>
		<category><![CDATA[Kata]]></category>
		<category><![CDATA[.NET User Group Hamburg]]></category>
		<category><![CDATA[CodingDojo]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/06/18/bericht-vom-2-ten-net-coding-dojo-in-hamburg/</guid>
		<description><![CDATA[Am Mittwoch hat die .NET User Group Hamburg das zweite .NET Coding Dojo in wunderbarer Lage im Neuen Wall durchgef&#252;hrt. Der Dank gilt diesmal Computer Futures, die uns freundlicherweise Raum, Beamer und Getr&#228;nke zur Verf&#252;gung gestellt haben. Ablauf Nach einer kurzen Reflektion des letzten Treffens und Kl&#228;rung der aufgetretenen Syntaxprobleme hat sich das Team daf&#252;r [...]]]></description>
			<content:encoded><![CDATA[<p>Am Mittwoch hat die <a href="https://www.xing.com/net/pri44e1d5x/dotnetusergrouphamburg/">.NET User Group Hamburg</a> das zweite .NET Coding Dojo in wunderbarer Lage im Neuen Wall durchgef&#252;hrt. Der Dank gilt diesmal <a href="http://www.computerfutures.com/de/ ">Computer Futures</a>, die uns freundlicherweise Raum, Beamer und Getr&#228;nke zur Verf&#252;gung gestellt haben.</p>
<h5>Ablauf</h5>
<p>Nach einer kurzen Reflektion des letzten Treffens und Kl&#228;rung der aufgetretenen Syntaxprobleme hat sich das Team daf&#252;r entschieden, die <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataRomanNumerals">Kata.RomanNumerals</a> zu implementieren. Wie beim <a href="http://www.navision-blog.de/2010/05/20/bericht-vom-ersten-net-coding-dojo-in-hamburg/">ersten Treffen</a> haben wir diese relativ einfache Kata auch wieder im Randori-Stil durchgef&#252;hrt. Da das Team relativ gleich geblieben ist, konnten wir den Ablauf jedoch leicht erweitern. Um etwas mehr Schwung in die Test-Phase zu bringen, habe ich vorgeschlagen immer in der Rot-Phase zu rotieren. Zus&#228;tzlich haben wir <a href="http://de.wikipedia.org/wiki/Git">git</a> als Versionskontrollsystem im Einsatz gehabt und bei jeder Gr&#252;n-Phase sowie nach Refactorings commited. Das Ergebnis kann auf meinem <a href="http://github.com/forki/DojoHamburg">Github-Account</a> bewundert werden.</p>
<h5>Kata</h5>
<p>Aus meiner Sicht bildet die Kata.RomanNumerals eine ideale Fortsetzung zur Kata.StringReplacer, die wir beim ersten Treffen hatten und ist praktisch perfekt mit Test-Driven Development l&#246;sbar. Insbesondere das nachtr&#228;gliche Implementieren der scheinbar komplizierten Subtraktionsregel ist wunderbar anhand von wenigen Sonderf&#228;llen (= UnitTests) l&#246;sbar.</p>
<h5>Was lief gut?</h5>
<ul>
<li>Die Rotation der Teilnehmer klappte wieder problemlos &#8211; Danke Jungs <img src='http://www.navision-blog.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>TDD wurde als sehr erfolgreich f&#252;r die Kata angesehen </li>
<li>Nahezu alle Teilnehmer waren &#252;berrascht wie einfach sich die Subtraktionsregel in TDD implementieren l&#228;sst </li>
<li>Die Randori-Form mit Rotation bei Rot sorgt f&#252;r Aktivit&#228;t </li>
<li>Es wurde immer versuchen die einfachste L&#246;sung zu w&#228;hlen </li>
<li>Die Rollen Driver, Co-Pilot und Publikum wurden klarer getrennt </li>
<li>Es wurde nach jedem implementierten Test in das git Repository commited </li>
<li>Ganz wichtig: Es hat wieder viel Spa&#223; gemacht! </li>
</ul>
<h5>Was wollen wir besser machen?</h5>
<ul>
<li>Noch mehr Wert auf das Naming legen </li>
<ul>
<li>&#220;berraschenderweise hat sich kein Team getraut die Namenskonvention des ersten Teams zu verbessern</li>
<li>Insbesondere auch die Commit-Kommentare sind noch nicht sehr aussagekr&#228;ftig</li>
</ul>
<li>In den Refactoring-Phasen sollten die Tools (Resharper) besser genutzt werden</li>
<li>Die Refactorings k&#246;nnten noch ausf&#252;hrlicher diskutiert werden</li>
<li>Von Anfang an externe Tastatur und Maus f&#252;r den Laptop bereit stellen </li>
<li>Internetverbindung um Syntaxfrage schneller kl&#228;ren zu k&#246;nnen</li>
<li>Parametrisierte Tests benutzen um weniger Test-Codierungsaufwand zu haben</li>
</ul>
<p>Vielen Dank an alle Teilnehmer – wir sehen uns dann beim n&#228;chsten Dojo.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/06/18/bericht-vom-2-ten-net-coding-dojo-in-hamburg/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Erstes internes CodingDojo bei der msu solutions GmbH in Halle</title>
		<link>http://www.navision-blog.de/2010/06/02/erstes-internes-codingdojo-bei-der-msu-solutions-gmbh-in-halle/</link>
		<comments>http://www.navision-blog.de/2010/06/02/erstes-internes-codingdojo-bei-der-msu-solutions-gmbh-in-halle/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 14:37:00 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[Coding Dojo]]></category>
		<category><![CDATA[Firmen]]></category>
		<category><![CDATA[msu solutions GmbH]]></category>
		<category><![CDATA[CodingDojo]]></category>
		<category><![CDATA[Dynamics NAV 2009]]></category>
		<category><![CDATA[msu-solutions-GmbH]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/06/02/erstes-internes-codingdojo-bei-der-msu-solutions-gmbh-in-halle/</guid>
		<description><![CDATA[Gestern haben wir bei der msu solutions GmbH am Standort Halle unser erstes internes CodingDojo veranstaltet. Ziele des internen Dojos Da wir in der tagt&#228;glichen Arbeit mit Microsoft Dynamics NAV entwickeln, wollten wir das Dojo auch mit Dynamics NAV und der Programmiersprache C/AL abhalten. Als wichtiges Ziel der Veranstaltung haben wir uns vorgenommen nach Test-Driven [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern haben wir bei der <a href="http://www.msu-solutions.de">msu solutions GmbH</a> am Standort Halle unser erstes internes <a href="http://codingdojo.org/cgi-bin/wiki.pl?WhatIsCodingDojo">CodingDojo</a> veranstaltet. </p>
<h5>Ziele des internen Dojos</h5>
<p>Da wir in der tagt&#228;glichen Arbeit mit Microsoft Dynamics NAV entwickeln, wollten wir das Dojo auch mit Dynamics NAV und der Programmiersprache C/AL abhalten. Als wichtiges Ziel der Veranstaltung haben wir uns vorgenommen nach Test-Driven Development (TDD) zu arbeiten. Da TDD im NAV-Bereich (sicherlich mangelns Tools und Community) noch so gut wie unbekannt und unser selbstentwickeltes Test-Framework noch sehr jung ist, war diese Selbstverpflichtung f&#252;r einige Team-Mitglieder in dieser strikten Form sicherlich noch Neuland.</p>
<h5>Ablauf</h5>
<p>Um die Messlatte f&#252;r das erste Dojo daher nicht allzu hoch zu legen und mehr Fokus auf den Versionsverwaltung (git), die Test-Tools und die Kommunikation bzw. den Prozess selbst zu richten habe ich die relativ einfachen Katas <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz">FizzBuzz</a> und <a href="http://codingdojo.org/cgi-bin/wiki.pl?KataDictionaryReplacer">DictionaryReplacer</a> vorgeschlagen. Das Team hat sich dann f&#252;r FizzBuzz entschieden.</p>
<p>Wie beim 1. NET CodingDojo in Hamburg gab es auch in Halle einige Startschwierigkeiten. Es scheint f&#252;r viele Entwickler aufgrund der jahrelangen Entwicklungspraxis sehr schwer zu sein, tats&#228;chlich zwischen Test und Implementierung zu unterscheiden. </p>
<p>Nachdem jedoch die ersten 3 Tests samt Implementierung geschafft und die explizite Trennung der Test- und Entwicklungsphasen erkannt wurden steigerte sich das Tempo des Teams enorm. So konnten wir dann auch Erweiterungen der Aufgabenstellung diskutieren und umsetzen.</p>
<p>Ich denke unser erstes msu Dojo war ein Erfolg und insbesondere die Wahl der Kata war f&#252;r die erste Veranstaltung dieser Art ausgezeichnet. F&#252;r das n&#228;chste Mal wollen wir uns dann nat&#252;rlich an eine schwierigere Kata wagen.</p>
<h5>Randori-Stil</h5>
<p>Da seit dem <a href="http://ralfw.blogspot.com/2010/05/coding-dojo-muc-retrospektive.html">”Dojo Deluxe” von und mit Ralf Westphal</a> eine Diskussion &#252;ber die Dojo-Formate aufgekommen ist, m&#246;chte ich hier auch noch meine Meinung dazu abgeben.</p>
<p>Da wir uns den <a href="http://codingdojo.org/cgi-bin/wiki.pl?RandoriKata">Randori-Stil</a> ausgesucht haben, gab es eigentlich vier verschiedene Rollen. Als erstes nat&#252;rlich den Driver und den Co-Piloten, also eine Person, die die Tastatur bedient und eine die sagt “wo es lang geht”. &#220;brig bleiben dann in unserer Version noch der Rest des Teams als Publikum und ein Moderator. Da es die erste Veranstaltung dieser Art war, gab es noch sehr viele Hinweise vom Moderator. Bei nachfolgenden Veranstaltungen w&#252;rde ich mir w&#252;nschen, dass der Moderator immer mehr in den Hintergrund r&#252;ckt und die jeweiligen Co-Piloten deutlich aktiver werden. Das Publikum k&#246;nnte noch mehr als das Kontrollorgan fungieren und auf Einhaltung der selbst auferlegten Richtlinien pochen. Als wichtigen Punkt f&#252;r nachfolgende Veranstaltungen w&#252;rde ich also noch eine klarere Trennung der Rollen sehen und dem Team mehr Eigenverantwortung auferlegen.</p>
<h5>Randori-Stil vs. Tutorial</h5>
<p>Die Bef&#228;higung des Teams den Entwicklungsprozess ohne starke f&#252;hrende Hand selbst zu kontrollieren ist f&#252;r mich ein Kernziel bei einem CodingDojo. Ich denke hier unterscheidet sich der Randori-Stil (jedenfalls wie ich ihn bisher verstehe) stark von der Variante und den Zielstellungen die Ralf Westphal in seinem Dojo in M&#252;nchen abgehalten hat. Wie <a href="http://www.gmbsg.com/uber-das-ziel-von-coding-dojos-ii/">Ilker Cetinkaya</a> auch schon geschrieben hat ist Ralf’s Dojo-Variante wahrscheinlich n&#228;her am klassischen Workshop oder am Tutorial einzuordnen. Daran ist nat&#252;rlich nichts falsch, ganz im Gegenteil: ich finde solche Workshops mit erfahrenen und charismatischen Sprechern extrem reizvoll. Insbesondere weil man bei einem Workshop aufgrund der intensiveren Vorbereitung des Sprechers in der k&#252;rzeren Zeit eine weit h&#246;here fachliche Tiefe erreicht und man im Gegensatz zu klassischen Frontal-Vortr&#228;gen auch mehr R&#252;ckfragen stellen kann. Ralf hat sich dazu in seinem <a href="http://ralfw.blogspot.com/2010/05/gezieltes-coding-dojo.html">Blog ja auch intensiv und fundiert Gedanken gemacht</a>. </p>
<p>“Einer wei&#223; etwas und die anderen wollen es von ihm lernen”-Formate wie Ralf sie beschreibt sind also auch aus meiner Sicht sehr n&#252;tzlich und bilden vermutlich sogar die Voraussetzung f&#252;r ein Randori. Wenn nicht genug Leute im Raum bereits etwas &#252;ber die zu benutzenden Techniken oder Methoden geh&#246;rt haben, dann wird das Dojo bzw. das gemeinsame Lernen und Lehren vermutlich sehr z&#228;h und der Moderator wird zum Hauptakteur. Es ist somit auch v&#246;llig einleuchtend, dass Ralf seine <a href="http://ralfw.blogspot.com/2010/02/event-based-components-der-nachste.html">Event-Based Components</a> nat&#252;rlich nicht in einem Randori vorstellen kann. Das w&#228;re dann wohl beim einem leeren FlipChart geblieben und ganz sicher auch eine Entt&#228;uschung f&#252;r alle Seiten.</p>
<p>Wenn jedoch hinreichend viele Leute bereits Erfahrungen mit der Materie gemacht haben, dann gibt es vermutlich auch unterschiedliche Interpretationen. Diese w&#252;rde ich aber nicht so drastisch wie Ralf als “Unsicherheit” auslegen, sondern eher als Chance die Varianten gemeinsam zu diskutieren und Unklarheiten auszur&#228;umen. Dabei muss es am Ende aber nicht zwingend einen Konsens geben.</p>
<p>Daher denke ich, dass auch ein Format mit weit weniger Moderation bzw. Anleitung wichtig ist, insbesondere auch um das bisher Erlernte in einer sicheren Umgebung zu testen und echtes TeamPlay zu trainieren. Den Begriff “Dojo” ausschlie&#223;lich f&#252;r solche freien Formate zu verwenden, ist wie Ralf beschrieben hat aus historischer Sicht wahrscheinlich eher ungeschickt. Dem stimme ich zu.</p>
<p>Ich denke hier hat Ralf hat meine Twitter-Kommentare evtl. auch etwas &#252;berbewertet (140 Zeichen sind nat&#252;rlich oft auch missverst&#228;ndlich). Ich bin auch nicht daf&#252;r, dass alle Entwickler gleichgemacht werden sollen und es &#252;berhaupt keinen Lehrer gibt. Ganz im Gegenteil jeder soll sich einbringen, denn selbstverst&#228;ndlich sind immer unterschiedliche Wissengrade im Raum zu finden.</p>
<p>Dass alle etwas beisteuern klappt dann aber nur wenn die erfahreneren Entwickler sich auch mal darauf einlassen einen vorgeschlagenen “Irrweg” mit zu gehen und den Erkenntnisprozess so reifen zu lassen. Abgabe von Kontrolle ist zugegebenerma&#223;en nicht gerade einfach, aber manchmal wird man vielleicht auch als alter Hase noch &#252;berrascht werden.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/06/02/erstes-internes-codingdojo-bei-der-msu-solutions-gmbh-in-halle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bericht vom Ersten .NET Coding Dojo in Hamburg</title>
		<link>http://www.navision-blog.de/2010/05/20/bericht-vom-ersten-net-coding-dojo-in-hamburg/</link>
		<comments>http://www.navision-blog.de/2010/05/20/bericht-vom-ersten-net-coding-dojo-in-hamburg/#comments</comments>
		<pubDate>Thu, 20 May 2010 06:37:06 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Veranstaltungen]]></category>
		<category><![CDATA[.NET User Group Hamburg]]></category>
		<category><![CDATA[CodingDojo]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Test Driven Design]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/05/20/bericht-vom-ersten-net-coding-dojo-in-hamburg/</guid>
		<description><![CDATA[Gestern fand das erste .NET Coding Dojo in Hamburg statt und es war aus meiner Sicht ein voller Erfolg. Als erstes m&#246;chte ich mich an dieser Stelle bei der Firma masters of arts f&#252;r die R&#228;umlichkeit und nat&#252;rlich bei allen Teilnehmer f&#252;r die aktive Mitarbeit bedanken. Durchgef&#252;hrt haben wir das Dojo im Randori-Stil, d.h. es [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern fand das erste .NET Coding Dojo in Hamburg statt und es war aus meiner Sicht ein voller Erfolg. Als erstes m&#246;chte ich mich an dieser Stelle bei der Firma <a href="http://www.moaa.de">masters of arts</a> f&#252;r die R&#228;umlichkeit und nat&#252;rlich bei allen Teilnehmer f&#252;r die aktive Mitarbeit bedanken.</p>
<p><img style="border-right-width: 0px; margin: 0px 0px 10px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Erkl&#228;rungen" border="0" alt="Erkl&#228;rungen" align="right" src="http://www.tbi-halle.de/wp-content/uploads/BerichtvomErsten.NETCodingDojoinHamburg_5870/image.png" width="181" height="244" /> </p>
<p>Durchgef&#252;hrt haben wir das Dojo im <a href="http://codingdojo.org/cgi-bin/wiki.pl?RandoriKata">Randori-Stil</a>, d.h. es gab einen Entwickler, einen “Co-Piloten” und das Publikum. Nach jeweils 5 Minuten bzw. jedem neuen Testfall wurden die Positionen mit neuen Teilnehmer aus dem Publikum getauscht.</p>
<p>Nach einer kurzen allgemeinen Einf&#252;hrung in das Thema “Coding Dojo” habe ich die Aufgabenstellungen der Kata.FizzBuzz und Kata.DictionaryReplacer vorgestellt. Durch kurze Abstimmung haben wir dann (vermutlich durch meine Wortwahl beeinflusst) die Kata.DictionaryReplacer gew&#228;hlt.</p>
<p>Mit der Wahl dieser Kata war ich nicht ganz ungl&#252;cklich, da wir DictionaryReplacer schon im Online Dojo durchgenommen haben und ich deshalb die Fallstricke schon etwas einsch&#228;tzen konnte.</p>
<blockquote><p><strong>Kata.DictionaryReplacer</strong></p>
<p>Create a method that takes a string and a dictionary,      <br />and replaces every key in the dictionary pre and suffixed with a dollar sign,       <br />with the corresponding value from the Dictionary. </p>
<p>Tests </p>
<p>input : &quot;&quot;,      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dict empty       <br />output: &quot;&quot; </p>
<p>input : &quot;$temp$&quot;,&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dict [&quot;temp&quot;, &quot;temporary&quot;]       <br />output: &quot;temporary&quot; </p>
<p>input : &quot;$temp$ here comes the name $name$&quot;,      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dict [&quot;temp&quot;, &quot;temporary&quot;] [&quot;name&quot;, &quot;John Doe&quot;]       <br />output : &quot;temporary here comes the name John Doe&quot;</p>
<p align="right">[<a href="http://codingdojo.org/cgi-bin/wiki.pl?KataDictionaryReplacer">codingdojo.org</a>]</p>
</blockquote>
<p>Nach kurzer Einf&#252;hrung in die Vorgehensweise des Test-Driven Developments (TDD) und Diskussion &#252;ber sinnvolles Naming ging es dann auch richtig in die Entwicklung. Die Kata eignet sich in dieser Form auch sehr sch&#246;n um tats&#228;chlich “Test first” zu arbeiten. Die Implementierung folgt quasi als logische Konsequenz.</p>
<p><img style="border-right-width: 0px; margin: 0px 10px 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Das Publikum" border="0" alt="Das Publikum" align="left" src="http://www.tbi-halle.de/wp-content/uploads/BerichtvomErsten.NETCodingDojoinHamburg_5870/image_3.png" width="244" height="164" /> </p>
<p>Interessant und ungleich komplizierter wurde es dann als wir eine zus&#228;tzliche Anforderung eingebaut haben. Da es sich bei der Kata um eine Art Templatesystem handelt liegt es nahe auch in den Values des W&#246;rterbuchs neue Keys zu erlauben und somit eine beliebige Ersetzungstiefe zu erreichen. Diese Anforderung ist ein wunderbares Beispiel daf&#252;r wie sehr man mit Aufwandsabsch&#228;tzungen daneben liegen kann. <img src='http://www.navision-blog.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><img style="border-right-width: 0px; margin: 0px 0px 10px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Guter Rat ist teuer" border="0" alt="Guter Rat ist teuer" align="right" src="http://www.tbi-halle.de/wp-content/uploads/BerichtvomErsten.NETCodingDojoinHamburg_5870/image_4.png" width="244" height="156" /> </p>
<p>Die rekursive Ersetzung wurde noch sehr schnell gel&#246;st, aber richtig schwer haben wir uns dann mit der Erkennung von zyklischen Ersetzungen und der daraus folgenden Endlosschleife getan. Nach und nach wurden immer kompliziertere L&#246;sungsm&#246;glichkeiten genannt, die aber in der gegebenen Zeit nicht fehlerfrei umgesetzt werden konnten. Als Folge haben wir immer noch einen Test “rot”. Wer Lust hat kann sich also die Quellen vom <a href="http://github.com/forki/DojoHamburg">github Repository</a> ziehen und als Hausaufgabe den verbleibenden Test “gr&#252;n” machen.</p>
<p>In der Nachbetrachtung haben wir noch einige Sachen festgestellt:</p>
<h5>Was lief gut?</h5>
<ul>
<li>Die Rotation der Teilnehmer klappte problemlos </li>
<li>L&#246;sungsideen sprudelten f&#246;rmlich aus dem Publikum </li>
<li>Interessante Edge-Cases wurden gefunden </li>
<li>Viele kleine Tipps (z.B. Resharper Shortcuts) wurden ausgetauscht </li>
<li>TDD wurde als erfolgreich f&#252;r die Kata angesehen </li>
<li>Die Randori-Form sorgt f&#252;r Aktivit&#228;t </li>
<li>Ganz wichtig: Es hat Spa&#223; gemacht! </li>
</ul>
<h5>Was wollen wir besser machen?</h5>
<ul>
<li>Schneller den ersten Test schreiben </li>
<li>Intensivere Diskussion des Interfaces </li>
<li>Noch mehr Wert auf das Naming legen </li>
<li>Versuchen die einfachste L&#246;sung zu w&#228;hlen </li>
<li>Mehr Wert auf Refactoring legen
<ul>
<li>wurde etwas vernachl&#228;ssigt, da wir viel Zeit an der Endlosschleife verbraucht haben </li>
</ul>
</li>
<li>Die Rollen Driver, Co-Pilot und Publikum klarer trennen </li>
<li>Nach jedem implementierten Testcase bzw. jeder Rotation der Teilnehmer in das git Repository einchecken </li>
<li>Von Anfang an externe Tastatur und Maus f&#252;r den Laptop bereit stellen </li>
<li>Internetverbindung um Syntaxfrage schneller kl&#228;ren zu k&#246;nnen </li>
</ul>
<p>Als m&#246;glichen Termin f&#252;r das Dojo haben wir jetzt grob jeweils den 3. Mittwoch im Monat vorgeschlagen. &#220;ber die <a href="https://www.xing.com/net/pri2907edx/dotnetusergrouphamburg/">Xing-Gruppe der .NET User Group Hamburg</a> werden wir nat&#252;rlich auch wieder entsprechende Einladungen verschicken.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/05/20/bericht-vom-ersten-net-coding-dojo-in-hamburg/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#8220;FAKE &#8211; F# Make&#8221; 1.20.0 released</title>
		<link>http://www.navision-blog.de/2010/05/12/fake-f-make-1-20-0-released/</link>
		<comments>http://www.navision-blog.de/2010/05/12/fake-f-make-1-20-0-released/#comments</comments>
		<pubDate>Wed, 12 May 2010 12:26:43 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[F#]]></category>
		<category><![CDATA[FAKE - F# Make]]></category>
		<category><![CDATA[F-sharp Make]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/05/12/fake-f-make-1-20-0-released/</guid>
		<description><![CDATA[Today I released a new bugfix release for “FAKE – F# Make”. We fixed some path and logging issues and as a new feature we introduced the @@ operator which allows to combine paths. Download Repository &#169;2010 Rash thoughts about .NET, C#, F# and Dynamics NAV.. All Rights Reserved..]]></description>
			<content:encoded><![CDATA[<p>Today I released a new bugfix release for “FAKE – F# Make”. We fixed some path and logging issues and as a new feature we introduced the <a href="http://github.com/forki/FAKE/commit/540f8bc19b4a9dccecdee82ced779b7ac5036668">@@ operator</a> which allows to combine paths.</p>
<ul>
<li><a href="http://bitbucket.org/forki/fake/downloads">Download</a> </li>
<li><a href="http://github.com/forki/FAKE">Repository</a> </li>
</ul>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/05/12/fake-f-make-1-20-0-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using a MailboxProcessor to speedup &#8220;FAKE &#8211; F# MAKE&#8221;</title>
		<link>http://www.navision-blog.de/2010/05/07/using-a-mailboxprocessor-to-speedup-fake-f-make/</link>
		<comments>http://www.navision-blog.de/2010/05/07/using-a-mailboxprocessor-to-speedup-fake-f-make/#comments</comments>
		<pubDate>Fri, 07 May 2010 11:37:28 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[F#]]></category>
		<category><![CDATA[FAKE - F# Make]]></category>
		<category><![CDATA[F-sharp Make]]></category>
		<category><![CDATA[Fake]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/05/07/using-a-mailboxprocessor-to-speedup-fake-f-make/</guid>
		<description><![CDATA[Earlier today I released “FAKE – F# Make” version 1.10.0. This new release contains a lot path issue fixes for Mono and a new architecture for logging and tracing. A guy named Joel Mueller had an awesome idea and sent me some patches. He noticed that TraceHelper.fs writes all messages synchronously to the console and/or [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier today I released <a href="http://bitbucket.org/forki/fake/downloads">“FAKE – F# Make” version 1.10.0</a>. This new release contains a lot path issue fixes for <a href="http://www.mono-project.com/Main_Page">Mono</a> and a new architecture for logging and tracing. </p>
<p>A guy named Joel Mueller had an awesome idea and sent me some patches. He noticed that TraceHelper.fs writes all messages synchronously to the console and/or a XML output file, which means the actual build operations must wait on the writing of hundreds of trace messages, slowing down the actual build.</p>
<p>His idea was to use a MailboxProcessor to buffer up the trace messages and write them out asynchronously, so that the actual build can proceed at full speed.</p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: blue">type</span> Message = </p>
<p style="margin: 0px">&#160;&#160;&#160; { Text&#160;&#160;&#160;&#160;&#160; : string</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160; Color&#160;&#160;&#160;&#160; : ConsoleColor</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160; Newline&#160;&#160; : bool</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160; Important : bool}</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: green">/// &#8230;.</span></p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px"><span style="color: blue">let</span> buffer = MailboxProcessor.Start (<span style="color: blue">fun</span> inbox <span style="color: blue">-&gt;</span></p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: blue">let</span> <span style="color: blue">rec</span> loop () = </p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; async {</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">let!</span> (msg:Message) = inbox.Receive()</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">match</span> traceMode <span style="color: blue">with</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Console <span style="color: blue">-&gt;</span> logMessageToConsole msg</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | Xml&#160;&#160;&#160;&#160; <span style="color: blue">-&gt;</span> appendXML msg.Text</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: blue">return!</span> loop ()}</p>
<p style="margin: 0px">&#160;</p>
<p style="margin: 0px">&#160;&#160;&#160; loop ())&#160;&#160;&#160;&#160;&#160; </p>
</p></div>
<p>Now all internal logging and tracing functions can post their their messages to the inbox of the MailboxProcessor:</p>
<div style="font-family: courier new; background: white; color: black; font-size: 10pt">
<p style="margin: 0px"><span style="color: green">/// Logs the specified string (via message buffer)</span></p>
<p style="margin: 0px"><span style="color: blue">let</span> logMessage important newLine message =</p>
<p style="margin: 0px">&#160;&#160;&#160; <span style="color: blue">match</span> traceMode <span style="color: blue">with</span></p>
<p style="margin: 0px">&#160;&#160;&#160; | Console <span style="color: blue">-&gt;</span></p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; { Text = message; </p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Important = important; </p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Newline = newLine; </p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Color = ConsoleColor.White }</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&gt; buffer.Post</p>
<p style="margin: 0px">&#160;&#160;&#160; | Xml&#160;&#160;&#160;&#160; <span style="color: blue">-&gt;</span> </p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; { defaultMessage <span style="color: blue">with</span> </p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Text = sprintf <span style="color: maroon">&quot;&lt;message&gt;&lt;![CDATA[%s]]&gt;&lt;/message&gt;&quot;</span> </p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; message }</p>
<p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; |&gt; buffer.Post </p>
</p></div>
<p>This idea reduces the build time of FAKE’s self build from 3 min. to 2 min. Which is really amazing, since I didn’t have to change anything in the build script. This version is compatible to the last released version.</p>
<p>Please download <a href="http://bitbucket.org/forki/fake/downloads">“FAKE – F# Make” version 1.10.0</a> and tell me what you think.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/05/07/using-a-mailboxprocessor-to-speedup-fake-f-make/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Erstes .NET Coding Dojo in Hamburg</title>
		<link>http://www.navision-blog.de/2010/05/03/erstes-net-coding-dojo-in-hamburg/</link>
		<comments>http://www.navision-blog.de/2010/05/03/erstes-net-coding-dojo-in-hamburg/#comments</comments>
		<pubDate>Mon, 03 May 2010 14:42:10 +0000</pubDate>
		<dc:creator>Steffen Forkmann</dc:creator>
				<category><![CDATA[Coding Dojo]]></category>
		<category><![CDATA[Kata]]></category>
		<category><![CDATA[.NET User Group Hamburg]]></category>
		<category><![CDATA[code kata]]></category>

		<guid isPermaLink="false">http://www.navision-blog.de/2010/05/03/erstes-net-coding-dojo-in-hamburg/</guid>
		<description><![CDATA[Inspiriert von Coding Dojos in M&#252;nchen und Berlin veranstaltet die .NET User Group Hamburg am 19.5. das erste .NET Coding Dojo in Hamburg. 1. .NET Coding Dojo Hamburg 19.05.2010 – 19 Uhr Masters of Arts Anwendungsentwicklung GmbH Johannes Brahms Platz 9 20355 Hamburg Anmeldung &#252;ber Xing Hintergrund Bei einem Coding Dojo treffen sich Software-Entwickler um [...]]]></description>
			<content:encoded><![CDATA[<p>Inspiriert von Coding Dojos in <a href="http://www.gmbsg.com/works/index.php?title=.NET_Coding_Dojo_Muenchen">M&#252;nchen</a> und <a href="http://www.altnetberlin.de/Termine/coding-dojo">Berlin</a> veranstaltet die .NET User Group Hamburg am 19.5. das erste .NET Coding Dojo in Hamburg. </p>
<blockquote><p><strong>1. .NET Coding Dojo Hamburg</strong></p>
<p>19.05.2010 – 19 Uhr</p>
<p>Masters of Arts Anwendungsentwicklung GmbH      <br />Johannes Brahms Platz 9       <br />20355 Hamburg</p>
<p><a href="https://www.xing.com/events/coding-dojo-506845">Anmeldung &#252;ber Xing</a></p>
</blockquote>
<h4>Hintergrund</h4>
<p>Bei einem Coding Dojo treffen sich Software-Entwickler um ihre F&#228;higkeiten beim gemeinsamen L&#246;sen einer Programmieraufgabe (der sogenannten Code-Kata) zu verbessern. Dabei soll vor allem der Spa&#223; im Vordergrund stehen. Folgende Grunds&#228;tze gelten:</p>
<ul>
<li>Das Dojo ist nicht konkurrenzbetont sondern gemeinschafts- und spa&#223;orientiert. </li>
<li>Vom Einsteiger bis zum erfahrenen Softwareentwickler ist jeder willkommen. </li>
<li>L&#246;sungen werden im Team erarbeitet, gemeinsam umgesetzt und gemeinsam pr&#228;sentiert. </li>
<li>Zur L&#246;sung m&#252;ssen Tests geschrieben werden. </li>
<li>Es gibt keine Musterl&#246;sung! Die L&#246;sungsm&#246;glichkeiten sind bewusst offen und geben Raum f&#252;r unterschiedlichste Entscheidungen. Interessant ist insbesondere das gegenseitige Anleiten und Lehren. </li>
</ul>
<p>[nach <a title="http://codingdojo.org/" href="http://codingdojo.org/">http://codingdojo.org/</a> und <a title="http://www.altnetberlin.de/" href="http://www.altnetberlin.de/">http://www.altnetberlin.de/</a>]</p>
<h5>RandoriKata</h5>
<p>Es gibt verschiedene M&#246;glichkeiten ein Coding Dojo abzuhalten. F&#252;r unser erstes Treffen wollen wir die sogenannte RandoriKata-Version probieren. Dabei wird die Problemstellung wird von einem Entwickler-Duo gel&#246;st (Driver und Copilot). Alle anderen Personen sind jedoch eingeladen sich aktiv an der L&#246;sung zu beteiligen und dem Entwickler-Duo Hilfestellungen und Hinweise zu geben. Nach einer gewissen Zeit (ca. 7 Minuten) wird das Duo ausgetauscht und die n&#228;chsten Entwickler haben die Chance die L&#246;sung voranzutreiben.</p>
<p>Die <a href="https://www.xing.com/events/coding-dojo-506845">Anmeldung</a> ist &#252;ber Xing m&#246;glich.</p>
<p>&copy;2010 <a href="http://www.navision-blog.de">Rash thoughts about .NET, C#, F# and Dynamics NAV.</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.navision-blog.de/2010/05/03/erstes-net-coding-dojo-in-hamburg/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
