<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0">
  <channel>
    <title>deepdark.net - James Green's Blog - Continuous-Integration</title>
    <link>http://deepdark.net/</link>
    <description>.NET, SQL Server and *.*</description>
    <image>
      <url>http://deepdark.net/files/deepdark.jpg</url>
      <title>deepdark.net - James Green's Blog - Continuous-Integration</title>
      <link>http://deepdark.net/</link>
    </image>
    <language>en-us</language>
    <copyright>James Green</copyright>
    <lastBuildDate>Thu, 31 May 2007 08:04:38 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>James.Green@deepdark.net</managingEditor>
    <webMaster>James.Green@deepdark.net</webMaster>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=63feef59-944c-4878-b092-2a36d7fa14f4</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,63feef59-944c-4878-b092-2a36d7fa14f4.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,63feef59-944c-4878-b092-2a36d7fa14f4.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=63feef59-944c-4878-b092-2a36d7fa14f4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There are not too many things I hate in the world.  Popcorn is one (no joke)
another is the feeling you get when you discover something cool in the .NET Framework
or Visual Studio and think: <strong>Damn!  Why didn't I find this sooner</strong>.
I call it the <em>Last one to the party </em>Feeling.
</p>
        <p>
Today, I'm talking about the <font color="#2b91af" size="2">SuppressMessageAttribute</font> class
(<a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.codeanalysis.suppressmessageattribute.aspx">MSDN
Link</a>).
</p>
        <p>
This attribute can decorate a class where you would like explicitly exclude a module
matching a rule in FxCop due to a false positive.  Really it is no different
to excluding the message in the FxCop project, but I think this is better because
of how visible it is.  
</p>
        <p>
When you exclude a message in the FxCop project it gets sucked into a black hole and
you never see them again.  What if they are just a short term exclusion, like
the old fav <b><font color="#000080" size="2">Microsoft.Design.AvoidNamespacesWithFewTypes 
</font></b>- which may apply at the start of a project but not once it is off the
ground.  Who is going to go and un-Exclude it from the FxCop project?
</p>
        <p>
Also, this attribute takes named parameters, like Justification.  Again, FxCop
lets you put a note in when excluding in the FxCop project but it gets lost to all
but the most determined eyes.  Having the reason for the exclusion right there
in the code means it has a better chance of getting on-going attention as it may not
always be as valid as it is today through circumstance or refactoring.
</p>
        <p>
This attribute requires you to define a symbol - CODE_ANALYSIS.  In NAnt you
can add <font color="#ff0000" size="2">define</font><font color="#0000ff" size="2">=</font><font color="#000000" size="2">"</font><font color="#0000ff" size="2">CODE_ANALYSIS</font><font size="2"><font color="#000000">"</font> on
your CSC or VBC Task and/or define the symbol in your Project properties, depending
on how you build:</font></p>
        <p>
          <font size="2">
            <img src="http://deepdark.net/content/binary/DefineCodeAnalysis.jpg" border="0" />
          </font>
        </p>
      </body>
      <title>FxCop and the SuppressMessageAttribute class</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,63feef59-944c-4878-b092-2a36d7fa14f4.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,63feef59-944c-4878-b092-2a36d7fa14f4.aspx</link>
      <pubDate>Thu, 31 May 2007 08:04:38 GMT</pubDate>
      <description>&lt;p&gt;
There are not too many things I hate in the world.&amp;nbsp; Popcorn is one (no joke)
another is the feeling you get when you discover something cool in the .NET Framework
or Visual Studio and think: &lt;strong&gt;Damn!&amp;nbsp; Why didn't I find this sooner&lt;/strong&gt;.
I call it the &lt;em&gt;Last one to the party &lt;/em&gt;Feeling.
&lt;/p&gt;
&lt;p&gt;
Today, I'm talking about the &lt;font color=#2b91af size=2&gt;SuppressMessageAttribute&lt;/font&gt; class
(&lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.codeanalysis.suppressmessageattribute.aspx"&gt;MSDN
Link&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
This attribute can decorate a class where you would like explicitly exclude a module
matching a rule in FxCop due to a false positive.&amp;nbsp; Really it is no different
to excluding the message in the FxCop project, but I think this is better because
of how visible it is.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
When you exclude a message in the FxCop project it gets sucked into a black hole and
you never see them again.&amp;nbsp; What if they are just a short term exclusion, like
the old fav &lt;b&gt;&lt;font color=#000080 size=2&gt;Microsoft.Design.AvoidNamespacesWithFewTypes 
&lt;/b&gt;&gt;- which may apply at the start of a project but not once it is off the ground.&amp;nbsp;
Who is going to go and un-Exclude it from the FxCop project?
&lt;/p&gt;
&lt;p&gt;
Also, this attribute takes named parameters, like Justification.&amp;nbsp; Again, FxCop
lets you put a note in when excluding in the FxCop project but it gets lost to all
but the most determined eyes.&amp;nbsp; Having the reason for the exclusion right there
in the code means it has a better chance of getting on-going attention as it may not
always be as valid as it is today through&amp;nbsp;circumstance or refactoring.
&lt;/p&gt;
&lt;p&gt;
This attribute requires you to define a symbol - CODE_ANALYSIS.&amp;nbsp; In NAnt you
can add &lt;font color=#ff0000 size=2&gt;define&lt;/font&gt; &lt;font color=#0000ff size=2&gt;=&lt;/font&gt; &lt;font color=#000000 size=2&gt;"&lt;/font&gt;&lt;font color=#0000ff size=2&gt;CODE_ANALYSIS&lt;/font&gt;&lt;font size=2&gt;&lt;font color=#000000&gt;"&lt;/font&gt; on
your CSC or VBC Task and/or define the symbol in your Project properties, depending
on how you build:&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;&lt;img src="http://deepdark.net/content/binary/DefineCodeAnalysis.jpg" border=0&gt;&lt;/font&gt;
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,63feef59-944c-4878-b092-2a36d7fa14f4.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=b77aac01-fdec-4e60-984e-192722f69b41</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,b77aac01-fdec-4e60-984e-192722f69b41.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,b77aac01-fdec-4e60-984e-192722f69b41.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b77aac01-fdec-4e60-984e-192722f69b41</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've just got a couple of lessons from the last week to share around developing Office
2003 (and <span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-AU; mso-fareast-language: EN-AU; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">specifically </span>Visio
2003) Add-Ins
</p>
        <p>
I'm also trying to saturate this post with links because I have come up with a good
size folder in my bookmarks for what started out to be a simple task.
</p>
        <ul>
          <li>
            <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=3c9a983a-ac14-4125-8ba0-d36d67e0f4ad&amp;DisplayLang=en">Grab
the PIA's</a>.  <a href="http://msdn2.microsoft.com/en-us/library/aa169585(office.11).aspx">Anyone
who wants to run the Add-In will need them</a>.  Alternatively they can be installed
from the Office Add/Remove/Repair under the guise of <strong>.NET <span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-AU; mso-fareast-language: EN-AU; mso-bidi-language: AR-SA">Programmability </span>Support</strong>,
but in reality the user may not have the media or security access to do this. 
Do <strong>NOT</strong> however <a href="http://blogs.msdn.com/artleo/archive/2005/04/19/409715.aspx">ship
the PIA's <em>in</em> your bits</a>.  Ship the PIA's <em>with</em> your bits: 
This means 2x MSI's. 
</li>
          <li>
Using <a href="http://blogs.msdn.com/artleo/archive/2005/09/19/471497.aspx">NAant
to automate the build with csc.exe &amp; vbc.exe is suboptimal</a>.  I'm keeping
my project to one small assembly that depends on the PIAs, and also depends on another
assembly that does the heavy lifting but has no ref to the PIA's. 
</li>
          <li>
Strong Name everything.  Well, strong name everything anyway, but when trying
to pass of managed code as COM it is essential. 
</li>
          <li>
You cannot load a .NET DLL, even one with the <font face="Courier New">ComVisibleAttribute</font> on
the Assembly or Classes, via the Office UI.  You just can't.  <a href="http://support.microsoft.com/kb/316723">KB316723
gives an explanation</a>.  This is because Office will try and register it the
old<font face="Courier New"> regsvr32</font> way, which of course won't work. 
To get a .NET DLL into the Macros -&gt; Add-Ins list, <strong>you must write
the registry entry</strong> under: <font face="Courier New" color="#000000">HKEY_CURRENT_USER\Software\Microsoft\<em>&lt;office
program name&gt;</em>\Addins\</font></li>
          <li>
This brings me to my next point.  <a href="http://support.microsoft.com/kb/316723">KB316723</a> hints
at it, but your setup must write a HKCU key not a HKLM key.  <strong>The
Shared Add-In Wizard</strong> in Studio is ambiguous when it shows you this choice:</li>
        </ul>
        <p>
          <img src="http://deepdark.net/content/binary/20070529_4of5.jpg" border="0" />
        </p>
        <ul>
          <li>
I know this may be contentious, but consider using VB.NET over C#.  This depends
of course, but some parts of the Office object model make heavy use of Optional Parameters
which <a href="http://msdn2.microsoft.com/en-us/library/aa192488(office.11).aspx">C#
does not support</a>.  It has been <a href="http://msmvps.com/blogs/bill/archive/2006/03/28/88259.aspx">noted
elsewhere what Type.Missing can do for readability</a>.  Having said that,
it does vary greatly depending on where in the Office Object Model you are. 
</li>
          <li>
Spend some time with the Setup project that the Shared Add-In Wizard makes and test
it.  Once you like it, reverse engineer it to a WiX script and feed that to your
automated build.  For the record, you do that with: 
</li>
        </ul>
        <p>
          <font face="Courier New" color="#000000">Dark.exe –x path Debug/msi My.wxs 
<br />
Candle My.wxs 
<br />
Light My.Wixobj </font>
        </p>
        <ul>
          <li>
To extra points when dealing with WiX-ified MSI's 
<ol><li>
It's useful to note that the extracted (<font face="Courier New">-x</font>) resources take
many forms. <font face="Courier New"> DefBannerBitmap.ibd</font> for example
is just a bitmap.  I think it is easier to rename it to .bmp &amp; tweak it in
Photoshop than to add a new banner in Visual Studio. 
</li><li>
The Add-in reg setting mentioned in point #4 above references an assembly version. 
Visual Studio tweeks this for you but your WiX script will be frozen at the time your <font face="Courier New">Dark.exe'd</font> it. 
So don't auto-increment your assembly version numbers, or tweak you WiX script. 
The choice is yours but your MSI must write the version of the Add-In DLL to the target
machine's registry.</li></ol></li>
        </ul>
        <p>
          <font color="#808080">
            <strong>Listening To: Leftfield, Leftism</strong>
          </font>
        </p>
      </body>
      <title>Office Add-Ins - gotcha's from the field </title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,b77aac01-fdec-4e60-984e-192722f69b41.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,b77aac01-fdec-4e60-984e-192722f69b41.aspx</link>
      <pubDate>Tue, 29 May 2007 02:53:56 GMT</pubDate>
      <description>&lt;p&gt;
I've just got a couple of lessons from the last week to share around developing Office
2003 (and &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-AU; mso-fareast-language: EN-AU; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'"&gt;specifically &lt;/span&gt;Visio
2003) Add-Ins
&lt;/p&gt;
&lt;p&gt;
I'm also trying to saturate this post with links because I have come up with a good
size folder in my bookmarks for what started out to be a simple task.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=3c9a983a-ac14-4125-8ba0-d36d67e0f4ad&amp;amp;DisplayLang=en"&gt;Grab
the PIA's&lt;/a&gt;.&amp;nbsp; &lt;a href="http://msdn2.microsoft.com/en-us/library/aa169585(office.11).aspx"&gt;Anyone
who wants to run the Add-In will need them&lt;/a&gt;.&amp;nbsp; Alternatively they can be installed
from the Office Add/Remove/Repair under the guise of &lt;strong&gt;.NET &lt;span style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-AU; mso-fareast-language: EN-AU; mso-bidi-language: AR-SA"&gt;Programmability &lt;/span&gt;Support&lt;/strong&gt;,
but in reality the user may not have the media or security access to do this.&amp;nbsp;
Do &lt;strong&gt;NOT&lt;/strong&gt; however &lt;a href="http://blogs.msdn.com/artleo/archive/2005/04/19/409715.aspx"&gt;ship
the PIA's &lt;em&gt;in&lt;/em&gt; your bits&lt;/a&gt;.&amp;nbsp; Ship the PIA's &lt;em&gt;with&lt;/em&gt; your bits:&amp;nbsp;
This means 2x MSI's. 
&lt;li&gt;
Using &lt;a href="http://blogs.msdn.com/artleo/archive/2005/09/19/471497.aspx"&gt;NAant
to automate the build with csc.exe &amp;amp; vbc.exe is suboptimal&lt;/a&gt;.&amp;nbsp; I'm keeping
my project to one small assembly that depends on the PIAs, and also depends on another
assembly that does the heavy lifting but has no ref to the PIA's. 
&lt;li&gt;
Strong Name everything.&amp;nbsp; Well, strong name everything anyway, but when trying
to pass of managed code as COM it is essential. 
&lt;li&gt;
You cannot load a .NET DLL, even one with the &lt;font face="Courier New"&gt;ComVisibleAttribute&lt;/font&gt; on
the Assembly or Classes, via the Office UI.&amp;nbsp; You just can't.&amp;nbsp; &lt;a href="http://support.microsoft.com/kb/316723"&gt;KB316723
gives an explanation&lt;/a&gt;.&amp;nbsp; This is because Office will try and register it the
old&lt;font face="Courier New"&gt; regsvr32&lt;/font&gt; way, which of course won't work.&amp;nbsp;
To get a .NET DLL into the Macros -&amp;gt; Add-Ins list,&amp;nbsp;&lt;strong&gt;you must write
the registry entry&lt;/strong&gt; under: &lt;font face="Courier New" color=#000000&gt;HKEY_CURRENT_USER\Software\Microsoft\&lt;em&gt;&amp;lt;office
program name&amp;gt;&lt;/em&gt;\Addins\&lt;/font&gt; 
&lt;li&gt;
This brings me to my next point.&amp;nbsp; &lt;a href="http://support.microsoft.com/kb/316723"&gt;KB316723&lt;/a&gt; hints
at it, but&amp;nbsp;your setup must write a HKCU key not a HKLM key.&amp;nbsp; &lt;strong&gt;The
Shared Add-In Wizard&lt;/strong&gt; in Studio is ambiguous when it shows you this choice:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img src="http://deepdark.net/content/binary/20070529_4of5.jpg" border=0&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
I know this may be contentious, but consider using VB.NET over C#.&amp;nbsp; This depends
of course, but some parts of the Office object model make heavy use of Optional Parameters
which &lt;a href="http://msdn2.microsoft.com/en-us/library/aa192488(office.11).aspx"&gt;C#
does not support&lt;/a&gt;.&amp;nbsp;&amp;nbsp;It has been &lt;a href="http://msmvps.com/blogs/bill/archive/2006/03/28/88259.aspx"&gt;noted
elsewhere what Type.Missing&amp;nbsp;can do for readability&lt;/a&gt;.&amp;nbsp; Having said that,
it does vary greatly depending on where in the Office Object Model you are. 
&lt;li&gt;
Spend some time with the Setup project that the Shared Add-In Wizard makes and test
it.&amp;nbsp; Once you like it, reverse engineer it to a WiX script and feed that to your
automated build.&amp;nbsp; For the record, you do that with: 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;font face="Courier New" color=#000000&gt;Dark.exe –x path Debug/msi My.wxs 
&lt;br&gt;
Candle My.wxs 
&lt;br&gt;
Light My.Wixobj &lt;/font&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
To extra points when dealing with WiX-ified MSI's 
&lt;ol&gt;
&lt;li&gt;
It's useful to note that the extracted (&lt;font face="Courier New"&gt;-x&lt;/font&gt;) resources&amp;nbsp;take
many forms.&amp;nbsp;&lt;font face="Courier New"&gt; DefBannerBitmap.ibd&lt;/font&gt; for example
is just a bitmap.&amp;nbsp; I think it is easier to rename it to .bmp &amp;amp; tweak it in
Photoshop than to add a new banner in Visual Studio. 
&lt;li&gt;
The Add-in reg setting mentioned in point #4 above references an assembly version.&amp;nbsp;
Visual Studio tweeks this for you but your WiX script will be frozen at the time your &lt;font face="Courier New"&gt;Dark.exe'd&lt;/font&gt; it.&amp;nbsp;
So don't auto-increment your assembly version numbers, or tweak you WiX script.&amp;nbsp;
The choice is yours but your MSI must write the version of the Add-In DLL to the target
machine's registry.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;font color=#808080&gt;&lt;strong&gt;Listening To: Leftfield, Leftism&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,b77aac01-fdec-4e60-984e-192722f69b41.aspx</comments>
      <category>C#</category>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
      <category>WiX</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=89ddc46b-28c5-49ec-8aca-33311e2a0ba9</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,89ddc46b-28c5-49ec-8aca-33311e2a0ba9.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,89ddc46b-28c5-49ec-8aca-33311e2a0ba9.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=89ddc46b-28c5-49ec-8aca-33311e2a0ba9</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I think it is fair to say <a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET">CruiseControl.NET</a> has
become synonymous with Continuous Integration in the .NET space.  In <a href="http://www.dotnetrocks.com/default.aspx?showNum=238">the
recent DNR on CI* with Eric Sink and Martin Woodward</a> it was the defacto choice
for the discussion and with good reason.  CCNet is a great tool.
</p>
        <p>
I just wanted to give a quick shout-out to Draco.NET which is also a CI server for
.NET and while not having the broad featureset of CCNet I recommend it for smaller
shops getting their first Continuous/Automated build together.  <strong>My two
reasons are:</strong></p>
        <ul>
          <li>
Supports Visual Source Safe, which like it or not is the <em><a href="http://en.wikipedia.org/wiki/Gateway_drug">Gateway
Drug</a></em> for source code control.  <em><font color="#808080">(To hear what
I think of that go grab DNR #221 about 5min16sec in ;)</font></em>  It also supports
PVCS, Subversion and Vault.</li>
          <li>
It is so much easier to configure.  You have no options for reporting or postbuild
steps, or overriding the build ID or RSS add-ons for.  <a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=ccnetconfig">CCNetConfig</a> is
essential for configuring CruiseControl.NET.  Draco.NET offers a <a href="http://blogs.msdn.com/brada/archive/2003/10/02/50420.aspx">pit
of success</a> for the folks new to CI.</li>
        </ul>
        <p>
The most compelling reason for CCNet over Draco.NET is <strong>Everyone else is using
CCNet </strong>:-)
</p>
        <p>
On the topic of DNR show #238 - Eric talks about <a href="http://www.sourcegear.com/vault/">Vault</a>,
but doesn't mention that <a href="http://www.sourcegear.com/vault/pricing.html">you
don't need to purchase a license when used for a single developer</a>.  It is
licensed by named accounts, so go get it and give it a go all you VSS folks!
</p>
        <p>
*the best bit of the show is 11min45sec in... ;-)
</p>
        <p>
          <strong>
            <font color="#808080">Listening To: Ani Difranco - Revelling and Reckoning</font>
          </strong>
        </p>
      </body>
      <title>CI:  The Happy Meal and the Buffet</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,89ddc46b-28c5-49ec-8aca-33311e2a0ba9.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,89ddc46b-28c5-49ec-8aca-33311e2a0ba9.aspx</link>
      <pubDate>Mon, 21 May 2007 10:06:12 GMT</pubDate>
      <description>&lt;p&gt;
I think it is fair to say &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.NET&lt;/a&gt; has
become synonymous with Continuous Integration in the .NET space.&amp;nbsp; In &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=238"&gt;the
recent DNR on CI* with Eric Sink and Martin Woodward&lt;/a&gt; it was the defacto choice
for the discussion and with good reason.&amp;nbsp; CCNet is a great tool.
&lt;/p&gt;
&lt;p&gt;
I just wanted to give a quick shout-out to Draco.NET which is also a CI server for
.NET and while not having the broad featureset of CCNet I recommend it for smaller
shops getting their first Continuous/Automated build together.&amp;nbsp; &lt;strong&gt;My two
reasons are:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Supports Visual Source Safe, which like it or not is the &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Gateway_drug"&gt;Gateway
Drug&lt;/a&gt;&lt;/em&gt; for source code control.&amp;nbsp; &lt;em&gt;&lt;font color=#808080&gt;(To hear what
I think of that go grab DNR #221 about 5min16sec in ;)&lt;/font&gt;&lt;/em&gt;&amp;nbsp; It also supports
PVCS, Subversion and Vault.&lt;/li&gt;
&lt;li&gt;
It is so much easier to configure.&amp;nbsp; You have no options for reporting or postbuild
steps, or overriding the build ID or RSS add-ons for. &amp;nbsp;&lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=ccnetconfig"&gt;CCNetConfig&lt;/a&gt; is
essential for configuring CruiseControl.NET.&amp;nbsp; Draco.NET offers a &lt;a href="http://blogs.msdn.com/brada/archive/2003/10/02/50420.aspx"&gt;pit
of success&lt;/a&gt; for the folks new to CI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The most compelling reason for CCNet over Draco.NET is &lt;strong&gt;Everyone else is using
CCNet &lt;/strong&gt;:-)
&lt;/p&gt;
&lt;p&gt;
On the topic of DNR show #238 - Eric talks about &lt;a href="http://www.sourcegear.com/vault/"&gt;Vault&lt;/a&gt;,
but doesn't mention that &lt;a href="http://www.sourcegear.com/vault/pricing.html"&gt;you
don't need to purchase a license when used for a single developer&lt;/a&gt;.&amp;nbsp; It is
licensed by named accounts, so go get it and give it a go all you VSS folks!
&lt;/p&gt;
&lt;p&gt;
*the best bit of the show is 11min45sec in... ;-)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font color=#808080&gt;Listening To: Ani Difranco - Revelling and Reckoning&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,89ddc46b-28c5-49ec-8aca-33311e2a0ba9.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=55ab833e-9f7e-41d3-822b-d9280ef057ac</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,55ab833e-9f7e-41d3-822b-d9280ef057ac.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,55ab833e-9f7e-41d3-822b-d9280ef057ac.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=55ab833e-9f7e-41d3-822b-d9280ef057ac</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I was looking today at options for finishing a build with something other than an
MSI or folder full of files:  <strong>An ISO file</strong>.
</p>
        <p>
I am a fan of <a href="http://www.daemon-tools.cc/dtcc/download.php">DaemonTools</a> and
associated add-ons.  Even if you're not planning to burn to disc, an ISO file
can be a useful way of getting a bunch of files around the place.
</p>
        <p>
First step was to <a href="http://smithii.com/cdrtools">grab a Windows binary of mkisofs
from one of the various sources of cdrtools on the web</a>.  <strong>NB</strong>: 
It comes linked with <a href="http://cygwin.com/faq.html">Cygwin</a> binaries.
</p>
        <p>
This is a util that has its roots in the Linux/Unix world, so be prepared to scratch
your head a bit if you are not familiar with the world of Linux/Unix command line
tools.  Also if you are, don't be fooled by <font face="Courier New" color="#000000">mkisofs</font> following
the naming convention of the other <font face="Courier New" color="#000000">mk*fs</font> tools. 
It is really quite different.
</p>
        <p>
In the *nix world, the online help is by the man ("manual") page system.  Basically,
at your prompt you type <font face="Courier New" color="#000000">man mkisofs </font>for
help with <font face="Courier New" color="#000000">mkisofs</font>.   <a href="http://www.google.com/search?q=man+mkisofs">This
works in Google too</a>!  The man page will be a useful reference, as will the
less informative usage info you can get from <font face="Courier New" color="#000000">mkisofs.exe
-help</font></p>
        <p>
Having said all that, the following options are a really good place to start: 
</p>
        <table border="1">
          <tbody>
            <tr>
              <td>
                <font size="2">
                  <strong>
                    <em>Option</em>
                  </strong>
                </font>
              </td>
              <td>
                <font size="2">
                  <strong>
                    <em>Note</em>
                  </strong>
                </font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">-J</font>
              </td>
              <td>
                <font size="2">Enable <a href="http://en.wikipedia.org/wiki/Joliet_%28file_system%29">Joilet</a> (you
want this)</font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">-R</font>
              </td>
              <td>
                <font size="2">Enable <a href="http://en.wikipedia.org/wiki/Rock_ridge">Rock Ridge</a> (you
want this)</font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">-V <em>diskname</em></font>
              </td>
              <td>
                <font size="2">Set a volume label</font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">-o <em>filename.iso</em></font>
              </td>
              <td>
                <font size="2">Set the output ISO file name</font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">-graft-points </font>
              </td>
              <td>
                <font size="2">allows "=" syntax in <em>pathspec.</em>  More on this below...</font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">-m "*.tmp"</font>
              </td>
              <td>
                <font size="2">Exclude files from the image by pattern</font>
              </td>
            </tr>
          </tbody>
        </table>
        <p>
          <font face="Courier New" color="#000000">mkisofs</font> takes paths to add to the
ISO file as parameters, and by default all these are stacked under the root of the
disk image.  If this is not what you want then you should enable <em>graft points</em>. 
This option will allow you to make folders in your ISO image for each of the folders
you are adding to the disk.
</p>
        <p>
For example, the following <em>pathspec</em> will create two folders on the CD, one
called Windows for the contents of the bin folder, and one called Documentation for
the contents of the doco folder:
</p>
        <p>
          <font face="Courier New" color="#000000">Windows=D:\build\windows\bin\ Documentation=D:\build\doco\</font>
        </p>
        <p>
So the complete command line for <font face="Courier New" color="#000000">mkisofs</font> will
be something like: 
</p>
        <p>
          <font face="Courier New" color="#000000">"C:\Program Files\cdrtools-latest\mkisofs.exe"
-J -R -graft-points -quiet -o f:\backup.iso -V backup -m "*.tmp" Windows=D:\build\windows\bin\
Documentation=D:\build\doco\</font>
        </p>
        <p>
          <strong>For extra points,</strong> you can automatically burn the ISO to a disk using
the cdburn / dvdburn tool that <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;DisplayLang=en">ships
with the Windows Server 2003 Resource Kit Tools</a>.
</p>
        <p>
A couple of reasons I'll suggest using this over using <font face="Courier New" color="#000000">cdrecord.exe</font> that
comes with the cdrtools package:
</p>
        <ul>
          <li>
The cygwin-based tools don't work as well with later Win32 like Windows Server 2003,
they seem to not deal with the tighter security well. 
</li>
          <li>
The syntax of <font face="Courier New" color="#000000">cdburn</font>/<font face="Courier New" color="#000000">dvdburn</font> is
much much easier!</li>
        </ul>
        <p>
An example of the syntax to burn f:\backup.iso to the blank disc in the burner g:\
is:
</p>
        <div>
        </div>
        <p>
          <font face="Courier New" color="#000000">C:\Program Files\Windows Resource Kits\Tools&gt;cdburn.exe
g: f:\backup.iso -speed max</font>
        </p>
        <p>
Also note that the cdburn will eject the disk once it has been burnt!  Keep that
in mind if your CD drive is normally behind a door or cage or something!
</p>
        <p>
          <strong>
            <em>
              <font color="#0000ff">UPDATE</font>
            </em>
          </strong>:  This technique
is also has some utility for backup-to-disk scenarios.  For example a backup
batch file that made an ISO then burnt it to disk.
</p>
        <p>
          <font color="#808080">
            <strong>Listening to:</strong> Bend to Squares by Death
Cab for Cutie</font>
        </p>
      </body>
      <title>Build output as an ISO file</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,55ab833e-9f7e-41d3-822b-d9280ef057ac.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,55ab833e-9f7e-41d3-822b-d9280ef057ac.aspx</link>
      <pubDate>Tue, 08 May 2007 04:53:13 GMT</pubDate>
      <description>&lt;p&gt;
I was looking today at options for finishing a build with something other than an
MSI or folder full of files:&amp;nbsp; &lt;strong&gt;An ISO file&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
I am a fan of &lt;a href="http://www.daemon-tools.cc/dtcc/download.php"&gt;DaemonTools&lt;/a&gt; and
associated add-ons.&amp;nbsp; Even if you're not planning to burn to disc, an ISO file
can be a useful way of getting a bunch of files around the place.
&lt;/p&gt;
&lt;p&gt;
First step was to &lt;a href="http://smithii.com/cdrtools"&gt;grab a Windows binary of mkisofs
from one of the various sources of cdrtools on the web&lt;/a&gt;.&amp;nbsp; &lt;strong&gt;NB&lt;/strong&gt;:&amp;nbsp;
It comes linked with &lt;a href="http://cygwin.com/faq.html"&gt;Cygwin&lt;/a&gt;&amp;nbsp;binaries.
&lt;/p&gt;
&lt;p&gt;
This is a util that has its roots in the Linux/Unix world, so be prepared to scratch
your head a bit if you are not familiar with the world of Linux/Unix command line
tools.&amp;nbsp; Also if you are, don't be fooled by &lt;font face="Courier New" color=#000000&gt;mkisofs&lt;/font&gt; following
the naming convention of the other &lt;font face="Courier New" color=#000000&gt;mk*fs&lt;/font&gt; tools.&amp;nbsp;
It is really quite different.
&lt;/p&gt;
&lt;p&gt;
In the *nix world, the online help is by the man ("manual") page system.&amp;nbsp; Basically,
at your prompt you type &lt;font face="Courier New" color=#000000&gt;man mkisofs &lt;/font&gt;for
help with &lt;font face="Courier New" color=#000000&gt;mkisofs&lt;/font&gt;.&amp;nbsp;&amp;nbsp; &lt;a href="http://www.google.com/search?q=man+mkisofs"&gt;This
works in Google too&lt;/a&gt;!&amp;nbsp; The man page will be a useful reference, as will the
less informative usage info you can get from &lt;font face="Courier New" color=#000000&gt;mkisofs.exe
-help&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Having said all that, the following options&amp;nbsp;are a really good place to start:&amp;nbsp;
&lt;/p&gt;
&lt;table border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;&lt;strong&gt;&lt;em&gt;Option&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;&lt;strong&gt;&lt;em&gt;Note&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;-J&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Enable &lt;a href="http://en.wikipedia.org/wiki/Joliet_%28file_system%29"&gt;Joilet&lt;/a&gt; (you
want this)&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;-R&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Enable &lt;a href="http://en.wikipedia.org/wiki/Rock_ridge"&gt;Rock Ridge&lt;/a&gt; (you
want this)&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;-V &lt;em&gt;diskname&lt;/em&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Set a volume label&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;-o &lt;em&gt;filename.iso&lt;/em&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Set the output ISO file name&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;-graft-points &lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;allows "=" syntax in &lt;em&gt;pathspec.&lt;/em&gt;&amp;nbsp; More on this below...&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;-m "*.tmp"&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Exclude files from the image by pattern&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;font face="Courier New" color=#000000&gt;mkisofs&lt;/font&gt; takes paths to add to the ISO
file as parameters, and by default all these are stacked under the root of the disk
image.&amp;nbsp; If this is not what you want then you should enable &lt;em&gt;graft points&lt;/em&gt;.&amp;nbsp;
This option will allow you to make folders in your ISO image for each of the folders
you are adding to the disk.
&lt;/p&gt;
&lt;p&gt;
For example, the following &lt;em&gt;pathspec&lt;/em&gt; will create two folders on the CD, one
called Windows for the contents of the bin folder, and one called Documentation for
the contents of the doco folder:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" color=#000000&gt;Windows=D:\build\windows\bin\ Documentation=D:\build\doco\&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
So the complete command line for &lt;font face="Courier New" color=#000000&gt;mkisofs&lt;/font&gt; will
be something like: 
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" color=#000000&gt;"C:\Program Files\cdrtools-latest\mkisofs.exe"
-J -R -graft-points -quiet -o f:\backup.iso -V backup -m "*.tmp" Windows=D:\build\windows\bin\
Documentation=D:\build\doco\&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;For extra points,&lt;/strong&gt; you can automatically burn the ISO to a disk using
the cdburn / dvdburn tool that &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;amp;DisplayLang=en"&gt;ships
with the Windows Server 2003 Resource Kit Tools&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
A couple of reasons I'll suggest using this over using &lt;font face="Courier New" color=#000000&gt;cdrecord.exe&lt;/font&gt; that
comes with the cdrtools package:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The cygwin-based tools don't work as well with later Win32 like Windows Server 2003,
they seem to not deal with the tighter security well. 
&lt;li&gt;
The syntax of &lt;font face="Courier New" color=#000000&gt;cdburn&lt;/font&gt;/&lt;font face="Courier New" color=#000000&gt;dvdburn&lt;/font&gt; is
much much easier!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
An example of the syntax to burn f:\backup.iso to the blank disc&amp;nbsp;in the burner&amp;nbsp;g:\
is:
&lt;/p&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;font face="Courier New" color=#000000&gt;C:\Program Files\Windows Resource Kits\Tools&amp;gt;cdburn.exe
g: f:\backup.iso -speed max&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Also note that the cdburn will eject the disk once it has been burnt!&amp;nbsp; Keep that
in mind if your CD drive is normally behind a door or cage or&amp;nbsp;something!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;em&gt;&lt;font color=#0000ff&gt;UPDATE&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;:&amp;nbsp; This technique
is also has some utility for backup-to-disk scenarios.&amp;nbsp; For example a backup
batch file that made an ISO then burnt it to disk.
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#808080&gt;&lt;strong&gt;Listening to:&lt;/strong&gt; Bend to Squares&amp;nbsp;by&amp;nbsp;Death
Cab for Cutie&lt;/font&gt;
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,55ab833e-9f7e-41d3-822b-d9280ef057ac.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=68e12777-ada0-4226-b10b-c37a9bde6aa2</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,68e12777-ada0-4226-b10b-c37a9bde6aa2.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,68e12777-ada0-4226-b10b-c37a9bde6aa2.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=68e12777-ada0-4226-b10b-c37a9bde6aa2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This one came up in discussion last week and could be worth mentioning.
</p>
        <p>
Consider the following property:
</p>
        <p>
          <font face="Courier New">
            <font color="#000080">private </font>
            <font color="#0000ff">List</font>&lt;<font color="#0000ff">SchemaAttribute</font>&gt;
_attributes = <font color="#000080">new</font><font color="#0000ff">List</font>&lt;<font color="#0000ff">SchemaAttribute</font>&gt;();<br /><font color="#000080">public</font><font color="#0000ff">List</font>&lt;<font color="#0000ff">SchemaAttribute</font>&gt;
Attributes<br />
{<br />
   <font color="#000080">get</font><br />
   {<br />
      <font color="#000080">return</font> _attributes;<br />
   }<br />
   <font color="#000080">set</font><br />
   {<br />
      _attributes = <font color="#000080">value</font>;<br />
   }<br />
}</font>
        </p>
        <p>
          <a href="http://ncover.org/">NCover</a>/<a href="http://www.kiwidude.com/dotnet/NCoverExplorerFAQ.html">NCoverExplorer</a> reliably
inform me that this property has only 50% coverage<br />
in my tests.
</p>
        <p>
By hereto unexplored forces of nature, every consumer of this class calls<br /><font face="Courier New">.Attributes.Add()</font></p>
        <p>
or, itterates over it as so:<br /><font face="Courier New"><font color="#000080">foreach</font> (<font color="#0000ff">SchemaAttribute</font> element <font color="#000080">in</font> instance.Attributes)<br />
{<br />
   <font color="#006400">// ...</font><br />
}</font></p>
        <p>
The keen eye will notice that neither of these ways to access the property actually
hit the setter!  
</p>
        <p>
Two possible paths present themselves:
</p>
        <ol>
          <li>
            <strong>Write a test that just exercises the setter</strong>.  This seems to
me pointless.  
<br />
If we are to consider that our tests can serve to express our intention<br />
in a repeatable fashion, what is our intent?  To see if a Generic List still
works? 
</li>
          <li>
            <strong>Consider makeing the property read-only.</strong>  Including braces I
could own three lines less code.  Yay!<br />
And also now I have had cause to think about it, it's not my intention that the<br />
List be set as a list, for this class it just dosen't make sense right now.</li>
        </ol>
        <p>
Next step?  Consult <a href="http://www.microsoft.com/mspress/books/8198.aspx">Francesco
&amp; Giuseppe</a>!
</p>
        <p>
          <em>Sleep.  The best 10 hours of the week.</em>
        </p>
        <p>
Listening to:  Nick Cave and the Bad Seeds - Abattoir Blues
</p>
      </body>
      <title>Intent insurance?  Have you got coverage?</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,68e12777-ada0-4226-b10b-c37a9bde6aa2.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,68e12777-ada0-4226-b10b-c37a9bde6aa2.aspx</link>
      <pubDate>Mon, 26 Feb 2007 03:02:40 GMT</pubDate>
      <description>&lt;p&gt;
This one came up in discussion last week and could be worth mentioning.
&lt;/p&gt;
&lt;p&gt;
Consider the following property:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;&lt;font color=#000080&gt;private &lt;/font&gt;&lt;font color=#0000ff&gt;List&lt;/font&gt;&amp;lt;&lt;font color=#0000ff&gt;SchemaAttribute&lt;/font&gt;&amp;gt;
_attributes = &lt;font color=#000080&gt;new&lt;/font&gt; &lt;font color=#0000ff&gt;List&lt;/font&gt;&amp;lt;&lt;font color=#0000ff&gt;SchemaAttribute&lt;/font&gt;&amp;gt;();&lt;br&gt;
&lt;font color=#000080&gt;public&lt;/font&gt; &lt;font color=#0000ff&gt;List&lt;/font&gt;&amp;lt;&lt;font color=#0000ff&gt;SchemaAttribute&lt;/font&gt;&amp;gt;
Attributes&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#000080&gt;get&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#000080&gt;return&lt;/font&gt; _attributes;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#000080&gt;set&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_attributes = &lt;font color=#000080&gt;value&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://ncover.org/"&gt;NCover&lt;/a&gt;/&lt;a href="http://www.kiwidude.com/dotnet/NCoverExplorerFAQ.html"&gt;NCoverExplorer&lt;/a&gt; reliably
inform me that this property has only 50% coverage&lt;br&gt;
in my tests.
&lt;/p&gt;
&lt;p&gt;
By hereto unexplored forces of nature, every consumer of this class calls&lt;br&gt;
&lt;font face="Courier New"&gt;.Attributes.Add()&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
or, itterates over it as so:&lt;br&gt;
&lt;font face="Courier New"&gt;&lt;font color=#000080&gt;foreach&lt;/font&gt; (&lt;font color=#0000ff&gt;SchemaAttribute&lt;/font&gt; element &lt;font color=#000080&gt;in&lt;/font&gt; instance.Attributes)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#006400&gt;// ...&lt;/font&gt;
&lt;br&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
The keen eye will notice that neither of these ways to access the property actually
hit the setter!&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Two possible paths present themselves:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write a test that just exercises the setter&lt;/strong&gt;.&amp;nbsp; This seems to
me pointless.&amp;nbsp; 
&lt;br&gt;
If we are to consider that our tests can serve to express our intention&lt;br&gt;
in a repeatable fashion, what is our intent?&amp;nbsp; To see if a Generic List still
works? 
&lt;li&gt;
&lt;strong&gt;Consider makeing the property read-only.&lt;/strong&gt;&amp;nbsp; Including braces I
could own three lines less code.&amp;nbsp; Yay!&lt;br&gt;
And also now I have had cause to think about it, it's not my intention that the&lt;br&gt;
List be set as a list, for this class it just dosen't make sense right now.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Next step?&amp;nbsp; Consult &lt;a href="http://www.microsoft.com/mspress/books/8198.aspx"&gt;Francesco
&amp;amp; Giuseppe&lt;/a&gt;!
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Sleep.&amp;nbsp; The best 10 hours of the week.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Listening to:&amp;nbsp; Nick Cave and the Bad Seeds - Abattoir Blues
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,68e12777-ada0-4226-b10b-c37a9bde6aa2.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=9715615f-ab64-4974-af37-e1de15600b4b</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,9715615f-ab64-4974-af37-e1de15600b4b.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,9715615f-ab64-4974-af37-e1de15600b4b.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=9715615f-ab64-4974-af37-e1de15600b4b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In my commute this morning I was listening to my weekly dose of <a href="http://www.dotnetrocks.com/default.aspx?showNum=214">DotNetRocks
- Show 214 with guest Billy Hollis</a> and Billy mentioned something on Agile to illustrate
a point, and it has stuck with me all day.<br /><br />
He was referring to a presentation he attended where an advocate said he was writing
2 or 3 lines of unit test code for each line of production code.  <b>Billy's
objection to this is hardly a challenge to intuition: <i>Are we getting 4x the value
for 4x the code?</i></b><br /><br />
One of my metrics for the unit tests that I write is that they don't hurt.  Some
can be a couple of lines long, some can be heavily copied-n-paste'd.  Customizing
a CodeRush template is time well spent.  There are no wrong answers, however
you get them in there is really OK.<br /><br />
It makes sense:  You're writing a <i>unit </i>test.  The aim is to isolate
a gizmo of your choosing in your code and exercise it.  The cumulative weight
of the unit tests should really function as an expression of your intent for the gizmo. 
I outlined <a href="http://deepdark.net/PermaLink,guid,445917c5-d874-4454-a651-ef59a7cdb1a8.aspx">what
I think of the high importance of naming your tests in a prior post</a>.
</p>
      </body>
      <title>If your unit tests hurt you are not doing it right</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,9715615f-ab64-4974-af37-e1de15600b4b.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,9715615f-ab64-4974-af37-e1de15600b4b.aspx</link>
      <pubDate>Mon, 19 Feb 2007 05:48:15 GMT</pubDate>
      <description>&lt;p&gt;
In my commute this morning I was listening to my weekly dose of &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=214"&gt;DotNetRocks
- Show 214 with guest Billy Hollis&lt;/a&gt; and Billy mentioned something on Agile to illustrate
a point, and it has stuck with me all day.&lt;br&gt;
&lt;br&gt;
He was referring to a presentation he attended where an advocate said he was writing
2 or 3 lines of unit test code for each line of production code.&amp;nbsp; &lt;b&gt;Billy's
objection to this is hardly a challenge to intuition: &lt;i&gt;Are we getting 4x the value
for 4x the code?&lt;/i&gt;&lt;/b&gt;
&lt;br&gt;
&lt;br&gt;
One of my metrics for the unit tests that I write is that they don't hurt.&amp;nbsp; Some
can be a couple of lines long, some can be heavily copied-n-paste'd.&amp;nbsp; Customizing
a CodeRush template is time well spent.&amp;nbsp; There are no wrong answers, however
you get them in there is really OK.&lt;br&gt;
&lt;br&gt;
It makes sense:&amp;nbsp; You're writing a &lt;i&gt;unit &lt;/i&gt;test.&amp;nbsp; The aim is to isolate
a gizmo of your choosing in your code and exercise it.&amp;nbsp; The cumulative weight
of the unit tests should really function as an expression of your intent for the gizmo.&amp;nbsp;
I outlined &lt;a href="http://deepdark.net/PermaLink,guid,445917c5-d874-4454-a651-ef59a7cdb1a8.aspx"&gt;what
I think of the high importance of naming your tests in a prior post&lt;/a&gt;.
&lt;/p&gt;

</description>
      <comments>http://deepdark.net/CommentView,guid,9715615f-ab64-4974-af37-e1de15600b4b.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=0edeba0f-516b-46b4-8b6b-9b94769c50dc</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,0edeba0f-516b-46b4-8b6b-9b94769c50dc.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,0edeba0f-516b-46b4-8b6b-9b94769c50dc.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0edeba0f-516b-46b4-8b6b-9b94769c50dc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
with apologies and thanks to Sir Winston for giving me the courage to continue on
with <a href="http://wix.sourceforge.net/">WiX</a> :-)
</p>
        <p>
The two links that make my WiX world turn are:
</p>
        <ul>
          <li>
            <a href="http://msdn2.microsoft.com/en-us/library/aa372057.aspx">System Folder Properties
at MSDN</a>
          </li>
          <li>
            <a href="http://www.tramontana.co.hu/wix/index.php">Gábor DEÁK JAHN's WiX Tutorial</a>
          </li>
        </ul>
      </body>
      <title>WiX: Success is not final, failure is not fatal: it is the courage to continue that counts. </title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,0edeba0f-516b-46b4-8b6b-9b94769c50dc.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,0edeba0f-516b-46b4-8b6b-9b94769c50dc.aspx</link>
      <pubDate>Wed, 07 Feb 2007 07:11:45 GMT</pubDate>
      <description>&lt;p&gt;
with apologies and thanks to Sir Winston for giving me the courage to continue on
with &lt;a href="http://wix.sourceforge.net/"&gt;WiX&lt;/a&gt; :-)
&lt;/p&gt;
&lt;p&gt;
The two links that make my WiX world turn are:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://msdn2.microsoft.com/en-us/library/aa372057.aspx"&gt;System Folder Properties
at MSDN&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.tramontana.co.hu/wix/index.php"&gt;Gábor DEÁK JAHN's WiX Tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,0edeba0f-516b-46b4-8b6b-9b94769c50dc.aspx</comments>
      <category>Continuous-Integration</category>
      <category>MLP</category>
      <category>WiX</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=a3e16cb3-8812-4aac-be8e-8dd676928921</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,a3e16cb3-8812-4aac-be8e-8dd676928921.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,a3e16cb3-8812-4aac-be8e-8dd676928921.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a3e16cb3-8812-4aac-be8e-8dd676928921</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
An easy one, but anyway... When building a target in NAnt that depends on a Web Service,
the only change to your <font face="Courier New" color="#000000">&lt;vbc&gt;</font> or <font face="Courier New" color="#000000">&lt;csc&gt;</font> task
is to make sure your sources include the Reference file that Visual Studio generated
when you added/updated the Web Reference, as so:
</p>
        <p>
          <font face="Courier New" color="#000000">&lt;<font color="#000080">sources</font>&gt;<br />
    &lt;<font color="#000080">include</font><font color="#800080">name</font>=<font color="#ff0000">"MyProject\*.vb"</font>/&gt;<br />
    &lt;<font color="#000080">include</font><font color="#800080">name</font>=<font color="#ff0000">"MyProject\Web
References\RemoteInterfaceWS\Reference.vb"</font>/&gt;<br />
&lt;/<font color="#000080">sources</font>&gt;</font>
        </p>
        <p>
I was also pleased to note that in cases where the wsdl imports a typed dataset (ie
the remote Web Method takes or returns a typed dataset), <font face="Courier New" color="#000000">Reference.[vb|cs]</font> includes
the dataset definition.  No need to add a step to execute xsd.exe!
</p>
      </body>
      <title>Building an assembly that depends on a Web Service </title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,a3e16cb3-8812-4aac-be8e-8dd676928921.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,a3e16cb3-8812-4aac-be8e-8dd676928921.aspx</link>
      <pubDate>Mon, 05 Feb 2007 05:11:53 GMT</pubDate>
      <description>&lt;p&gt;
An easy one, but anyway... When building a target in NAnt that depends on a Web Service,
the only change to your &lt;font face="Courier New" color=#000000&gt;&amp;lt;vbc&amp;gt;&lt;/font&gt; or &lt;font face="Courier New" color=#000000&gt;&amp;lt;csc&amp;gt;&lt;/font&gt; task
is to make sure your sources include the Reference file that Visual Studio generated
when you added/updated the Web Reference, as so:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" color=#000000&gt;&amp;lt;&lt;font color=#000080&gt;sources&lt;/font&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#000080&gt;include&lt;/font&gt; &lt;font color=#800080&gt;name&lt;/font&gt;=&lt;font color=#ff0000&gt;"MyProject\*.vb"&lt;/font&gt;/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;font color=#000080&gt;include&lt;/font&gt; &lt;font color=#800080&gt;name&lt;/font&gt;=&lt;font color=#ff0000&gt;"MyProject\Web
References\RemoteInterfaceWS\Reference.vb"&lt;/font&gt;/&amp;gt;&lt;br&gt;
&amp;lt;/&lt;font color=#000080&gt;sources&lt;/font&gt;&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
I was also pleased to note that in cases where the wsdl imports a typed dataset (ie
the remote Web Method takes or returns a typed dataset), &lt;font face="Courier New" color=#000000&gt;Reference.[vb|cs]&lt;/font&gt;&amp;nbsp;includes
the dataset definition.&amp;nbsp; No need to add a step to execute xsd.exe!
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,a3e16cb3-8812-4aac-be8e-8dd676928921.aspx</comments>
      <category>Continuous-Integration</category>
      <category>WiX</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=0ea788d5-dd66-4fd5-b70d-e15aaffcd413</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,0ea788d5-dd66-4fd5-b70d-e15aaffcd413.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,0ea788d5-dd66-4fd5-b70d-e15aaffcd413.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0ea788d5-dd66-4fd5-b70d-e15aaffcd413</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.gotbuild.com/">Got Build</a>?
</p>
        <p>
(sprint pending ;)
</p>
      </body>
      <title>An idea is not an idea unless it has a domain name</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,0ea788d5-dd66-4fd5-b70d-e15aaffcd413.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,0ea788d5-dd66-4fd5-b70d-e15aaffcd413.aspx</link>
      <pubDate>Thu, 01 Feb 2007 21:22:44 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.gotbuild.com/"&gt;Got Build&lt;/a&gt;?
&lt;/p&gt;
&lt;p&gt;
(sprint pending ;)
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,0ea788d5-dd66-4fd5-b70d-e15aaffcd413.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
      <category>Got Build?</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=2350bc86-c0c4-496a-b788-8159bbeade2d</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=2350bc86-c0c4-496a-b788-8159bbeade2d</wfw:commentRss>
      <title>Basic Code Generation with XSLT</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</link>
      <pubDate>Thu, 23 Nov 2006 23:58:13 GMT</pubDate>
      <description>&lt;p&gt;
This was meant as a "Part II" to &lt;a href="http://deepdark.net/PermaLink,guid,b018cbdd-2f27-49ee-9764-d26e208977be.aspx"&gt;my
prior post on generating Text, HTML &amp;amp; more XML with XSLT&lt;/a&gt;.&amp;nbsp; The point
for today's post is that source code files are text files.&amp;nbsp; The example I am
thinking of is generating a library of VB.NET wrapper classes for the stored procedures
in a SQL Server database.
&lt;/p&gt;
&lt;p&gt;
(I've also ticked the Continuous Integration category for this post.&amp;nbsp; It wouldn't
be hard to think of a scenario where a build process would generate a library from
a reference database on the check-in of a stored proc script, then deliver the latest
rev of the library to the developers, anyway...)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Step one&lt;/strong&gt; would be fetch the meta data about the stored procedures,
for example:&amp;nbsp;
&lt;/p&gt;
&lt;font color=#0000ff size=1&gt; 
&lt;p&gt;
SELECT
&lt;/font&gt;&lt;font color=#000000 size=1&gt; procs&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font color=#000000 size=1&gt;Specific_Name&lt;/font&gt;&lt;font color=#808080 size=1&gt;,&lt;/font&gt;&lt;font color=#000000 size=1&gt; params&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font color=#000000 size=1&gt;Parameter_Name&lt;/font&gt;&lt;font color=#808080 size=1&gt;,&lt;/font&gt;&lt;font color=#000000 size=1&gt; params&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font color=#000000 size=1&gt;Data_Type&lt;/font&gt;&lt;font color=#808080 size=1&gt;,&lt;/font&gt;&lt;font color=#000000 size=1&gt; params&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt;Parameter_Mode&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=1&gt;
&lt;br&gt;
FROM&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#008000 size=1&gt;INFORMATION_SCHEMA.ROUTINES&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; procs&lt;/font&gt;&lt;/font&gt; &lt;font color=#808080 size=1&gt;
&lt;br&gt;
LEFT&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#808080 size=1&gt;JOIN&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#008000 size=1&gt;INFORMATION_SCHEMA.PARAMETERS&lt;/font&gt;&lt;font size=1&gt;&lt;font color=#000000&gt; params&lt;/font&gt; 
&lt;br&gt;
&lt;/font&gt;&lt;font color=#0000ff size=1&gt;ON&lt;/font&gt;&lt;font size=1&gt; params&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font size=1&gt;Specific_Name &lt;/font&gt;&lt;font color=#808080 size=1&gt;=&lt;/font&gt;&lt;font size=1&gt; procs&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font size=1&gt;Specific_Name&lt;/font&gt;&lt;font color=#0000ff size=1&gt; 
&lt;br&gt;
WHERE&lt;/font&gt;&lt;font color=#000000 size=1&gt; procs&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font color=#000000 size=1&gt;Routine_Type &lt;/font&gt;&lt;font color=#808080 size=1&gt;=&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#ff0000 size=1&gt;'PROCEDURE'&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#808080 size=1&gt;AND&lt;/font&gt; &lt;font size=1&gt;
&lt;br&gt;
procs&lt;/font&gt;&lt;font color=#808080 size=1&gt;.&lt;/font&gt;&lt;font size=1&gt;Specific_Name &lt;/font&gt;&lt;font color=#808080 size=1&gt;NOT&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#808080 size=1&gt;LIKE&lt;/font&gt;&lt;font size=1&gt; &lt;/font&gt;&lt;font color=#ff0000 size=1&gt;'dt_%'&lt;/font&gt; &lt;font color=#0000ff size=1&gt;
&lt;br&gt;
FOR&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#0000ff size=1&gt;XML&lt;/font&gt;&lt;font color=#000000 size=1&gt; &lt;/font&gt;&lt;font color=#0000ff size=1&gt;AUTO&lt;/font&gt; &gt;
&lt;p&gt;
Once we add a document node to this, we will have a document that contains many element
sets like this one:
&lt;/p&gt;
&lt;pre&gt;&amp;nbsp; &amp;lt;&lt;font color=#008000&gt;procs&lt;/font&gt; Specific_Name=&lt;font color=#ff0000&gt;"GetContactByID"&lt;/font&gt;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#008000&gt;params&lt;/font&gt; Parameter_Name=&lt;font color=#ff0000&gt;"@ContactID"&lt;/font&gt; Data_Type=&lt;font color=#ff0000&gt;"nvarchar"&lt;/font&gt; Parameter_Mode=&lt;font color=#ff0000&gt;"IN"&lt;/font&gt;/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#008000&gt;params&lt;/font&gt; Parameter_Name=&lt;font color=#ff0000&gt;"@ContactGUID"&lt;/font&gt; Data_Type=&lt;font color=#ff0000&gt;"int"&lt;/font&gt; Parameter_Mode=&lt;font color=#ff0000&gt;"INOUT"&lt;/font&gt;/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font color=#008000&gt;params&lt;/font&gt; Parameter_Name=&lt;font color=#ff0000&gt;"@Found"&lt;/font&gt; Data_Type=&lt;font color=#ff0000&gt;"bit"&lt;/font&gt; Parameter_Mode=&lt;font color=#ff0000&gt;"INOUT"/&lt;/font&gt;&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/&lt;font color=#008000&gt;procs&lt;/font&gt;&amp;gt;&lt;/pre&gt;
&lt;p&gt;
I think that's all we&amp;nbsp;need to get started.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Step two&lt;/strong&gt; is to transform this data into VB.NET code.&amp;nbsp; For today's
example it suits me to generate two files:&amp;nbsp; 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
One will contain classes that wrap ADO.NET calls to the database 
&lt;li&gt;
The other will provide types that wrap properties for passing into and out of the
first&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The text of the first template is as follows
&lt;/p&gt;
&lt;pre&gt;&lt;font color=#008000&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br&gt;
&amp;lt;xsl:stylesheet xmlns:xsl="&lt;/font&gt;&lt;a href="http://www.w3.org/1999/XSL/Transform"&gt;&lt;font color=#008000&gt;http://www.w3.org/1999/XSL/Transform&lt;/font&gt;&lt;/a&gt;&lt;font color=#0000ff&gt;&lt;font color=#008000&gt;"
version="2.0"&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:output method="text" indent="yes" /&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:template match="/"&amp;gt;&lt;/font&gt;
&lt;br&gt;
Imports System&lt;br&gt;
Imports System.Data.SqlClient&lt;br&gt;
Imports System.Data&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;Public Class DatabaseAccess&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits ConvienientBaseClass&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Public Sub New(ByVal cn As SqlConnection, ByVal trn As SqlTransaction)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.New(cn, trn)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:apply-templates select="/database/procs"
/&amp;gt;&lt;/font&gt; 
&lt;br&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br&gt;
End Class&lt;br&gt;
&amp;nbsp;&lt;font color=#008000&gt; &amp;lt;/xsl:template&amp;gt; 
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:template match="procs"&amp;gt;&lt;br&gt;
&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Wraps stored proc: &lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name"
/&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ' 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function Execute&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name"
/&amp;gt;&lt;/font&gt;(ByVal params As &lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name"
/&amp;gt;&lt;/font&gt;Struct) _ &lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;As &lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Specific_Name" /&amp;gt;&lt;/font&gt;Struct&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Dim exec As New SqlCommand&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim param As SqlParameter&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
With exec&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CommandText = &lt;/font&gt;&lt;a href='mailto:"&lt;xsl:value-of select="@Specific_Name'&gt;&lt;font color=#0000ff&gt;"&lt;/font&gt;&lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Specific_Name&lt;/font&gt;&lt;/a&gt;&lt;font color=#0000ff&gt;&lt;font color=#008000&gt;" /&lt;/font&gt;&lt;font color=#008000&gt;&amp;gt;&lt;/font&gt;"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CommandType =
CommandType.StoredProcedure&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Connection = MyBase.DatabaseConnection&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Transaction =
MyBase.CurrentTransaction&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#008000&gt;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates
select="params" /&amp;gt; &lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Try&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not exec.Connection.State
= ConnectionState.Open Then exec.Connection.Open()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exec.ExecuteNonQuery()&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
Catch ex As Exception&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Finally&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not exec Is
Nothing Then exec.Dispose()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
End Function&lt;br&gt;
&lt;font color=#008000&gt;&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&lt;font color=#008000&gt;&amp;nbsp; &amp;lt;xsl:template match="params"&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; param = exec.CreateParameter&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With param&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:if
test="@Parameter_Mode='INOUT'"&amp;gt;&lt;/font&gt;&lt;font color=#0000ff&gt;.&lt;/font&gt;Direction = ParameterDirection.Output&lt;font color=#008000&gt;&amp;lt;/xsl:if&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:if
test="@Parameter_Mode='IN'"&amp;gt;&lt;/font&gt;&lt;font color=#0000ff&gt;.&lt;/font&gt;Direction = ParameterDirection.Input&lt;font color=#008000&gt;&amp;lt;/xsl:if&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .DbType = DbType.&lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Data_Type" /&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Value = params.&lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Parameter_Name" /&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ParameterName
= &lt;/font&gt;&lt;a href='mailto:"&lt;xsl:value-of select="@Parameter_Name'&gt;&lt;font color=#0000ff&gt;"&lt;/font&gt;&lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Parameter_Name&lt;/font&gt;&lt;/a&gt;&lt;font color=#0000ff&gt;&lt;font color=#008000&gt;" /&amp;gt;&lt;/font&gt;"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exec.Parameters.Add(param)&lt;br&gt;
&amp;nbsp;&lt;/font&gt;&lt;font color=#008000&gt; &amp;lt;/xsl:template&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;
And the text of the second template is as follows:
&lt;/p&gt;
&lt;pre&gt;&lt;font color=#008000&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br&gt;
&amp;lt;xsl:stylesheet xmlns:xsl="&lt;/font&gt;&lt;a href="http://www.w3.org/1999/XSL/Transform"&gt;&lt;font color=#008000&gt;http://www.w3.org/1999/XSL/Transform&lt;/font&gt;&lt;/a&gt;&lt;font color=#0000ff&gt;&lt;font color=#008000&gt;"
version="2.0"&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:output method="text" indent="yes" /&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;lt;xsl:template match="/"&amp;gt;&lt;/font&gt;
&lt;br&gt;
Imports System&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp; &amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:apply-templates
select="/database/procs" /&amp;gt; 
&lt;br&gt;
&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:template match="procs"&amp;gt;&lt;/font&gt;
&lt;br&gt;
' 
&lt;br&gt;
' Parameters for method: Execute&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name"
/&amp;gt;&lt;br&gt;
&lt;/font&gt;' 
&lt;br&gt;
Public Class &lt;font color=#008000&gt;&amp;lt;xsl:value-of select="@Specific_Name" /&amp;gt;&lt;/font&gt;Struct&lt;br&gt;
&lt;font color=#008000&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:apply-templates select="params" /&amp;gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;
&lt;br&gt;
End Class&amp;nbsp;&lt;br&gt;
&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;/xsl:template&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:template match="params"&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; Private _&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="substring(@Parameter_Name,2,string-length(@Parameter_Name)-1)"
/&amp;gt;&lt;/font&gt; As Date&lt;br&gt;
&amp;nbsp;Public Property &lt;font color=#008000&gt;&amp;lt;xsl:value-of select="substring(@Parameter_Name,2,string-length(@Parameter_Name)-1)"
/&amp;gt;&lt;/font&gt;() _ &lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;As&amp;nbsp; &lt;font color=#008000&gt;&amp;lt;xsl:value-of
select="@Data_Type" /&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return _&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="substring(@Parameter_Name,2,string-length(@Parameter_Name)-1)"
/&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Set(ByVal Value As &amp;lt;xsl:value-of select="@Data_Type" /&amp;gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _&lt;font color=#008000&gt;&amp;lt;xsl:value-of select="substring(@Parameter_Name,2,string-length(@Parameter_Name)-1)"
/&amp;gt;&lt;/font&gt; = Value&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Set&lt;br&gt;
&amp;nbsp;&amp;nbsp; End Property&lt;br&gt;
&amp;nbsp; &lt;/font&gt;&lt;font color=#008000&gt;&amp;lt;/xsl:template&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;
To my eye, these look more like VB.NET source files than XSLT templates.&amp;nbsp; That's
because they started life as .vb files.&amp;nbsp; Then I renamed them .xslt and started
inserting the XSLT tags in places where I needed substitution from the XML source.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
To emphasise the hybrid-ness (is that a word) of these files, I have highlighted the
VB.NET parts &lt;strong&gt;&lt;font color=#0000ff&gt;blue&lt;/font&gt;&lt;/strong&gt; and the XSLT parts &lt;font color=#008000&gt;&lt;strong&gt;green&lt;/strong&gt;&lt;/font&gt;&lt;font color=#000000&gt;,
rather than keeping the VB.NET syntax highlighting.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Some breif thoughts:&amp;nbsp; 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The value of this to my mind is in not having to hand code *every* one.&amp;nbsp; You
hand code one, then generate the rest - &lt;strong&gt;in theory this reduces the opertunity
for bugs &lt;/strong&gt;which should be the focus of the exercise.&amp;nbsp; 
&lt;li&gt;
Maybe this may find a home in a long-running project to have this as part of the build
process, or maybe as part of some tooling focused on small one-off 
&lt;li&gt;
This are commercial products that do code gen based on XSLT.&amp;nbsp; I haven't used
them, but they may well be better than my home-brew sample :-) 
&lt;li&gt;
Maybe useful for trainers, or producting samples for demos etc.&amp;nbsp; I'm thinking
now about times where there may be&amp;nbsp;a need to generate side-by-side VB.Net, C#
&amp;amp; Java&amp;nbsp;sample code for example. 
&lt;li&gt;
Also include comment blocks that are readable by NDoc!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;font color=#a9a9a9&gt;[edit: added line breaks for formatting.]&lt;/font&gt;
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,2350bc86-c0c4-496a-b788-8159bbeade2d.aspx</comments>
      <category>Code Generation</category>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
      <category>XSLT</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=445917c5-d874-4454-a651-ef59a7cdb1a8</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,445917c5-d874-4454-a651-ef59a7cdb1a8.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,445917c5-d874-4454-a651-ef59a7cdb1a8.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=445917c5-d874-4454-a651-ef59a7cdb1a8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">I thought I'd post an update from my path
to continuous integration nirvana...<br /><br />
Today's installment is things I have learnt about writing unit tests.  Specifically
I'm all about .Net and NUnit, but these are probabbly applicable in other scenarios
too.<br /><br /><i><b>Name your unit tests correctly</b></i><br /><br />
What I mean to say is, name your tests as a verbose description of <i>what </i>the
purpose of your test is.  
<br /><br />
A good example:<br /><br /><font face="Courier New">&lt;test()&gt; _ 
<br /></font><font color="#000080" face="Courier New">Public Sub </font><font face="Courier New">FooCanGenerateValidIDWhenInputValueIsNegative()</font><br /><br />
A bad example:<br /><br /><font face="Courier New">&lt;test()&gt; _ 
<br /></font><font color="#000080" face="Courier New">Public Sub</font><font face="Courier New"> FooSaveMethodWorks()</font><br /><br />
Can someone who dosen't code on your project (or better still, a non-coder) understand
what the designed behaviour is for the <font face="Courier New">Foo </font>class from
your NUnit results?  
<br /><br />
But the most important reason is these tests must be granular and focused.  If
you can't tell me what you are testing by the name of the test it is probabbly time
to step back and look at the code you are testing.<br /><br /><i><b>Bug fixes should have a unit test</b></i><br /><br />
This is in two flavours:  Forwards and Backwards.<br /><br />
When I fix a bug, how do I know it is fixed?  How can I prove it is fixed? 
Good bug reports are focused &amp; granular.  Add steps to reproduce and now
you are talking about a good bug report.  
<br /><br />
It is also no mistake that the words <i>focused </i>and <i>granular </i>words are
in this lesson too.  
<br /><br /><b>Forwards</b>:<br />
By the time the tests are done they should describe the desired end result of the
bug report.  Again there is no need to go all TDD unless you want to, but if
the bug report is in the form:<br /><br /><i>An unhandled exception is thrown under some specified bad input data </i><br /><br />
then your test should show that no exception is thrown with taht bad input data. 
Instant proof that the bug was fixed!<br /><br /><b>Backwards</b>:<br />
Looking at a closed bug report, how do I know what was done to fix the bug?<br />
Looking at a broken build report because some unit tests failed, how do I know what
bugs that code relates to so I can retest them?<br /><br />
The purpose of this lesson is to remove <i>well it worked on my PC</i> from the developers
vocabulary.<br /><br /><i><b>Writing unit tests is a mind-space thing</b></i><br /><br />
While not going as far as <a href="http://www.microsoft.com/MSPress/books/6778.asp">TDD</a> in
my current projects (caution: <a href="http://damienkatz.net/2006/09/tdd.html">there
are TDD fanatics out there</a> :-) the lesson I learnt from the TDD thing is when
you are writing your tests you need to put yourself in the mindspace of the client
of your code.  Forget for a minute <i>how </i>you implemented the method and
express what you <i>aimed to do</i> in the method with your tests.<br /><br />
Confession alert:  At first I thought this was a bunch of bovine compost when
I read it in the Agile/unit testing/TDD echo chamber.  Then, one day, when I
wasn't paying much attention, I found a bug in my code through this method as I was
writing it.  Clouds parted, a little beam of sun light came down and touched
my head.  All became clear.  Lay your hands on the radio, children; for
we have a new believer.<br /><br /><i><b>Tests should be easy to write</b></i><br /><br />
When writing heaps of tests agains the same class or library or whatever, write a
base class that does the setup etc and descend your <i>test class </i>from this base
class as a way of making the test method only contain as little code that is not the
test as possible.  This can make it easier to bang out plenty of tests.  
<br /><br />
Or if you want to use Code Rush or Snippites in VS2k5?  
<br />
Or if you want to do absolutely anything else to make it easier to bang out unit tests?<br />
...just do it.  There is no wrong answer.<br /><br />
There is no need to make this harder on yourself than it has to be! :-)<br /><br /></body>
      <title>Things I have learnt about unit test code</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,445917c5-d874-4454-a651-ef59a7cdb1a8.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,445917c5-d874-4454-a651-ef59a7cdb1a8.aspx</link>
      <pubDate>Wed, 13 Sep 2006 10:29:01 GMT</pubDate>
      <description>I thought I'd post an update from my path to continuous integration nirvana...&lt;br&gt;
&lt;br&gt;
Today's installment is things I have learnt about writing unit tests.&amp;nbsp; Specifically
I'm all about .Net and NUnit, but these are probabbly applicable in other scenarios
too.&lt;br&gt;
&lt;br&gt;
&lt;i&gt;&lt;b&gt;Name your unit tests correctly&lt;/b&gt;&lt;/i&gt;
&lt;br&gt;
&lt;br&gt;
What I mean to say is, name your tests as a verbose description of &lt;i&gt;what &lt;/i&gt;the
purpose of your test is.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
A good example:&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&amp;lt;test()&amp;gt; _ 
&lt;br&gt;
&lt;/font&gt;&lt;font color="#000080" face="Courier New"&gt;Public Sub &lt;/font&gt;&lt;font face="Courier New"&gt;FooCanGenerateValidIDWhenInputValueIsNegative()&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
A bad example:&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&amp;lt;test()&amp;gt; _ 
&lt;br&gt;
&lt;/font&gt;&lt;font color="#000080" face="Courier New"&gt;Public Sub&lt;/font&gt;&lt;font face="Courier New"&gt; FooSaveMethodWorks()&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
Can someone who dosen't code on your project (or better still, a non-coder) understand
what the designed behaviour is for the &lt;font face="Courier New"&gt;Foo &lt;/font&gt;class from
your NUnit results?&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
But the most important reason is these tests must be granular and focused.&amp;nbsp; If
you can't tell me what you are testing by the name of the test it is probabbly time
to step back and look at the code you are testing.&lt;br&gt;
&lt;br&gt;
&lt;i&gt;&lt;b&gt;Bug fixes should have a unit test&lt;/b&gt;&lt;/i&gt;
&lt;br&gt;
&lt;br&gt;
This is in two flavours:&amp;nbsp; Forwards and Backwards.&lt;br&gt;
&lt;br&gt;
When I fix a bug, how do I know it is fixed?&amp;nbsp; How can I prove it is fixed?&amp;nbsp;
Good bug reports are focused &amp;amp; granular.&amp;nbsp; Add steps to reproduce and now
you are talking about a good bug report.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
It is also no mistake that the words &lt;i&gt;focused &lt;/i&gt;and &lt;i&gt;granular &lt;/i&gt;words are
in this lesson too.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Forwards&lt;/b&gt;:&lt;br&gt;
By the time the tests are done they should describe the desired end result of the
bug report.&amp;nbsp; Again there is no need to go all TDD unless you want to, but if
the bug report is in the form:&lt;br&gt;
&lt;br&gt;
&lt;i&gt;An unhandled exception is thrown under some specified bad input data &lt;/i&gt;
&lt;br&gt;
&lt;br&gt;
then your test should show that no exception is thrown with taht bad input data.&amp;nbsp;
Instant proof that the bug was fixed!&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Backwards&lt;/b&gt;:&lt;br&gt;
Looking at a closed bug report, how do I know what was done to fix the bug?&lt;br&gt;
Looking at a broken build report because some unit tests failed, how do I know what
bugs that code relates to so I can retest them?&lt;br&gt;
&lt;br&gt;
The purpose of this lesson is to remove &lt;i&gt;well it worked on my PC&lt;/i&gt; from the developers
vocabulary.&lt;br&gt;
&lt;br&gt;
&lt;i&gt;&lt;b&gt;Writing unit tests is a mind-space thing&lt;/b&gt;&lt;/i&gt;
&lt;br&gt;
&lt;br&gt;
While not going as far as &lt;a href="http://www.microsoft.com/MSPress/books/6778.asp"&gt;TDD&lt;/a&gt; in
my current projects (caution: &lt;a href="http://damienkatz.net/2006/09/tdd.html"&gt;there
are TDD fanatics out there&lt;/a&gt; :-) the lesson I learnt from the TDD thing is when
you are writing your tests you need to put yourself in the mindspace of the client
of your code.&amp;nbsp; Forget for a minute &lt;i&gt;how &lt;/i&gt;you implemented the method and
express what you &lt;i&gt;aimed to do&lt;/i&gt; in the method with your tests.&lt;br&gt;
&lt;br&gt;
Confession alert:&amp;nbsp; At first I thought this was a bunch of bovine compost when
I read it in the Agile/unit testing/TDD echo chamber.&amp;nbsp; Then, one day, when I
wasn't paying much attention, I found a bug in my code through this method as I was
writing it.&amp;nbsp; Clouds parted, a little beam of sun light came down and touched
my head.&amp;nbsp; All became clear.&amp;nbsp; Lay your hands on the radio, children; for
we have a new believer.&lt;br&gt;
&lt;br&gt;
&lt;i&gt;&lt;b&gt;Tests should be easy to write&lt;/b&gt;&lt;/i&gt;
&lt;br&gt;
&lt;br&gt;
When writing heaps of tests agains the same class or library or whatever, write a
base class that does the setup etc and descend your &lt;i&gt;test class &lt;/i&gt;from this base
class as a way of making the test method only contain as little code that is not the
test as possible.&amp;nbsp; This can make it easier to bang out plenty of tests.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
Or if you want to use Code Rush or Snippites in VS2k5?&amp;nbsp; 
&lt;br&gt;
Or if you want to do absolutely anything else to make it easier to bang out unit tests?&lt;br&gt;
...just do it.&amp;nbsp; There is no wrong answer.&lt;br&gt;
&lt;br&gt;
There is no need to make this harder on yourself than it has to be! :-)&lt;br&gt;
&lt;br&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,445917c5-d874-4454-a651-ef59a7cdb1a8.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=61165b7e-a9fe-4d32-8665-0a452e35019c</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,61165b7e-a9fe-4d32-8665-0a452e35019c.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,61165b7e-a9fe-4d32-8665-0a452e35019c.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=61165b7e-a9fe-4d32-8665-0a452e35019c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">So I've been battling against using the
Solution task in NAnt to automate the build of a large VB.Net solution that includes
heaps of libraries and a web service and all sorts :-)<br /><br />
I was hoping to have it done like this:<br /><br /><font face="Courier New">    <font color="#0000ff">&lt;solution </font><font color="#a52a2a">configuration=</font><font color="#ff0000">"Debug"</font><br />
              <font color="#a52a2a">solutionfile=</font><font color="#ff0000">"LargeProject.sln"</font><font color="#0000ff">&gt;</font><br />
      <font color="#0000ff">&lt;webmap&gt;</font><br />
        <font color="#0000ff">&lt;map </font><font color="#ff0000"><font color="#a52a2a">url=</font>"http://localhost/Project/ProjectWebService/ProjectWS.vbproj"</font><br />
             <font color="#a52a2a">path=</font><font color="#ff0000">"C:\Inetpub\wwwroot\Project\ProjectWebService\ProjectWS.vbproj"</font><font color="#0000ff">/&gt;</font><br />
      <font color="#0000ff">&lt;/webmap&gt;<br />
    &lt;/solution&gt;</font></font><br /><br />
...but was getting lots of errors like:<br /><font face="Courier New"><font color="#a52a2a">error BC30002: Type</font><font color="#ff0000">'Xml.XmlDocument'</font><font color="#a52a2a">is
not defined. </font></font><br /><br />
It turns out the source of this is all the odds and ends that VB.Net automatically
includes in your project - I was only vaguely aware of them, and it seems like there
is no option on the Solution task for it. 
<br /><br />
After some googling and general messing around, I added an Exec task to the build
as thus:<br /><br /><font face="Courier New">     <font color="#0000ff">&lt;exec </font><font color="#a52a2a">program=</font><font color="#ff0000">"C:\Program
Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe"</font><font color="#0000ff">&gt;</font><br />
           <font color="#0000ff">&lt;arg</font><font color="#a52a2a">line=</font><font color="#ff0000">"EPOnline2.0.sln
/build Debug"</font><font color="#0000ff">/&gt;</font><br />
    <font color="#0000ff"> &lt;/exec&gt;</font></font><br /><br />
The down side is there is no nice output from devenv.exe like you get from the Solution
&amp; VBC tasks, but my build succeeds and that makes me happy :-)<br /><br /><font size="1"><b><font color="#808080">After blog mint [<a href="ct.ashx?id=5dbb3a9a-09f8-4674-9058-9f22d315dfab&amp;url=http%3a%2f%2fneopoleon.com%2fblog%2fposts%2f5981.aspx">?</a>]: 
I didn't read the </font></b><font color="#000000">devenv.exe /? </font><b><font color="#808080">help
close enough!  If you include </font></b><font color="#808080"><font color="#000000">/Out</font></font><b><font color="#808080"> at
the end of the command line (i.e. after </font></b><font color="#000000">/build Debug </font><b><font color="#808080">in
the above example) you do get the pretty output.</font></b></font><br /></body>
      <title>Compiling a Visual Basic Solution in NAnt - Solution task vs Exec Task</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,61165b7e-a9fe-4d32-8665-0a452e35019c.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,61165b7e-a9fe-4d32-8665-0a452e35019c.aspx</link>
      <pubDate>Tue, 15 Aug 2006 09:23:47 GMT</pubDate>
      <description>So I've been battling against using the Solution task in NAnt to automate the build of a large VB.Net solution that includes heaps of libraries and a web service and all sorts :-)&lt;br&gt;
&lt;br&gt;
I was hoping to have it done like this:&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;solution &lt;/font&gt;&lt;font color="#a52a2a"&gt;configuration=&lt;/font&gt;&lt;font color="#ff0000"&gt;"Debug"&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#a52a2a"&gt;solutionfile=&lt;/font&gt;&lt;font color="#ff0000"&gt;"LargeProject.sln"&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;webmap&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;map &lt;/font&gt;&lt;font color="#ff0000"&gt;&lt;font color="#a52a2a"&gt;url=&lt;/font&gt;"http://localhost/Project/ProjectWebService/ProjectWS.vbproj"&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#a52a2a"&gt;path=&lt;/font&gt;&lt;font color="#ff0000"&gt;"C:\Inetpub\wwwroot\Project\ProjectWebService\ProjectWS.vbproj"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;/webmap&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/solution&amp;gt;&lt;/font&gt;&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
...but was getting lots of errors like:&lt;br&gt;
&lt;font face="Courier New"&gt;&lt;font color="#a52a2a"&gt;error BC30002: Type&lt;/font&gt; &lt;font color="#ff0000"&gt;'Xml.XmlDocument'&lt;/font&gt; &lt;font color="#a52a2a"&gt;is
not defined. &lt;/font&gt;&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
It turns out the source of this is all the odds and ends that VB.Net automatically
includes in your project - I was only vaguely aware of them, and it seems like there
is no option on the Solution task for it. 
&lt;br&gt;
&lt;br&gt;
After some googling and general messing around, I added an Exec task to the build
as thus:&lt;br&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;exec &lt;/font&gt;&lt;font color="#a52a2a"&gt;program=&lt;/font&gt;&lt;font color="#ff0000"&gt;"C:\Program
Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe"&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;&amp;lt;arg&lt;/font&gt; &lt;font color="#a52a2a"&gt;line=&lt;/font&gt;&lt;font color="#ff0000"&gt;"EPOnline2.0.sln
/build Debug"&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt; &amp;lt;/exec&amp;gt;&lt;/font&gt;&lt;/font&gt;
&lt;br&gt;
&lt;br&gt;
The down side is there is no nice output from devenv.exe like you get from the Solution
&amp;amp; VBC tasks, but my build succeeds and that makes me happy :-)&lt;br&gt;
&lt;br&gt;
&lt;font size="1"&gt;&lt;b&gt;&lt;font color="#808080"&gt;After blog mint [&lt;a href="ct.ashx?id=5dbb3a9a-09f8-4674-9058-9f22d315dfab&amp;amp;url=http%3a%2f%2fneopoleon.com%2fblog%2fposts%2f5981.aspx"&gt;?&lt;/a&gt;]:&amp;nbsp;
I didn't read the &lt;/font&gt;&lt;/b&gt;&lt;font color="#000000"&gt;devenv.exe /? &lt;/font&gt;&lt;b&gt;&lt;font color="#808080"&gt;help
close enough!&amp;nbsp; If you include &lt;/font&gt;&lt;/b&gt;&lt;font color="#808080"&gt;&lt;font color="#000000"&gt;/Out&lt;/font&gt;&lt;/font&gt;&lt;b&gt;&lt;font color="#808080"&gt; at
the end of the command line (i.e. after &lt;/font&gt;&lt;/b&gt;&lt;font color="#000000"&gt;/build Debug &lt;/font&gt;&lt;b&gt;&lt;font color="#808080"&gt;in
the above example) you do get the pretty output.&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;
&lt;br&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,61165b7e-a9fe-4d32-8665-0a452e35019c.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=d015c256-d162-46b1-be4b-7fb574502329</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,d015c256-d162-46b1-be4b-7fb574502329.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,d015c256-d162-46b1-be4b-7fb574502329.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d015c256-d162-46b1-be4b-7fb574502329</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is more along the lines of the <a href="http://www.extremeprogramming.org/rules/integrateoften.html">CI</a> threads
that have been occupying my thoughts of late.
</p>
        <p>
I'm really impressed at the kind of technical documentation I can get from <a href="http://ndoc.sourceforge.net/">NDoc</a> +
the <a href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=112b5449-f702-46e2-87fa-86bdf39a17dd">VBCommenter</a> power
toy, even more when it is generated and copied to my fileserver nightly as part of
an NAnt script!
</p>
        <p>
The next project for me on the NDoc front is to coax is to produce user documentation
(rather than technical documentation) from the same sources with no extra work from
me :-)
</p>
        <p>
Has anyone done this before?  Is it another case of <a href="http://deepdark.net/PermaLink,guid,fdf4f582-b66b-4456-abe8-182be2fa47e9.aspx">when
you are holding a hammer everything looks like a nail</a>?
</p>
      </body>
      <title>User Documentation with NDoc</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,d015c256-d162-46b1-be4b-7fb574502329.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,d015c256-d162-46b1-be4b-7fb574502329.aspx</link>
      <pubDate>Tue, 15 Aug 2006 01:24:27 GMT</pubDate>
      <description>&lt;p&gt;
This is more along the lines of the &lt;a href="http://www.extremeprogramming.org/rules/integrateoften.html"&gt;CI&lt;/a&gt; threads
that have been occupying my thoughts of late.
&lt;/p&gt;
&lt;p&gt;
I'm really impressed at the kind of technical documentation I can get from &lt;a href="http://ndoc.sourceforge.net/"&gt;NDoc&lt;/a&gt; +
the &lt;a href="http://www.gotdotnet.com/workspaces/workspace.aspx?id=112b5449-f702-46e2-87fa-86bdf39a17dd"&gt;VBCommenter&lt;/a&gt; power
toy, even more when it is generated and copied to my fileserver nightly as part of
an NAnt script!
&lt;/p&gt;
&lt;p&gt;
The next project for me on the NDoc front is to coax is to produce user documentation
(rather than technical documentation) from the same sources with no extra work from
me :-)
&lt;/p&gt;
&lt;p&gt;
Has anyone done this before?&amp;nbsp; Is it another case of &lt;a href="http://deepdark.net/PermaLink,guid,fdf4f582-b66b-4456-abe8-182be2fa47e9.aspx"&gt;when
you are holding a hammer everything looks like a nail&lt;/a&gt;?
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,d015c256-d162-46b1-be4b-7fb574502329.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=5cfb6e93-6e37-4864-a509-53d13e7e5bf2</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,5cfb6e93-6e37-4864-a509-53d13e7e5bf2.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,5cfb6e93-6e37-4864-a509-53d13e7e5bf2.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5cfb6e93-6e37-4864-a509-53d13e7e5bf2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">There's not much to tell since my last <font color="#808080">(vague,
sleep deprived, rambling)</font> post on <a href="http://deepdark.net/CategoryView,category,Continuous-Integration.aspx">continuous
integartion as a development technique in .NET</a>...<br /><br />
But what I have found useful is using Draco and NAnt on a VB6 project!<br /><br />
The problem I was looking to solve is reporting in Microsoft Visual Source Safe. 
Draco.NET supports VSS, so I made an NAnt build script with one target containing
no tasks and I have Draco build it every night.  
<br /><br />
The plus is Draco includes in its post-build email the details of what checkins have
happened since the last build and by who... Instant daily check-in report emailed
to your door :-)<br /><p></p></body>
      <title>Continuous Integration update</title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,5cfb6e93-6e37-4864-a509-53d13e7e5bf2.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,5cfb6e93-6e37-4864-a509-53d13e7e5bf2.aspx</link>
      <pubDate>Wed, 02 Aug 2006 03:15:33 GMT</pubDate>
      <description>There's not much to tell since my last &lt;font color="#808080"&gt;(vague, sleep deprived,
rambling)&lt;/font&gt; post on &lt;a href="http://deepdark.net/CategoryView,category,Continuous-Integration.aspx"&gt;continuous
integartion as a development technique in .NET&lt;/a&gt;...&lt;br&gt;
&lt;br&gt;
But what I have found useful is using Draco and NAnt on a VB6 project!&lt;br&gt;
&lt;br&gt;
The problem I was looking to solve is reporting in Microsoft Visual Source Safe.&amp;nbsp;
Draco.NET supports VSS, so I made an NAnt build script with one target containing
no tasks and I have Draco build it every night.&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
The plus is Draco includes in its post-build email the details of what checkins have
happened since the last build and by who... Instant daily check-in report emailed
to your door :-)&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,5cfb6e93-6e37-4864-a509-53d13e7e5bf2.aspx</comments>
      <category>Continuous-Integration</category>
      <category>Geeking Out!</category>
    </item>
    <item>
      <trackback:ping>http://deepdark.net/Trackback.aspx?guid=ce2e6607-36af-4981-9577-5e131c9a9b73</trackback:ping>
      <pingback:server>http://deepdark.net/pingback.aspx</pingback:server>
      <pingback:target>http://deepdark.net/PermaLink,guid,ce2e6607-36af-4981-9577-5e131c9a9b73.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://deepdark.net/CommentView,guid,ce2e6607-36af-4981-9577-5e131c9a9b73.aspx</wfw:comment>
      <wfw:commentRss>http://deepdark.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ce2e6607-36af-4981-9577-5e131c9a9b73</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
A week since my last blog post!  Here's a quick summary.<br /><br /><ul><li>
My head has been spinning at work.  Hit a busy period and I can't seem to work
fast enough.</li></ul><ul><li>
Sydney is starting to get <i>C</i>-<i>O</i>-<i>L</i>-<i>D</i> cold!<br /></li></ul><ul><li><a href="http://news.com.com/Gates+stepping+down+from+full-time+Microsoft+role/2100-1014_3-6084396.html?tag=nefd.top">Gates
is leaving Microsoft</a> (later rather than sooner), <a href="http://scobleizer.wordpress.com/">Scoble</a> is
leaving Microsoft (I've been the web site for half an hour and I still don't know <a href="http://www.podtech.net/">PodTech</a> do)...
would the last one to leave Redmond please turn out the lights? :)</li></ul><ul><li>
The continuous integration thing is moving along.  <a href="http://draconet.sourceforge.net/">Draco.Ne</a>t, <a href="http://nant.sourceforge.net/">NAnt</a> and <a href="http://www.nunit.org/">NUnit</a> all
rock.  
</li></ul><ul><ul><li>
Here's the trick for testing database code:  have your test setup put a transaction
on the wire and have your test cleanup roll back the transaction.<br /></li><li>
I know I have only read the doc 8 times this week, but I think I'm starting to <a href="http://www.martinfowler.com/articles/injection.html">understand
the DI pattern</a>.</li></ul></ul><ul><li>
Microsoft r<a href="http://msdn.microsoft.com/winfx/reference/infocard/default.aspx">enamed
InfoCard to now be CardSpace</a>.  WTF?  Still no cards?  Infocard
is still a good idea - identity management is still very important but please guys
drop the "cards" thing.  Not everyone follows WinFX developments up to the minute
and you're starting to confuse people.  And I still don't have a satisfactory
answer as to why we are doing this over protocols like HTTP and SMTP.  Why not
another rev of these protocols to natively include identity, encryption and authentication,
and then build identity management frameworks on top of them?</li></ul><ul><li><a href="http://mondoglobo.net/neofiles/">Neofiles</a> has been doing my head in with
talk of <a href="http://en.wikipedia.org/wiki/Transhumanist">transhumanist singularities</a>,
cognitive liberty, <a href="http://www.amazon.com/gp/product/1591022274/102-4607277-9307314?v=glance&amp;n=283155">liberation
biology</a> and nano-biotech.  For some reason I put my strongly skeptical BS-Filter
on hold for this show and I am starting to think about these things.  I'm definately
not sold on some of these topics.  Maybe I'm just short on sleep.<br /></li></ul><br /><ul></ul></body>
      <title>Week in review, </title>
      <guid isPermaLink="false">http://deepdark.net/PermaLink,guid,ce2e6607-36af-4981-9577-5e131c9a9b73.aspx</guid>
      <link>http://deepdark.net/PermaLink,guid,ce2e6607-36af-4981-9577-5e131c9a9b73.aspx</link>
      <pubDate>Fri, 16 Jun 2006 07:29:24 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
A week since my last blog post!&amp;nbsp; Here's a quick summary.&lt;br&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
My head has been spinning at work.&amp;nbsp; Hit a busy period and I can't seem to work
fast enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
Sydney is starting to get &lt;i&gt;C&lt;/i&gt;-&lt;i&gt;O&lt;/i&gt;-&lt;i&gt;L&lt;/i&gt;-&lt;i&gt;D&lt;/i&gt; cold!&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://news.com.com/Gates+stepping+down+from+full-time+Microsoft+role/2100-1014_3-6084396.html?tag=nefd.top"&gt;Gates
is leaving Microsoft&lt;/a&gt; (later rather than sooner), &lt;a href="http://scobleizer.wordpress.com/"&gt;Scoble&lt;/a&gt; is
leaving Microsoft (I've been the web site for half an hour and I still don't know &lt;a href="http://www.podtech.net/"&gt;PodTech&lt;/a&gt; do)...
would the last one to leave Redmond please turn out the lights? :)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
The continuous integration thing is moving along.&amp;nbsp; &lt;a href="http://draconet.sourceforge.net/"&gt;Draco.Ne&lt;/a&gt;t, &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt; and &lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt; all
rock.&amp;nbsp; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
Here's the trick for testing database code:&amp;nbsp; have your test setup put a transaction
on the wire and have your test cleanup roll back the transaction.&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
I know I have only read the doc 8 times this week, but I think I'm starting to &lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;understand
the DI pattern&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
Microsoft r&lt;a href="http://msdn.microsoft.com/winfx/reference/infocard/default.aspx"&gt;enamed
InfoCard to now be CardSpace&lt;/a&gt;.&amp;nbsp; WTF?&amp;nbsp; Still no cards?&amp;nbsp; Infocard
is still a good idea - identity management is still very important but please guys
drop the "cards" thing.&amp;nbsp; Not everyone follows WinFX developments up to the minute
and you're starting to confuse people.&amp;nbsp; And I still don't have a satisfactory
answer as to why we are doing this over protocols like HTTP and SMTP.&amp;nbsp; Why not
another rev of these protocols to natively include identity, encryption and authentication,
and then build identity management frameworks on top of them?&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://mondoglobo.net/neofiles/"&gt;Neofiles&lt;/a&gt; has been doing my head in with
talk of &lt;a href="http://en.wikipedia.org/wiki/Transhumanist"&gt;transhumanist singularities&lt;/a&gt;,
cognitive liberty, &lt;a href="http://www.amazon.com/gp/product/1591022274/102-4607277-9307314?v=glance&amp;amp;n=283155"&gt;liberation
biology&lt;/a&gt; and nano-biotech.&amp;nbsp; For some reason I put my strongly skeptical BS-Filter
on hold for this show and I am starting to think about these things.&amp;nbsp; I'm definately
not sold on some of these topics.&amp;nbsp; Maybe I'm just short on sleep.&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;/ul&gt;</description>
      <comments>http://deepdark.net/CommentView,guid,ce2e6607-36af-4981-9577-5e131c9a9b73.aspx</comments>
      <category>Geeking Out!</category>
      <category>Secutity</category>
      <category>Continuous-Integration</category>
    </item>
  </channel>
</rss>