<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3917528</id><updated>2011-05-07T05:02:44.939-05:00</updated><title type='text'>Jay Flowers</title><subtitle type='html'>Just a guy that likes to make software.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3917528.post-114601629846844058</id><published>2006-04-25T20:51:00.000-05:00</published><updated>2006-04-28T11:03:48.130-05:00</updated><title type='text'>Switching Blogs</title><content type='html'>&lt;p&gt;I have moved my blog to WordPress hosted at &lt;a style="border-bottom-style: groove;" href="http://jayflowers.com/"&gt;jayflowers.com&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;  &lt;a href="http://feeds.feedburner.com/jayflowers/Ombs"&gt;New Blog Feed &lt;img src="http://www.feedburner.com/fb/images/pub/fbapix.gif" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-114601629846844058?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/114601629846844058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=114601629846844058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114601629846844058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114601629846844058'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2006/04/switching-blogs.html' title='Switching Blogs'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-114558584499303486</id><published>2006-04-20T21:17:00.000-05:00</published><updated>2006-04-20T21:17:25.040-05:00</updated><title type='text'>Scratching the  Itch</title><content type='html'>&lt;p&gt;In my last post I explained a way to integrate nAnt into the IDE allowing a nAnt script in the editor or the solution explorer to be executed with a shortcut key.&amp;nbsp; I find this to be similar to macros and the command window, really somewhere in between the two.&amp;nbsp; Not quite as formal as a macro yet far more powerful than the command window.&amp;nbsp; This statement needs some support by itself you will most likely disagree with me.&amp;nbsp; I mentioned self contained projects in the last post and this is where&amp;nbsp;I will start to support my statement.&amp;nbsp; Here is screenshot of the same project I was using as an example last time.&lt;/p&gt;&lt;p&gt;&lt;img alt="Build Directory" src="http://www.jayflowers.com/BlogFiles/Build_20Directory_small.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;Notice the Packages directory is expanded.&amp;nbsp; It contains nAnt&amp;nbsp;targets for all sorts of functionality.&amp;nbsp; The folder selected, VS.NETCompile, contains functionality related to compilation and VS.NET.&amp;nbsp; Below is the scratch file that was in the background of some the screenshots from the last post.&lt;/p&gt;&lt;div style="BORDER-RIGHT: black thin solid; BORDER-TOP: black thin solid; BORDER-LEFT: black thin solid; BORDER-BOTTOM: black thin solid"&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;xml&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;version&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;1.0&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;utf-8&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;?&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;project&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;http://nant.sf.net/schemas/nant.xsd&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;scratch&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;default&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;test&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;basedir&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;..\Build&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;loadtasks&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;assembly&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;.\nAnt\bin\NAnt.Contrib.Tasks.dll&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;CCNetLabel&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Dev&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;CCNetProject&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Doubler&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Compile.ConfigName&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Release&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;buildfile&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Properties.build.xml&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;buildfile&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Common.Build.xml&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;buildfile&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;.\Packages\Deployment\Deployment.Target.xml&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;buildfile&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;.\Packages\VS.NETCompile\Compile.Target.xml&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;target&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;test&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Compile.ConfigName&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;release&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Compile.Bin&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${ProductDirectory}\ReleaseBin&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Compile.ToCopyToBin&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;true&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Compile.ToDeployZip&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;true&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Compile.ZipFileName&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Doubler.zip&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;delete&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;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;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;fileset&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;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;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${Compile.Bin}\*.*&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;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;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;fileset&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;delete&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;call&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;target&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Private.Compile.CopyToWorkingBin&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;call&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;target&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Private.Compile.DeployZip&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;target&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;project&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;This script will copy files compiled under the release configuration to the ReleaseBin and make a zip file name Doubler.zip, this is something that happens during the build.&amp;nbsp; I can tap into those build scripts calling just the bits and pieces that I need to accomplish a task.&amp;nbsp; The build scripts become a library of targets that I can call on; similar to tasks but&amp;nbsp;providing functioality at a higher level.&amp;nbsp; And there it is, the support for the statement that nAnt scratch is more powerful than the command window and not as formal as macros.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-114558584499303486?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/114558584499303486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=114558584499303486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114558584499303486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114558584499303486'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2006/04/scratching-itch.html' title='Scratching the  Itch'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-114541579671192756</id><published>2006-04-18T22:03:00.000-05:00</published><updated>2006-04-18T22:03:16.750-05:00</updated><title type='text'>nAnt Scratch</title><content type='html'>&lt;p&gt;I love nAnt.&amp;nbsp; It can do so many things for me and I can get it to do those things for me so very quickly.&amp;nbsp; I do not like to leave the IDE, I try to keep the list of&amp;nbsp;reasons for my leaving it short.&amp;nbsp; To help me keep that list short while still&amp;nbsp;getting nAnt to pull it weight I have integrated nAnt into the IDE through the external tools feature of VS.NET.&amp;nbsp; This not a brainy thing.&amp;nbsp; I bet plenty of people have done it.&amp;nbsp; But I don&amp;rsquo;t see many and more people should.&amp;nbsp; Take a look at how I use it.&amp;nbsp; First I keep a scratch file as a solution item: Scratch.build.xml.&amp;nbsp; I edit this file to do repetitive tasks for me.&lt;/p&gt;&lt;p&gt;&lt;img alt="NAnt Menu Item" src="http://www.jayflowers.com/BlogFiles/nAnt_20Menu_20Item.png" border="0" /&gt;&lt;/p&gt;&lt;p&gt;While I have the scratch file in focus I execute the nAnt external tool.&lt;/p&gt;&lt;p&gt;&lt;img alt="NAnt Command Execution" src="http://www.jayflowers.com/BlogFiles/nAnt_20Command_20Execution.png" border="0" /&gt;&lt;/p&gt;&lt;p&gt;To get nAnt to show up&amp;nbsp;as an&amp;nbsp;external tool configure a new external tool like so:&lt;/p&gt;&lt;p&gt;&lt;img alt="NAnt Command Config" src="http://www.jayflowers.com/BlogFiles/nAnt_20Command_20Config.png" border="0" /&gt;&lt;/p&gt;&lt;p&gt;Some shops have self contained projects, meaning that everything the project needs to build is contained in its directory structure.&amp;nbsp; I follow this practice so nAnt is located in the project&amp;nbsp;environment not in my machine environment.&amp;nbsp; This is important to note if you follow this practice too.&amp;nbsp; How will VS.NET find the nAnt.exe.&amp;nbsp; You don&amp;rsquo;t want to configure a path to a specific projects copy of nAnt.&amp;nbsp; I use bat files to start my IDE.&lt;/p&gt;&lt;p&gt;&lt;img alt="Scratch Dir" src="http://www.jayflowers.com/BlogFiles/Scratch_20Dir_small.jpg" border="0" /&gt;&lt;/p&gt;&lt;p&gt;This OpenSolution batch file will set the PATH to include nAnt.exe.&lt;/p&gt;&lt;div&gt;&lt;pre&gt;set PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Subversion\bin;..\Build\nAnt\bincall "C:\Program Files\Microsoft Visual Studio8\VC\vcvarsall.bat"devenv "Doubler.sln"&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;You may have noticed the RunScratch batch file as well.&amp;nbsp; This for situations when you need to call devenv.exe from the nAnt script. For some reason it will not compile a lick from the commanline if the IDE is open.&amp;nbsp; I don&amp;rsquo;t know why.&lt;/p&gt;&lt;p&gt;Something more we can do to make this easier is map a control key sequence to execute the nAnt script.&amp;nbsp; All external tool entries have a VS.NET command.&amp;nbsp; Look in the registry to find the external tool number.&amp;nbsp; On my machine nAnt is 2.&lt;/p&gt;&lt;p&gt;&lt;img alt="NAnt Command Reg Entry" src="http://www.jayflowers.com/BlogFiles/nAnt_20Command_20Reg_20Entry.png" border="0" /&gt;&lt;/p&gt;&lt;p&gt;I mapped mine to Ctrl+Shift+N.&lt;/p&gt;&lt;p&gt;&lt;img alt="NAnt Shortcut Keys" src="http://www.jayflowers.com/BlogFiles/nAnt_20Shortcut_20Keys.png" border="0" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-114541579671192756?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/114541579671192756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=114541579671192756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114541579671192756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114541579671192756'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2006/04/nant-scratch.html' title='nAnt Scratch'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-114489069727292744</id><published>2006-04-12T20:11:00.000-05:00</published><updated>2006-04-12T20:27:13.300-05:00</updated><title type='text'>CCNET Artifact Directory</title><content type='html'>&lt;p&gt;How to publish xml files for use by xsl with out merging into the ccnet build log using nAnt, xsl, and an&amp;nbsp;IIS virtual directory.&lt;/p&gt;&lt;a href="http://www.jayflowers.com/BlogFiles/CCNET%20Artifact%20Directory.avi"&gt;&lt;p&gt;Click to watch&lt;/p&gt;&lt;p&gt;&lt;img alt="CCNET Artifact Directory" src="http://www.jayflowers.com/BlogFiles/CCNET_20Artifact_20Directory_small.jpg" border="0" /&gt;&lt;/p&gt;&lt;/a&gt;&lt;p&gt;P.S. When I say archive I mean to say artifact.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-114489069727292744?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/114489069727292744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=114489069727292744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114489069727292744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114489069727292744'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2006/04/ccnet-artifact-directory.html' title='CCNET Artifact Directory'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-114476346465095433</id><published>2006-04-11T08:51:00.000-05:00</published><updated>2006-04-11T08:51:04.696-05:00</updated><title type='text'>A collection of nAnt goodness</title><content type='html'>I have been accumulating nAnt tasks, types, and functions for a while.&amp;nbsp; I had asked on the nAnt dev group if they would like to include them but received no response.&amp;nbsp; The list seems to go through periods where users submit patches and enhancements but I see no evidence of the project leader(s) integrating them into the code line.&amp;nbsp; The project has not released in quite a long time.&amp;nbsp; So I have decided to release some nAnt extensions of my own.&amp;nbsp; A link to the release page can be found on my home page &lt;a href="http://jayflowers.com/"&gt;jayflowers.com&lt;/a&gt;.&amp;nbsp; Below is a quick example of some of the tasks, types, and functions.&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: black thin solid; BORDER-TOP: black thin solid; BORDER-LEFT: black thin solid; BORDER-BOTTOM: black thin solid"&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;strings&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;id&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Numbers&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;string&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;string&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;2&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;string&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;3&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;string&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;4&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;strings&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;function&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;execute&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${stringlist::add('Numbers', '5')}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;ifthenelse&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;test&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${stringlist::contains('Numbers', '5')}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;then&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;echo&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;message&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Added number 5 to StringList, count = ${stringlist::count('Numbers')}.&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;then&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;elseif&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;if&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;false&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;echo&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;message&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;This won't happen.&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;elseif&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;else&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;echo&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;message&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Did not add number 5 to StringList, count = ${stringlist::count('Numbers')}.&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;else&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;ifthenelse&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;function&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;execute&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${stringlist::remove('Numbers', '2')}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;loopthrough&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Number&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;items&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;strings&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Numbers&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;items&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;do&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;echo&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;message&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;Number ${Number}!&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;do&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;loopthrough&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-114476346465095433?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/114476346465095433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=114476346465095433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114476346465095433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114476346465095433'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2006/04/collection-of-nant-goodness.html' title='A collection of nAnt goodness'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-114454759228584331</id><published>2006-04-08T20:53:00.000-05:00</published><updated>2006-04-08T20:53:12.310-05:00</updated><title type='text'>MbUnit Extensions</title><content type='html'>&lt;p&gt;I created a custom fixture extending MbUnit some time ago.&amp;nbsp; I am just now getting around to releasing it.&amp;nbsp; I thought about contributing it to the MbUnit project but then people would only be able to use it with the next release of MbUnit on, not previous releases.&amp;nbsp; So&amp;nbsp;here is the silly little &lt;a href="http://jayflowers.com/doku/doku.php?id=mbunit_extensions"&gt;home page&lt;/a&gt; for it.&amp;nbsp; I made a quick video of using it on a real life project from my work.&amp;nbsp; Yes we use this at my work so that should inspire some level of trust.&lt;/p&gt;&lt;p&gt;&lt;a href="http://jayflowers.com/doku/doku.php?id=mbunitextensions.factoryobjectprovidervideo"&gt;Click to watch&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://jayflowers.com/doku/doku.php?id=mbunitextensions.factoryobjectprovidervideo"&gt;&lt;img alt="FactoryObjectFixtureVideo" src="http://www.jayflowers.com/BlogFiles/FactoryObjectFixtureVideo_small.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-114454759228584331?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/114454759228584331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=114454759228584331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114454759228584331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114454759228584331'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2006/04/mbunit-extensions.html' title='MbUnit Extensions'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-114445351792169667</id><published>2006-04-07T18:45:00.000-05:00</published><updated>2006-04-07T18:45:17.960-05:00</updated><title type='text'>nAnt id and refid</title><content type='html'>Too often I see delimited strings being passed around in nAnt scripts and not often enough data elements.&amp;nbsp; The id and refid of data elements let you reference it.&amp;nbsp; Below is a fileset with its id set.&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: black thin solid; BORDER-TOP: black thin solid; BORDER-LEFT: black thin solid; BORDER-BOTTOM: black thin solid"&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;fileset&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;id&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;UnitTest.TestAssemblies&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${UnitTest.TestPath}\**\bin\${UnitTest.TestAssemblyFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${UnitTest.TestPath}\**\bin\${Compile.ConfigName}\${UnitTest.TestAssemblyFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;fileset&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;The id can be reference later in the script like so:&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: black thin solid; BORDER-TOP: black thin solid; BORDER-LEFT: black thin solid; BORDER-BOTTOM: black thin solid"&gt;&lt;span style="COLOR: #0000ff"&gt;&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;mbunit&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;report-types&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${UnitTest.ReportFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;report-filename-format&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${UnitTest.ReportNameFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;report-output-directory&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;${UnitTest.ReportFolder}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;assemblies&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN color="#0000ff"&gt;UnitTest.TestAssemblies&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&amp;nbsp;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;mbunit&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Unfortunately I see strings being used like so:&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: black thin solid; BORDER-TOP: black thin solid; BORDER-LEFT: black thin solid; BORDER-BOTTOM: black thin solid"&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;UnitTest.TestAssemblies1&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.TestPath}\**\bin\${UnitTest.TestAssemblyFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;UnitTest.TestAssemblies2&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.TestPath}\**\bin\${Compile.ConfigName}\${UnitTest.TestAssemblyFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;mbunit&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;report-types&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.ReportFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;report-filename-format&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.ReportNameFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;report-output-directory&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.ReportFolder}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;assemblies&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&lt;span style="COLOR: #000000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.TestAssemblies1}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&lt;span style="COLOR: #000000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.TestAssemblies2}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;assemblies&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;mbunit&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;Even worse:&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: black thin solid; BORDER-TOP: black thin solid; BORDER-LEFT: black thin solid; BORDER-BOTTOM: black thin solid"&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;UnitTest.TestAssemblies&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.TestPath}\**\bin\${UnitTest.TestAssemblyFormat};${UnitTest.TestPath}\**\bin\${Compile.ConfigName}\${UnitTest.TestAssemblyFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;foreach&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;item&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;String&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;in&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.TestAssemblies}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;delim&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;;&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;UnitTest.TestAssemblyPattern&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;do&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;mbunit&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;report-types&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.ReportFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;report-filename-format&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.ReportNameFormat}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;report-output-directory&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.ReportFolder}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;assemblies&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;include&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${UnitTest.TestAssemblyPattern}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;assemblies&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;mbunit&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;do&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;foreach&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;I wish that more tasked used data elements so that refids could be passed around.&amp;nbsp; Any thing that takes more than two attributes should consider accepting a data element instead of the attributes and three or should just pain do it.&amp;nbsp; When witting a task to use data elements be sure not feel the need to create just one data element.&amp;nbsp; Group that data that needs to be passed in to logical sets and create a data element for each set.&amp;nbsp; For example I have create PVCS Tracker tasks.&amp;nbsp; One is a task named trackerchange and needs a ticket id number (scrid), server connection information, and what fields to change to what new values.&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: black thin solid; BORDER-TOP: black thin solid; BORDER-LEFT: black thin solid; BORDER-BOTTOM: black thin solid"&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerchange&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;scrid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;connectioninformation&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;dbmsloginmode&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;&lt;span style="COLOR: #800000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;dbmsserver&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;&lt;span style="COLOR: #800000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;dbmstype&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;&lt;span style="COLOR: #800000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;dbmsusername&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;&lt;span style="COLOR: #800000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;dbmspassword&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;&lt;span style="COLOR: #800000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;projectname&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;&lt;span style="COLOR: #800000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;username&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;&lt;span style="COLOR: #800000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;password&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerfields&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;field&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&lt;span style="COLOR: #800000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;field&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;value&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;""&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerfields&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerchange&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;This design allows for scripts like:&lt;br /&gt;&lt;br /&gt;&lt;div style="BORDER-RIGHT: black thin solid; BORDER-TOP: black thin solid; BORDER-LEFT: black thin solid; BORDER-BOTTOM: black thin solid"&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;target&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;name&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Tracker.MoveTrackersTo&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;call&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;target&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Private.Tracker.ConstructTrackerNote&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;foreach&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;item&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;String&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;in&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${Tracker.QueryScrList}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;delim&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;property&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Private.Tracker.MoveTrackersTo.foreach.Id&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackergetfield&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;scrid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${Private.Tracker.MoveTrackersTo.foreach.Id}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;fieldname&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Submit Type&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;&lt;span style="COLOR: #000000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;fieldvalueproperty&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Private.Tracker.MoveTrackersTo.foreach.SubmitType&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;connectioninformation&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Tracker.Connection&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackergetfield&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;if&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;test&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${Private.Tracker.MoveTrackersTo.foreach.SubmitType == 'Unit Test'}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerchange&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;scrid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${Private.Tracker.MoveTrackersTo.foreach.Id}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerfields&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Tracker.UnitTest&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;connectioninformation&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Tracker.Connection&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerchange&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;if&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;ifnot&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;test&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${Private.Tracker.MoveTrackersTo.foreach.SubmitType == 'Unit Test'}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerchange&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;scrid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${Private.Tracker.MoveTrackersTo.foreach.Id}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerfields&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Tracker.ChangeFields&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;connectioninformation&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Tracker.Connection&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackerchange&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;ifnot&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackeraddnote&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;title&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${Tracker.NoteTitleForMoveTrackersTo}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;text&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${Private.Tracker.NoteForMoveTrackersTo}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;&lt;span style="COLOR: #000000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;scrid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;${Private.Tracker.MoveTrackersTo.foreach.Id}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;connectioninformation&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt; &lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff"&gt;Tracker.Connection&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;trackeraddnote&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;foreach&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #800000"&gt;target&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;Notice that the connection information is referenced four times and only one line for each.&amp;nbsp; This far more readable than using properties and attributes.&amp;nbsp; It is easier to maintain as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-114445351792169667?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/114445351792169667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=114445351792169667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114445351792169667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114445351792169667'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2006/04/nant-id-and-refid.html' title='nAnt id and refid'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-114440850769923940</id><published>2006-04-07T06:15:00.000-05:00</published><updated>2006-04-07T06:15:07.746-05:00</updated><title type='text'>Back in the Saddle</title><content type='html'>So I kinda dropped of the face of the blog sphere back in December.&amp;nbsp; I had to focus on Family and work.&amp;nbsp; The situation seems to have changed on both fronts so you should see more of my effort in my blog and my web site. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-114440850769923940?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/114440850769923940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=114440850769923940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114440850769923940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114440850769923940'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2006/04/back-in-saddle.html' title='Back in the Saddle'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-114304002203899381</id><published>2006-03-22T10:07:00.000-05:00</published><updated>2006-03-22T10:07:02.080-05:00</updated><title type='text'>Shell Magic and Shell Extensions</title><content type='html'>&lt;p&gt;I had been looking for Windows Explorer like controls for some time when I came across Sky Software&amp;rsquo;s &lt;a href="http://www.ssware.com/megapack.htm"&gt;Shell MegaPack.Net&lt;/a&gt;.&amp;nbsp; I particularly need the FileView control.&amp;nbsp; They offer several other products as well: Shell MegaPack ActiveX/Shell MegaPack.Net/ EZShellExtensions.Net.&amp;nbsp; They integrate well into the VS.NET IDE (all editions).&amp;nbsp; I will try to get the FileView into my Doubler product shortly.&amp;nbsp; I am keen to see what could be done with the&amp;nbsp;&lt;a href="http://www.ssware.com/ezshell/ezshell.htm"&gt;EZShellExtensions.Net&lt;/a&gt; as well.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.ssware.com/"&gt;http://www.ssware.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-114304002203899381?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/114304002203899381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=114304002203899381' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114304002203899381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/114304002203899381'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2006/03/shell-magic-and-shell-extensions.html' title='Shell Magic and Shell Extensions'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-113410088312088815</id><published>2005-12-08T23:01:00.000-05:00</published><updated>2005-12-08T23:01:23.150-05:00</updated><title type='text'>CI Factory</title><content type='html'>So I have just finished with the first version of a new product.&amp;nbsp; It is a canned CI server and installation script.&amp;nbsp; I have boiled down&amp;nbsp;what should vary in any given software development organisation's projects&amp;rsquo; CI servers to the project name and the port that CCNET will use.&amp;nbsp; It uses a plugin architecture, notice the Packages directory. &lt;div style="FLOAT: right"&gt;&lt;a href="http://photos1.blogger.com/hello/204/5923/1024/CIDirStructure.jpg"&gt;&lt;img style="BORDER-RIGHT: rgb(0,0,0) 1px solid; BORDER-TOP: rgb(0,0,0) 1px solid; MARGIN: 2px; BORDER-LEFT: rgb(0,0,0) 1px solid; BORDER-BOTTOM: rgb(0,0,0) 1px solid" src="http://photos1.blogger.com/hello/204/5923/400/CIDirStructure.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp; The current feature set includes support for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Visual Source Safe&lt;/li&gt;&lt;li&gt;Assembly and product versioning&lt;/li&gt;&lt;li&gt;PVCS Tracker&lt;/li&gt;&lt;li&gt;.NET Visual Studio 2003&amp;nbsp;solution compilation&lt;/li&gt;&lt;li&gt;Unit Test execution with MbUnit&lt;/li&gt;&lt;li&gt;Deployment artifact publication&lt;/li&gt;&lt;li&gt;Install Shield or VS deployment packages&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I hope to have support for Subversion, Jira, Java, jUnit, CoverageEye, nDepend, FxCop, and Simmian&amp;nbsp;soon.&amp;nbsp; Each project has two CCNET projects a light and a heavy one.&amp;nbsp; A light build is&amp;nbsp;short and a heavy build is long.&amp;nbsp; The light build is set to trigger off source control and the heavy build is a scheduled event.&amp;nbsp; A little bit further down the road I hope to have a dashboard that includes reports trending the data generated in the build.&amp;nbsp; &lt;a href="http://www.mertner.com/"&gt;Morten&lt;/a&gt; has been kind and offered to host a &lt;a href="http://www.mertner.com/confluence/display/CIF/Home"&gt;Confluence space&lt;/a&gt; and Jira project for the product.&amp;nbsp; After Berlios gets back to me on the project creation I can set up a SubVersion repo.&amp;nbsp; In the meantime you can experiment with an &lt;a href="http://jayflowers.com/doku/lib/exe/fetch.php?id=software_projects&amp;amp;cache=cache&amp;amp;media=ci_factory-0.1.0.0.zip"&gt;alpha&lt;/a&gt;.&amp;nbsp; Edit the Arguments.xml (or not)&amp;nbsp;and run the Install.xml (nant -buildfile:Install.xml).&amp;nbsp; It expects that the directory &amp;ldquo;C:\Source Safe DataBases&amp;rdquo; specified in the Arguments exits.&amp;nbsp; You will need to have Visual Source Safe installed as it creates a new one.&amp;nbsp; The &amp;ldquo;Admin&amp;rdquo; user&amp;rsquo;s password is &amp;ldquo;&amp;rdquo; and there is one more user &amp;ldquo;build&amp;rdquo; with password &amp;ldquo;password&amp;rdquo;.&amp;nbsp; After the&amp;nbsp;install script completes, 20 to 30 secs, run the C:\Projects\TestProject\Current\Build\CCNETServer.Bat file.&amp;nbsp;&amp;nbsp;The initial build should be successful.&amp;nbsp; You can get to the web page at &lt;a href="http://localhost/TestProject"&gt;http://localhost/TestProject&lt;/a&gt;.&amp;nbsp; There is no documentation at the moment but this is the first release.&amp;nbsp; If all goes well you should see a rapid progression to a more complete product.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-113410088312088815?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/113410088312088815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=113410088312088815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/113410088312088815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/113410088312088815'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/12/ci-factory.html' title='CI Factory'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-113120691020802544</id><published>2005-11-05T11:08:00.000-05:00</published><updated>2005-11-05T11:08:30.246-05:00</updated><title type='text'>Code Camp</title><content type='html'>&lt;p&gt;I will be giving two presentations at the &lt;a href="http://www.hrssug.org/default.aspx"&gt;Hampton Roads&lt;/a&gt; &lt;a href="http://www.madcodecamp.com/"&gt;Code Camp&lt;/a&gt; in December.&amp;nbsp; The first presentation will be on OOP Exception Handling and the second on &lt;a href="http://mbunit.org/"&gt;MbUnit&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Object Oriented Exception Handling&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;This session will cover extending structured exception handling into&lt;br /&gt;an OOP solution. &amp;nbsp;Reflection and polymorphism will be used to achieve&lt;br /&gt;this result. &amp;nbsp;A good understanding of polymorphism will be helpful to&lt;br /&gt;attendees.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;MbUnit&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;MbUnit is an advanced .NET xUnit Framework. &amp;nbsp;This session will cover&lt;br /&gt;some of the more interesting fixtures provided by the product and a&lt;br /&gt;few custom extensions. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-113120691020802544?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/113120691020802544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=113120691020802544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/113120691020802544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/113120691020802544'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/11/code-camp.html' title='Code Camp'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112887267581991720</id><published>2005-10-09T10:44:00.000-05:00</published><updated>2005-10-09T10:44:35.860-05:00</updated><title type='text'>Testability: Internal State Collapse</title><content type='html'>&lt;p&gt;So I have started research for a book that I would like to write.&amp;nbsp; I am currently looking for&amp;nbsp; a metric or metric that will indicate when a design is not very testable.&amp;nbsp; I came across an interesting concept, internal state collapse.&amp;nbsp; This is where the input parameters are not released from the member.&amp;nbsp; For example:&lt;/p&gt;&lt;div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0pt; FONT-SIZE: 11pt; BACKGROUND: white; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; COLOR: black; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: Courier New"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;interface&lt;/span&gt; IWarehouse&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; HasInventory(InventoryItem inventoryItem, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; amount);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Remove(InventoryItem inventoryItem, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; amount);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Add(InventoryItem inventoryItem, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; amount);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;&lt;p&gt;The members Add and Remove do not release amount or inventoryItem.&amp;nbsp; This is known as internal state collapse.&amp;nbsp; The interest here is that it is very difficult to test.&amp;nbsp; Lets examine this a little closer.&lt;/p&gt;&lt;div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0pt; FONT-SIZE: 11pt; BACKGROUND: white; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; COLOR: black; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: Courier New"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Add(InventoryItem inventoryItem, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; amount)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.HasInventory(inventoryItem, amount)) &lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Inventory[inventoryItem] = (&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;) &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Inventory[inventoryItem] + amount;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Inventory[inventoryItem] = amount;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;No surprises there.&amp;nbsp; Some people might say &amp;ldquo;well just use HasInventory to verify that Add was successful&amp;rdquo;.&amp;nbsp; This is fine in production code but test code should try not to use production code to verify production code.&amp;nbsp; What if there was a bug in HasInventory?&amp;nbsp; When trying to test Add I don&amp;rsquo;t want to get sidetracked by a bug elsewhere in the product.&amp;nbsp; So the problem is that the information needed for verification is not accessible or in other cases has vanished.&amp;nbsp; After more research I found an answer:&lt;/p&gt;&lt;div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0pt; FONT-SIZE: 11pt; BACKGROUND: white; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; COLOR: black; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: Courier New"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Add(InventoryItem inventoryItem, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; amount)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.HasInventory(inventoryItem, amount)) &lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Inventory[inventoryItem] = (&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;) &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Inventory[inventoryItem] + amount;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.Assert(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Inventory[inventoryItem] &amp;gt; amount, "The inventory should be more than the amount that was just added.");&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Inventory[inventoryItem] = amount;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.Debug.Assert(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Inventory[inventoryItem] == amount, "The inventory should be that same as what was just added.");&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;This feels a lot like a stint to me.&amp;nbsp; The assertions act as stints&amp;nbsp;allowing the verification while maintaining encapsulation.&amp;nbsp; I have seen other solutions that offer information through public members that are conditionally compiled (i.e. encapsulation is only broken for testing).&amp;nbsp; Any kind of solution that breaks the rules just to achieve testability is a lazy solution in my book (that is the bad kind not the good kind of lazy).&amp;nbsp; I doubt that the inventors and practitioners of those solutions hold OOP values and principles.&amp;nbsp; They certainly are not practising them.&lt;/p&gt;&lt;p&gt;Anyway I hope to have the time to finish up the research into testability metrics here in the next two weeks.&amp;nbsp; If you are interested in this kind of thing you can keep track of my progress in more detail at &lt;a href="http://jayflowers.com/"&gt;JayFlowers.com&lt;/a&gt;.&lt;!--EndFragment--&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112887267581991720?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112887267581991720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112887267581991720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112887267581991720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112887267581991720'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/10/testability-internal-state-collapse.html' title='Testability: Internal State Collapse'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112817932455542819</id><published>2005-10-01T10:08:00.000-05:00</published><updated>2005-10-01T10:08:44.560-05:00</updated><title type='text'>State Based UnitTesting, or Not?</title><content type='html'>I have been doing a lot of research lately on how to teach unit testing.&amp;nbsp; There seem to be to basic forms: State and Interaction.&amp;nbsp; In my last post I define what a unit test is in a very strict way.&amp;nbsp; By that definition I can not see how state based testing is unit testing.&amp;nbsp; I wanted to refer to my own examples here but gotdotnet user samples take 72 hours or so to be published so I will refer to Martin Fowler&amp;rsquo;s &lt;a href="http://www.martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks Aren&amp;rsquo;t Stubs&lt;/a&gt;.&amp;nbsp; At the beginning of this article he illustrates the two approaches.&amp;nbsp; For state based testing to be performed a portion of the system, more than the test subject, was needed.&amp;nbsp; It was needed for the test subject simply to be used.&amp;nbsp; Sniff Sniff Sniff.&amp;nbsp; Do you smell that.&amp;nbsp; Smells like tight coupling to me.&amp;nbsp; Bugs in the warehouse class can easily cause the order unit test to fail.&amp;nbsp; This fail to express much of the potential value of a unit test.&amp;nbsp; Indicating were the problem is.&amp;nbsp; Now we can only know that when a unit test fails that it's a problem in either the order or warehouse classes.&amp;nbsp; So why would I write a separate unit test for the warehouse class, I don&amp;rsquo;t really even feel like adding asserts to the order test&amp;nbsp;to verify that the warehouse object is in the expected state.&amp;nbsp; All this leads me to believe that state based testing is not a unit testing style at all.&amp;nbsp; It promotes bad practices.&amp;nbsp; This is not to say that it isn&amp;rsquo;t a great style for other forms of testing, just unit testing.&amp;nbsp; Interaction testing on the other hand is dependent on loose coupling; same as the definition in the previous post depends on it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112817932455542819?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112817932455542819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112817932455542819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112817932455542819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112817932455542819'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/10/state-based-unittesting-or-not.html' title='State Based UnitTesting, or Not?'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112709950662818320</id><published>2005-09-18T22:11:00.000-05:00</published><updated>2005-10-01T09:32:58.096-05:00</updated><title type='text'>Understanding Unit Testing</title><content type='html'>&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;Unit testing seems to be one of those topics that will get people to arguing.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;What is a unit test?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;What value do they bring?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;How much time do they add to a project?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;You can&amp;rsquo;t write unit tests to test our code.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;And on and on&amp;hellip;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I think these questions continue to be asked because they are generally not answered well.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;To end this we need to find hard and fast answers to these questions.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;It is hard to argue for something if people can&amp;rsquo;t even agree on what it is. &lt;?xml:namespace prefix ="" o /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;u&amp;rsquo;nit test (noun) :&lt;/b&gt; An automated test, exercising a class, verifying that the class fulfills its responsibilities.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;This is the absolute minimum needed for a definition of unit test.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;From here there could be many discussions about nice to haves with this definition (i.e. readability of the tests, naming of the test).&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Let&amp;rsquo;s examine this definition.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;A unit test is not a unit test unless it is automated.&lt;/b&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;If it is not automated then you must be using a debugger to step through a class to verify that it fulfills its responsibilities.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;This is a poor practice.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;It increases the viscosity of your environment; people will be less likely to perform this manual test every time it is needed.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;With automation thousands of unit tests can be run very quickly while thousands of manual tests will take a very long time.&amp;nbsp; With out automation unit testing is next to worthless.&amp;nbsp; The affect of unit tests is greater than their sum.&amp;nbsp; To gain their full value all must be executed.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;A unit test exercises just one class.&lt;/b&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;What does this mean?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Let&amp;rsquo;s say I have class &lt;em&gt;Responder&lt;/em&gt; that needs to be tested.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;em&gt;Responder&lt;/em&gt; has little public interface to speak of.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The real meat is accessed by sending &lt;em&gt;Responder&lt;/em&gt; messages through the file system.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Verifying that &lt;em&gt;Responder&lt;/em&gt; meets its responsibilities is also performed by receiving messages through the file system.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;em&gt;Responder&lt;/em&gt; does not read and write messages to the files system itself, it uses a class called &lt;em&gt;Tunnel&lt;/em&gt;. The temptation is to write a test that creates a &lt;em&gt;Responder&lt;/em&gt; and rights and reads files to complete the test.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Two thirds of what could go wrong is in the tunnels.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;There is more than one class being exercised.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;With a little redesign we can add some abstraction in to allow us to exercise just &lt;em&gt;Responder&lt;/em&gt;. Exercising more than one class is an integration test.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;A unit test will verify the subject class fulfills its responsibilities.&lt;/b&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;As with exercising just one class a unit test is responsible to verify the responsibilities of just the subject class.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;When you are tempted to assert that an obligation of a class other than the subject is satisfied you are probably exercising more than the subject class.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;There should be unit tests for those other classes where their responsibilities are tested.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;There are other levels of testing (integration, system&amp;hellip;) where interactions are tested. &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;Unit tests are mainly about testing the responsibilities of a class.&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;Naturally people feel exposed if the only tests on a system have tested the individual parts (other levels of testing should be exercised).&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;What value is there in testing each part separately?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;It eliminates some of what you have to suspect when there is a bug.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Unit tests have an affect on the code they test.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The obvious affect is more reliable code.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Some of the less obvious affects are loose coupling and ability to deal with change.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;This translates to the stakeholder as the project is more responsive to there needs as they figure them out.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;We all know that what is asked for at the beginning of the project and what is asked for by the end of the project can be very different things.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Unit testing provides a means to balance these opposing forces: refactoring.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;It facilitates stepped, fine grained, or low level refactoring.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;With out true unit tests refactoing is a tricky business.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;In fact if your customer is asking for a change and you have good unit test coverage of your product the tests can be used to illustrate the risk involved with the change (i.e. before the change is applied X of Z tests are passing, after the change is applied Y of Z are passing).&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;If you are diligent there are other benefits to unit tests as well.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Unit Tests can be, when written well, used as developer documentation.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;They can serve as executable design artifacts (similar to FiT tests).&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;As a coach or architect they can be invaluable for identifying tangles, clutter, and bad or missing design.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;When I here we can&amp;rsquo;t write unit tests for our code I think you don&amp;rsquo;t know how to use the tools of OOP.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I have yet to come across a design problem that can not be solved with OOP to allow for simple and easy testing.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;It gets difficult when the subject code can not or will not be changed.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Most times in these cases there is no simple easy way to create unit tests.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Depending on the situation change may be necessary to create unit tests.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Many times it is simply taking the time to do the right thing (i.e. creating an &lt;a href="http://www.thoughtworks.com/object-mother-easing-test-object-creation.pdf"&gt;Object Mother&lt;/a&gt;).&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I think something that would go a long way to answering this question cold would be a set of patterns for common testing problems.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;I think the most difficult question I have encountered is &amp;ldquo;How much time do they add to a project?&amp;rdquo;.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I don&amp;rsquo;t think this question can be answered well in a general way.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I think that for it to be affective it must address the specifics of the project(s) the questioner is thinking of.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;There are many variables and possible responses to the affects that unit testing will have on a project.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Some developers get it right away, others take longer to understand how to practice TDD.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;It will reduce the amount of time spent debugging, and debugging is a laborious task. It will reduce the amount of bugs and recursion reaching the test team.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The rapid feedback given to the developers should reduce the time needed to produce a feature or fix a bug.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;They no longer need to wait for the test team to perform verification to gain confidence that they have completed the task (and with the added bonus of not breaking anything else).&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The short simple (and some would say lame) answer is &amp;ldquo;Over the course of the project they will not add time but reduce the time needed&amp;rdquo;.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The trick in the answer is &amp;ldquo;over the course of the project&amp;rdquo;.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I would respond to that answer with &amp;ldquo;When will I first see the time savings?&amp;rdquo;.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I am not sure I can win this line of questioning yet.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;It will invariably head to asking for a quantifiable or measurable difference: something tangible.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The only way to kill this one is to find a way to make this question moot.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;One of the interesting things about this last question is how it tempts me (and would guess others) to bring in other agile practices to the conversation.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I am not sure if this is a good or a bad thing.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;There is defiantly a strong relation to other agile practices: refactoring, Continuous Integration, Continuous Design&amp;hellip;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;At first I feel that their inclusion will bolster the case for unit tests and provide insight into their value.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;By including them in the discussion their value now seems to depend much on these other practices.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112709950662818320?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112709950662818320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112709950662818320' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112709950662818320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112709950662818320'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/09/understanding-unit-testing.html' title='Understanding Unit Testing'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112705348775346482</id><published>2005-09-18T09:24:00.000-05:00</published><updated>2005-09-18T09:24:47.786-05:00</updated><title type='text'>Continuous Design: Were did design go?</title><content type='html'>&lt;p&gt;I think there is a parallel between what FiT is doing for requirements and what unit tests can do for Continuous Design.&amp;nbsp; Specifically FiT provides executable requirements and unit tests provide executable design artifacts.&amp;nbsp; Grant-it you must write your unit tests to be communicative.&amp;nbsp; Those migrating from BDUF often feel insecure without design artifacts.&amp;nbsp; There are many other things that make those migrating from BDUF feel insecure but I think this one can be solved by overloading the&amp;nbsp;purpose of&amp;nbsp;unit tests.&amp;nbsp; Viewing unit tests as design artifacts can be a specially helpful&amp;nbsp;at&amp;nbsp;a shop where pair programming is not practiced.&amp;nbsp; Design reviews are the&amp;nbsp;counter to pair programming in the non-agile world, and unit tests could be used to review the proposed design.&amp;nbsp; Having the design expressed as executable tests instills much more confidence in me than design artifacts like&amp;nbsp;documents&amp;nbsp;and diagrams.&amp;nbsp; I can have greater assurance that the design I am reviewing will actually come to be.&amp;nbsp; As well I am assured that the design artifact will stay in sync with the product.&amp;nbsp; So there is an extra step between red and green when not practicing pair programming, design review by examination of the unit tests.&amp;nbsp; Something to be careful of in these design reviews: reviewers are likely to think ahead to the future.&amp;nbsp; The reviewers need to adhere to&lt;!--StartFragment --&gt; "Do the Simplest Thing that Could Possibly Work" and "You Aren't Going to Need It".&amp;nbsp; Where interaction between entities larger than classes need to be reviewed FiT tests and&amp;nbsp;fixtures can be included in the review.&amp;nbsp; They should probably be included in the review anyway.&amp;nbsp; If a shop can make this practice work it should save time.&amp;nbsp; Instead of producing both tests (unit and FiT) and design docs they need only create the tests.&amp;nbsp; The quality of the altered process should be the same if not better.&amp;nbsp; The previous process being: create design artifacts, design review, red, green.&amp;nbsp; Notice the lack of refactor?&amp;nbsp; That is because there was a design specified up front, and the goal is to implement that design.&amp;nbsp; The goal of the design was to adhere to "Do the Simplest Thing that Could Possibly Work" and "You Aren't Going to Need It&amp;rdquo; while expressing the new feature.&amp;nbsp; Refactoring is done in the design phase.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112705348775346482?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112705348775346482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112705348775346482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112705348775346482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112705348775346482'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/09/continuous-design-were-did-design-go.html' title='Continuous Design: Were did design go?'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112645081398818766</id><published>2005-09-11T10:00:00.000-05:00</published><updated>2005-09-11T10:00:14.046-05:00</updated><title type='text'>Continuous Design and Values</title><content type='html'>&lt;p&gt;So I have always thought that BDUF was flawed.&amp;nbsp; I never enjoyed it, something just felt wrong.&amp;nbsp; Over the last year I have been participating in agile experimentation at my work.&amp;nbsp; For most new features we would have to document a design (UML and text) and hold a design review before proceeding to create unit tests.&amp;nbsp; What was the purpose of these design reviews?&amp;nbsp; To make sure that the implementor was going to express the values held by the architect in the code.&amp;nbsp; It&amp;rsquo;s not that the developer was not trusted to fulfill the requirement, they were not trusted to hold and express the values of the architect (In this case the values are of OOP).&amp;nbsp; So this indicates to me that the design documentation and review are to direct the implementor as to how they will fulfill the requirement.&lt;/p&gt;&lt;p&gt;I was very attached to this project and its success.&amp;nbsp; I would monitor the CCNET server and review most every change made to the product.&amp;nbsp; When I saw that the design was going astray I would talk with the author of the disruptive change to see what could be done to right the design.&amp;nbsp; In monitoring the product in this fashion I found that design documentation and review were rarely translated into the expected code.&amp;nbsp; This says to me that no amount of direction can get a developer that does not understand and or hold the desired values to produce code that adheres to them.&lt;/p&gt;&lt;p&gt;So I am sure you are asking how does this relate to Continuous Design.&amp;nbsp; Well I don&amp;rsquo;t have a solution to how to get good code out of developers in opposition to the desired values.&amp;nbsp; It feels like to me that Continuous Design has something to offer here.&amp;nbsp; You might be saying use pair programming.&amp;nbsp; Well that just seems like one developer (the one with the understanding) is doing all the work and the other developer (the one lacking understanding) is getting trained (if they are open to it).&amp;nbsp; That doesn&amp;rsquo;t really sound like pair programming to me (maybe I don&amp;rsquo;t understand pair programming well?).&amp;nbsp; At any rate I like Continuous Design better that BDUF.&amp;nbsp; I think it is more productive.&amp;nbsp; It reminds me of the Ron Jeffries quote:&lt;/p&gt;&lt;p&gt;&amp;nbsp;"If I've got six months to build a system, then I'll spend six months building it. I'll also spend six months designing it, and another six months testing it. The good news is that it's the same six months". &lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112645081398818766?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112645081398818766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112645081398818766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112645081398818766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112645081398818766'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/09/continuous-design-and-values.html' title='Continuous Design and Values'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112603526418952142</id><published>2005-09-06T14:34:00.000-05:00</published><updated>2005-09-06T14:34:24.223-05:00</updated><title type='text'>Listen When You Can't Read</title><content type='html'>&lt;p&gt;So I have recently moved.&amp;nbsp; Before the move I had a ten minute commute, now I have an hour and fifteen minute commute.&amp;nbsp; To fill the time with something besides music I began listening to .NET Rocks.&amp;nbsp; Listening to two .NET Rocks episodes a day is a bit much.&amp;nbsp; I need a little more variety.&lt;/p&gt;&lt;p&gt;I have a list of papers, articles, and books that I have being meaning to read forever. It was almost the perfect time to get to them, the commute that is, except that I had to keep the car on the road.&amp;nbsp; What I needed was someone to read them to me, like my laptop.&amp;nbsp; So I went looking for a text to speech engine.&amp;nbsp; I found plenty and chose&amp;nbsp;AT&amp;amp;T&amp;rsquo;s &lt;a href="http://www.readplease.com/"&gt;PleaseRead&lt;/a&gt;.&amp;nbsp; I liked it best for its record to MP3 feature.&amp;nbsp; Now I have two and a half hours a day to listen to all that reading material that has been piling up.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112603526418952142?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112603526418952142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112603526418952142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112603526418952142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112603526418952142'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/09/listen-when-you-cant-read.html' title='Listen When You Can&apos;t Read'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112514923390112711</id><published>2005-08-27T08:27:00.000-05:00</published><updated>2005-08-27T08:35:38.490-05:00</updated><title type='text'>A New View</title><content type='html'>&lt;a href='http://photos1.blogger.com/img/204/5923/1024/LOS%20076.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://photos1.blogger.com/img/204/5923/400/LOS%20076.jpg'&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href='http://photos1.blogger.com/img/204/5923/1024/LOS%20075.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://photos1.blogger.com/img/204/5923/400/LOS%20075.jpg'&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href='http://photos1.blogger.com/img/204/5923/1024/LOS%20063.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://photos1.blogger.com/img/204/5923/400/LOS%20063.jpg'&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;a href='http://photos1.blogger.com/img/204/5923/1024/LOS%201371.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://photos1.blogger.com/img/204/5923/400/LOS%201371.jpg'&gt;&lt;/a&gt;
&lt;a href='http://picasa.google.com/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' border='0' style='border:0px;padding:0px;background:transparent;' align='absmiddle'&gt;&lt;/a&gt;
&lt;br /&gt;We are finally getting settled in after the move.  Here are some pictures of were we live now.  I love the view of the mountain.  I should start blogging more soon.  We are going on vaction soon so after that you will see more.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112514923390112711?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112514923390112711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112514923390112711' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112514923390112711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112514923390112711'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/08/new-view.html' title='A New View'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112303224875832391</id><published>2005-08-02T20:24:00.000-05:00</published><updated>2005-08-02T20:24:08.780-05:00</updated><title type='text'>WinProTeam</title><content type='html'>I will be presenting at the &lt;a href="http://www.winproteam.org/"&gt;WinProTeam&lt;/a&gt; .NET user group tomorrow on OOP Exception Handling.&amp;nbsp; I have cleaned up the ASOGS code and released it for this presentation.&amp;nbsp; There is not a lot of new stuff but there is some.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112303224875832391?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112303224875832391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112303224875832391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112303224875832391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112303224875832391'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/08/winproteam.html' title='WinProTeam'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112294193311638921</id><published>2005-08-01T19:18:00.000-05:00</published><updated>2005-08-01T19:18:53.150-05:00</updated><title type='text'>Flex</title><content type='html'>I created a new CI server in 50 minutes this evening.&amp;nbsp; Started from a blank folder, ended with a successful build showing an install link on the build page as well as PVCS Tracker integration.&amp;nbsp; I rock (I am flexing at this point)!&amp;nbsp; I need to document and share this process, as it is repeatable.&amp;nbsp; I promise I will do this in a future post.&amp;nbsp; I am moving in the next few weeks.&amp;nbsp;&amp;nbsp;So it may be a few weeks before I can share this in a meaningful way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112294193311638921?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112294193311638921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112294193311638921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112294193311638921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112294193311638921'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/08/flex.html' title='Flex'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112242826076716820</id><published>2005-07-26T20:37:00.000-05:00</published><updated>2005-07-26T20:37:40.770-05:00</updated><title type='text'>A Wonderful Quote</title><content type='html'>&lt;p&gt;I picked this up from &lt;a href="http://blog.dotnetwiki.org/"&gt;Peli &lt;/a&gt;today.&lt;/p&gt;&lt;p&gt;Le trop est l'ennemi du bien&lt;/p&gt;&lt;p&gt;or&lt;/p&gt;&lt;p&gt;Too much is the enemy of enough&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I love it!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112242826076716820?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112242826076716820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112242826076716820' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112242826076716820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112242826076716820'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/07/wonderful-quote.html' title='A Wonderful Quote'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112242781178131261</id><published>2005-07-26T20:30:00.000-05:00</published><updated>2005-07-26T20:30:11.786-05:00</updated><title type='text'>Fit Book</title><content type='html'>&lt;a href="http://www.testing.com/cgi-bin/blog"&gt;Brian Marick&lt;/a&gt; has an interesting write up on the &lt;a href="http://www.testing.com/cgi-bin/blog/2005/07/08#fit-book-out"&gt;reasons&lt;/a&gt; to use Fit.&amp;nbsp; It looks like this was brought on by the release of the new fit book: &lt;a href="http://www.powells.com/biblio/62-0321269349-1"&gt;&lt;span style="BORDER-BOTTOM-STYLE: groove"&gt;&lt;em&gt;Fit for Developing Software&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;.&amp;nbsp; This tool one of the best ways to cause a natural&amp;nbsp;move to agile in a project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112242781178131261?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112242781178131261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112242781178131261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112242781178131261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112242781178131261'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/07/fit-book.html' title='Fit Book'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112242669939324534</id><published>2005-07-26T20:11:00.000-05:00</published><updated>2005-07-26T20:11:39.450-05:00</updated><title type='text'>Ticket Systems and CI</title><content type='html'>I have noticed that most of the people and organizations that preach the virtues of Continuous Integration (CI) also preach the virtues of a good ticket system (Jira is a good example).&amp;nbsp; What I find interesting is that no one, to my knowledge, has integrated a ticket system with CI.&amp;nbsp; If you have a ticket system that records all your requirements as well as your bugs doesn&amp;rsquo;t that describe all the work to be done to your code?&amp;nbsp; Lets say it does. Could the CI server integrate with the ticket system similarly to the source control system?&amp;nbsp; Well of course it could, but what does that buy you?&amp;nbsp; So lets say that a developer must submit a ticket and code to the build.&amp;nbsp; There would be an association between the code submited to the&amp;nbsp;source control repo and the ticket used to task the developer.&amp;nbsp; This association&amp;nbsp;would be used to aquire information on this ticket in the build script and include it in the build log/report.&amp;nbsp; Besides displaying what ticket was completed with that build the build script can update information in the ticket.&amp;nbsp; It could change the assignee, add a note, change the status, or any number of things.&amp;nbsp; At my work we have the build script move the ticket(s), in PVCS Tracker,&amp;nbsp;to the test team and add a note with information on what build the ticket was sucessfully built in.&amp;nbsp; On the MbUnit project we are in the process of integrating Jira in the same fashion.&amp;nbsp; It seems to me that the ablility of a build script to associate a ticket with a change and manipulate that ticket is a very powerful thing.&amp;nbsp; I find it interesting that I can not find this is kind of thing going on else where.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112242669939324534?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112242669939324534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112242669939324534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112242669939324534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112242669939324534'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/07/ticket-systems-and-ci.html' title='Ticket Systems and CI'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112182100366212840</id><published>2005-07-19T19:34:00.000-05:00</published><updated>2005-07-20T07:53:34.303-05:00</updated><title type='text'>A Push for FitNesse</title><content type='html'>&lt;p&gt;I have been trying to push for FitNesse to be adopted one of the projects I am helping. We have an &lt;strong&gt;aggressive&lt;/strong&gt; schedule that does not allow for the time that the Test team is asking for. I have suggested FitNesse as means to reduce the total time to complete the same if not more testing. In an effort to help the developers on this project who &lt;strong&gt;will&lt;/strong&gt; use FitNesse and in trying to show an example to the Test lead I have created a test fixture that should be able to test any data structure. [[Breathe]]&lt;breath&gt;&lt;breath&gt; You can test a data structure in one or more table. I sugggest at least two: one for specifying the data structe and housing assembly, the second for testing the data structure. &lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/img/204/5923/1024/First-Table.jpg"&gt;&lt;img style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 2px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" src="http://photos1.blogger.com/img/204/5923/400/First-Table.jpg" border="0" /&gt;&lt;/a&gt; &lt;a href="http://picasa.google.com/" target="ext"&gt;&lt;img style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; BACKGROUND: none transparent scroll repeat 0% 0%; PADDING-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: 0px" alt="Posted by Picasa" src="http://photos1.blogger.com/pbp.gif" align="absMiddle" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;The &lt;strong&gt;AsseblyLocation&lt;/strong&gt; and the type of the class to be tested, &lt;strong&gt;SubjectType&lt;/strong&gt;, are specified. The next table will use the class specified in the previous table (i.e. &lt;strong&gt;SimpleDataStructure&lt;/strong&gt; will be tested). This table shows test procedures for testing &lt;strong&gt;SimpleDataStructure&lt;/strong&gt;.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/img/204/5923/1024/Second-Table.jpg"&gt;&lt;img style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 2px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" src="http://photos1.blogger.com/img/204/5923/400/Second-Table.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Name&lt;/strong&gt; column specifies the name of the property in the &lt;strong&gt;SimpleDataStructure&lt;/strong&gt; that wil be tested on this row. The &lt;strong&gt;ValueType&lt;/strong&gt; column specifies the type of the value that will passed to the property. The &lt;strong&gt;SetValue&lt;/strong&gt; column specifies the value to be passed to the property. The &lt;strong&gt;ExceptionThrown&lt;/strong&gt; column specifies to expect an Exception. Notice the question mark. The &lt;strong&gt;GetValue&lt;/strong&gt; column specifies the value that should be in the property. The &lt;strong&gt;ExceptionType&lt;/strong&gt; column specifies the type of Exception thrown, if none enter null. I have included the code for the fixture &lt;strong&gt;TestSimpleDataStructure&lt;/strong&gt;. You can use it as is to test any data structure, well almost. The method &lt;strong&gt;CastBoxedValue&lt;/strong&gt; should be beefed up a bit. It can only handle string and integer right now (if someone knows a better way than a select case statement tell me how). Enjoy :) &lt;!--StartFragment--&gt;&lt;/p&gt;&lt;div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0pt; FONT-SIZE: 10pt; BACKGROUND: white; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; COLOR: black; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: Courier New"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;Imports&lt;/span&gt; fit&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;Imports&lt;/span&gt; System.Reflection&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Class&lt;/span&gt; TestSimpleDataStructure&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Inherits&lt;/span&gt; ColumnFixture&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; _AssemblyLocation &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; _SubjectType &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; _Name &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; _ValueType &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt; = "string"&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; _SetValue &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; _ExceptionThrown &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Boolean&lt;/span&gt; = &lt;span style="COLOR: blue"&gt;False&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; _ExceptionType &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt; AssemblyLocation() &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; _AssemblyLocation&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; Value &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _AssemblyLocation = Value&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;If&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Not&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.SubjectType &lt;span style="COLOR: blue"&gt;Is&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Nothing&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Me&lt;/span&gt;.CreateSubject()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;If&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt; SubjectType() &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; _SubjectType&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; Value &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _SubjectType = Value&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;If&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Not&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.AssemblyLocation &lt;span style="COLOR: blue"&gt;Is&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Nothing&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Me&lt;/span&gt;.CreateSubject()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;If&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Sub&lt;/span&gt; CreateSubject()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;AddHandler&lt;/span&gt; AppDomain.CurrentDomain.AssemblyResolve, &lt;span style="COLOR: blue"&gt;New&lt;/span&gt; ResolveEventHandler(&lt;span style="COLOR: blue"&gt;AddressOf&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.assemblyResolve)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.Subject = Activator.CreateInstanceFrom(&lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.AssemblyLocation, &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.SubjectType).Unwrap&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;RemoveHandler&lt;/span&gt; AppDomain.CurrentDomain.AssemblyResolve, &lt;span style="COLOR: blue"&gt;New&lt;/span&gt; ResolveEventHandler(&lt;span style="COLOR: blue"&gt;AddressOf&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.assemblyResolve)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt; Subject() &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Object&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.Recall(&lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.GetType.Name)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; Value &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Object&lt;/span&gt;)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.Save(&lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.GetType.Name, Value)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt; ValueType() &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; _ValueType&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; Value &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _ValueType = Value&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt; Name() &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; _Name&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; Value &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _Name = Value&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt; SetValue() &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; _SetValue&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; Value &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _SetValue = Value&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Try&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Dim&lt;/span&gt; params &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Object&lt;/span&gt;() = &lt;span style="COLOR: blue"&gt;New&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Object&lt;/span&gt;(0) {&lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.CastBoxedValue(Value, &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.ValueType)}&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Me&lt;/span&gt;.Subject.GetType.GetProperty(&lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.Name).GetSetMethod.Invoke(&lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.Subject, params)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Catch&lt;/span&gt; ex &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; Exception&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Me&lt;/span&gt;.ExceptionThrown = &lt;span style="COLOR: blue"&gt;True&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Me&lt;/span&gt;.ExceptionType = ex.GetType.Name&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Try&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt; ExceptionThrown() &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Boolean&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; _ExceptionThrown&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; Value &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Boolean&lt;/span&gt;)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _ExceptionThrown = Value&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;ReadOnly&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt; GetValue() &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.Subject.GetType.GetProperty(&lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.Name).GetGetMethod.Invoke(&lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.Subject, &lt;span style="COLOR: blue"&gt;Nothing&lt;/span&gt;).ToString&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt; ExceptionType() &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; _ExceptionType&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; Value &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; _ExceptionType = Value&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Overrides&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Sub&lt;/span&gt; Reset()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;With&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ._ExceptionThrown = &lt;span style="COLOR: blue"&gt;False&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ._ExceptionType = &lt;span style="COLOR: blue"&gt;Nothing&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ._Name = &lt;span style="COLOR: blue"&gt;Nothing&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ._SetValue = &lt;span style="COLOR: blue"&gt;Nothing&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ._ValueType = "string"&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ._AssemblyLocation = &lt;span style="COLOR: blue"&gt;Nothing&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ._SubjectType = &lt;span style="COLOR: blue"&gt;Nothing&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;With&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Function&lt;/span&gt; CastBoxedValue(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; StringValue &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; NewType &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;) &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Object&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Select&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Case&lt;/span&gt; &lt;span style="COLOR: blue"&gt;True&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Case&lt;/span&gt; NewType.ToLower = "integer"&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Integer&lt;/span&gt;.Parse(StringValue)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Case&lt;/span&gt; NewType.ToLower = "string"&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Return&lt;/span&gt; StringValue&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Select&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Function&lt;/span&gt; assemblyResolve(&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; sender &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Object&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt; args &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; ResolveEventArgs) &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; [Assembly]&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Dim&lt;/span&gt; chArray1 &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Char&lt;/span&gt;() = &lt;span style="COLOR: blue"&gt;New&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Char&lt;/span&gt;() {","c}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Dim&lt;/span&gt; text1 &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt; = args.Name.Split(chArray1)(0)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Dim&lt;/span&gt; text3 &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;For&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Each&lt;/span&gt; text3 &lt;span style="COLOR: blue"&gt;In&lt;/span&gt; IO.Path.GetDirectoryName(&lt;span style="COLOR: blue"&gt;Me&lt;/span&gt;.AssemblyLocation)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Dim&lt;/span&gt; text4 &lt;span style="COLOR: blue"&gt;As&lt;/span&gt; &lt;span style="COLOR: blue"&gt;String&lt;/span&gt; = IO.Path.Combine(text3, &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;.Format("{0}.dll", text1))&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;If&lt;/span&gt; IO.File.Exists(text4) &lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Return&lt;/span&gt; [Assembly].LoadFrom(text4)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;If&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; text4 = IO.Path.Combine(text3, &lt;span style="COLOR: blue"&gt;String&lt;/span&gt;.Format("{0}.exe", text1))&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;If&lt;/span&gt; IO.File.Exists(text4) &lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&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;span style="COLOR: blue"&gt;Return&lt;/span&gt; [Assembly].LoadFrom(text4)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;If&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Next&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;Return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Nothing&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;End&lt;/span&gt; &lt;span style="COLOR: blue"&gt;Class&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112182100366212840?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112182100366212840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112182100366212840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112182100366212840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112182100366212840'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/07/push-for-fitnesse.html' title='A Push for FitNesse'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112181962641986941</id><published>2005-07-19T19:20:00.000-05:00</published><updated>2005-07-19T19:33:46.426-05:00</updated><title type='text'>Reuse</title><content type='html'>I am trying to start a reuse process at my work. I recognize there are different level of reuse.
&lt;ul&gt;
&lt;li&gt;Copy and Paste &lt;/li&gt;
&lt;li&gt;Class &lt;/li&gt;
&lt;li&gt;Library &lt;/li&gt;
&lt;li&gt;Project &lt;/li&gt;
&lt;li&gt;Pattern &lt;/li&gt;
&lt;li&gt;Design &lt;/li&gt;
&lt;li&gt;Architecture &lt;/li&gt;
&lt;/ul&gt;

The tool &lt;a href="http://koders.com"&gt;Koders&lt;/a&gt; seems to help a good deal with the first four. The last five seem to need a formal process to achieve. At the moment a board of 4 to 8 people meeting once a month to review submissions to the reuse repo seems to be the answer.
If that is the course of action I need:
A web site to publish the reusable artifacts to.
Criteria to judge a submission by.
Requirements a submission must meet.
And all the things I have not thought of yet. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112181962641986941?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112181962641986941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112181962641986941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112181962641986941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112181962641986941'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/07/reuse.html' title='Reuse'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112181878710669218</id><published>2005-07-19T19:16:00.000-05:00</published><updated>2005-07-19T19:20:19.323-05:00</updated><title type='text'>First Article</title><content type='html'>I have published my first professional article.

&lt;p&gt;&lt;a href="http://www.ondotnet.com/pub/a/dotnet/2005/07/18/unittesting_2005.html"&gt;Unit Testing in .NET Projects&lt;/a&gt; by Jay Flowers and Andrew Stopford -- Now is a pretty exciting time for unit testing in .NET. Tremendous progress is being made on several fronts: IDE integration, process integration, and new test fixtures. Jay Flowers and Andrew Stopford explain how to use Visual Studio's new integrated unit testing, as well as the NUnit and MbUnit testing frameworks.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112181878710669218?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112181878710669218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112181878710669218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112181878710669218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112181878710669218'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/07/first-article.html' title='First Article'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-112031187648843619</id><published>2005-07-02T08:44:00.000-05:00</published><updated>2005-07-02T08:44:36.493-05:00</updated><title type='text'>Equal Access HashTable or a Map</title><content type='html'>&lt;p&gt;There are many occasions where a Hashtable just doesn&amp;rsquo;t cut it.&amp;nbsp; You need an object to hold pairs of objects.&amp;nbsp; You need to be able to retrieve either of the members of the pair with the other member of the pair.&amp;nbsp; HashTable just won&amp;rsquo;t cut it.&amp;nbsp; You can access one member of the pair, the value, with the other member of the pair, the key.&amp;nbsp; You may not access the key with the value.&amp;nbsp; Many times that is exactly what I need.&amp;nbsp; So I got tiered of iterating through the keys looking for the one I needed.&amp;nbsp; I made a new class implementing the IDictionary interface called Map, as well as creating the class MapBase.&amp;nbsp; The following example with use MapBase to illustrate.&lt;/p&gt;&lt;p&gt;Lets say that we have a list of Names and IDs.&amp;nbsp; We would like to be able to use either the name of the id to retrieve the other.&lt;/p&gt;&lt;div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0pt; FONT-SIZE: 10pt; BACKGROUND: white; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; COLOR: black; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: Courier New"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; NameIdMap : MapBase&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;[&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; Name]&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;) &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.MappedTable[Name];&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.MappedTable[Name] = &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;[&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; ID]&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;get&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;) &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.MappedTable[ID];&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.MappedTable[ID] = &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Add(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; Name, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; ID)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.MappedTable.Add(Name, ID);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; Contains(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; Name)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.MappedTable.Contains(Name);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; Contains(&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; ID)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.MappedTable.Contains(ID);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Remove(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; Name)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.MappedTable.Remove(Name);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Remove(&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; ID)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.MappedTable.Remove(ID);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;The class NameIdMap will allow this.&amp;nbsp; 50 braindead lines of code and you have type safe access to your map.&amp;nbsp; If didn&amp;rsquo;t want type safe access you could have used a Map.&lt;/p&gt;&lt;div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0pt; FONT-SIZE: 10pt; BACKGROUND: white; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; COLOR: black; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: Courier New"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; JustUseAMap&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Example()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Map NamesAndIDs = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Map();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NamesAndIDs.Add("Jay", 1);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NamesAndIDs.Add("Andy", 2);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (!NamesAndIDs.Contains("Jay"))&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: blue"&gt;throw&lt;/span&gt; &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Exception();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Jay's id is {0}", NamesAndIDs["Jay"]);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;If this is something that could improve your day it&amp;rsquo;s part of the &lt;a href="http://workspaces.gotdotnet.com/ASOGS"&gt;ASOGS&lt;/a&gt; project.&lt;!--EndFragment--&gt;&lt;!--EndFragment--&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-112031187648843619?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/112031187648843619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=112031187648843619' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112031187648843619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/112031187648843619'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/07/equal-access-hashtable-or-map.html' title='Equal Access HashTable or a Map'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-111997503729955729</id><published>2005-06-28T11:10:00.000-05:00</published><updated>2005-06-28T18:59:54.450-05:00</updated><title type='text'>New OOP IRC Channel</title><content type='html'>Well after much looking I have been unable to locate an existing IRC Channel for Object Oriented Programming. In response to this deficiency I have create just such a channel &lt;a href="irc://irc.freenode.net/Object"&gt;#Object&lt;/a&gt;. I hope to see you there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-111997503729955729?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/111997503729955729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=111997503729955729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111997503729955729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111997503729955729'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/06/new-oop-irc-channel.html' title='New OOP IRC Channel'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-111980198353853096</id><published>2005-06-26T09:40:00.000-05:00</published><updated>2005-06-27T19:19:45.896-05:00</updated><title type='text'>External Polymorpism</title><content type='html'>&lt;p&gt;So I have been posting an awful lot about oop exception handling. The approach that I have been following makes use of external polymorphism. As far as I can tell &lt;a href="http://www.cs.wustl.edu/~cleeland/papers/index.html"&gt;Chris Cleeland&lt;/a&gt; and &lt;a href="http://www.cs.wustl.edu/~schmidt/"&gt;Douglas C. Schmidt&lt;/a&gt; were the first to document its use as a pattern. They implemented with templates in C++. An OOP language with reflective abilities can achieve a similar effect. Before we dive into the implementation lets get some context, get on the same page as to what we are trying to solve. &lt;/p&gt;&lt;p&gt;Allow classes unrelated by inheritance or related by inheritance but without the desired virtual method to be treated polymorphically. &lt;/p&gt;&lt;p&gt;If you read the paper Douglas and Chris wrote my last sentence should sound familiar. Now a little motivation would be nice too. &lt;/p&gt;&lt;p&gt;Say I found that the best solution for my problem was to implement the Visitor pattern but the class that I would need to alter are not in my control. They are classes that have been purchased in a third party library. &lt;/p&gt;&lt;p&gt;I want to focus on explaining the implementation not on justifying the need for this pattern. Justification is worth at least a whole other blog entry. So on to the participants. &lt;/p&gt;&lt;p&gt;For the moment let's go with encapsulating all method implementations in one class. We want to be able to have a method implementation selected because it is associated with a type. In internal polymorphism this association is drawn through the type that implements the method. Here it will be drawn by the type of the parameter in the signature of the method (i.e. internal = type.method(), external = method(type)).&lt;/p&gt;&lt;div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0pt; BACKGROUND: white; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; COLOR: black; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; ExternalVisitor&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Accept(Animal animal) {}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Visit(Parrot animal){}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Visit(Alligator animal){}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/img/204/5923/1024/Internal-vs-ExternalPolymorphism.jpg"&gt;&lt;img style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 2px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" src="http://photos1.blogger.com/img/204/5923/400/Internal-vs-ExternalPolymorphism.jpg" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.hello.com/" target="ext"&gt;&lt;img style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; BACKGROUND: none transparent scroll repeat 0% 0%; PADDING-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: 0px" alt="Posted by Hello" src="http://photos1.blogger.com/pbh.gif" align="absMiddle" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;I mentioned reflection earlier, that plus the concept of double dispatch can achieve external polymorphism. The Accept method on the class ExternalVisitor will use these concepts to dispatch to the method associated to the type of Animal pass it. It will reflect on the type passed as well as the methods named Visit searching for the method that accepts a parameter of the same or inherited type as passed. So if passed a Parrot the Visit method that accepts a parameter of type Parrot will be selected. The call will then be dispatched to that method (double dispatch). The call was redirected to the appropriate method, or double dispatched. If there is a type Cockatoo that inherits from Parrot it too would be dispatched to the method named Visit accepting a parameter of type Parrot.&lt;/p&gt;&lt;p&gt;I have packaged all the reflection stuff into a class called DoubleDispatchReflector. It is included in the ASOGS projects Patterns namespace. Here is some example usage.&lt;/p&gt;&lt;div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0pt; BACKGROUND: white; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; COLOR: black; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; ExternalVisitor&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Accept(Animal animal) &lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;DoubleDispatchReflector dispatch = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; DoubleDispatchReflector(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;, "Visit");&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;dispatch.Invoke(animal);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="COLOR: #000000"&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Visit(Parrot animal){}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="COLOR: #000000"&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Visit(Alligator animal){}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;!--EndFragment--&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="FONT-SIZE: 85%; FONT-FAMILY: Courier New"&gt;I don&amp;rsquo;t know about you but I think that provided a lot of bang for your buck. Two lines and we have the guts of external polymorphism working.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="FONT-SIZE: 85%; FONT-FAMILY: Courier New"&gt;The participants explained so far implement all the methods to be dispatched to in one class. Lets change perspective and imagine that we have found someone else's ExternalVisitor and we would like to reuse some of it&amp;rsquo;s methods and create some of our own. We would like to aggregate some of our own new code and reuse some old code.&lt;/span&gt;&lt;/p&gt;&lt;a href="http://photos1.blogger.com/img/204/5923/1024/Aggregation.jpg"&gt;&lt;img style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 2px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" src="http://photos1.blogger.com/img/204/5923/400/Aggregation.jpg" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.hello.com/" target="ext"&gt;&lt;img style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; BACKGROUND: none transparent scroll repeat 0% 0%; PADDING-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: 0px" alt="Posted by Hello" src="http://photos1.blogger.com/pbh.gif" align="absMiddle" border="0" /&gt;&lt;/a&gt; &lt;p&gt;This scenario has been packaged up into a class named Prizm. It too is included in the ASOGS projects Patterns namespace. And again here is some example usage.&lt;/p&gt;&lt;div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0pt; BACKGROUND: white; PADDING-BOTTOM: 0pt; BORDER-LEFT: windowtext 1pt solid; COLOR: black; PADDING-TOP: 0pt; BORDER-BOTTOM: windowtext 1pt solid"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; AggregateVisitor&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="COLOR: #000000"&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Accept(Animal animal)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Prizm aggregate = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Prizm();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="COLOR: #000000"&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;object&lt;/span&gt;[] ParameterLists = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: blue"&gt;object&lt;/span&gt;[1];&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;ParameterLists[1] = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Type[1] {&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(Cockatoo)};&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;aggregate.AddHandler(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; NewExternalVisitor(), "Visit", ParameterLists);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;ParameterLists[1] = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Type[1] {&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(Parrot)};&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;aggregate.AddHandler(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; OldExternalVisitor(), "Visit", ParameterLists);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;aggregate.Invoke(animal);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Well that seems to be more than enough for this post. Maybe next time I will write about using multiple parameters.&lt;/p&gt;&lt;p&gt;Note:&lt;/p&gt;&lt;p&gt;I have not yet released the aggregation class (Prizm) and there have been modification to the DoubleDispatchReflector since it's last release.&lt;/p&gt;&lt;p&gt;The examples shown here are not for production use. They have been made for easy reading.&lt;!--EndFragment--&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-111980198353853096?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://c2.com/cgi/wiki?ExternalPolymorphism' title='External Polymorpism'/><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/111980198353853096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=111980198353853096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111980198353853096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111980198353853096'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/06/external-polymorpism.html' title='External Polymorpism'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-111929974470701521</id><published>2005-06-20T15:06:00.000-05:00</published><updated>2005-06-20T15:35:44.713-05:00</updated><title type='text'>All Sorts of Good Stuff</title><content type='html'>&lt;p&gt;I have not been able to find an appropriate project to push this stuff to so I have created my own, ASOGS. So far I have included these namespaces and classes: &lt;/p&gt;&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;ASOGS&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Collections&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Map&lt;/li&gt;
&lt;li&gt;MapBase&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;ExceptionHandling&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;AggregateExceptionHandler&lt;/li&gt;
&lt;li&gt;ExceptionHandlerBase&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Reflection&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;AssemblyInformation&lt;/li&gt;
&lt;li&gt;AssemblyInformationList&lt;/li&gt;
&lt;li&gt;TypeArrayComparer&lt;/li&gt;
&lt;li&gt;TypeArrayHashCodeProvider&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Serialization&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Cloner&lt;/li&gt;
&lt;li&gt;Persistor&lt;/li&gt;
&lt;li&gt;Serializer&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Patterns&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;DoubleDispatchReflector&lt;/li&gt;
&lt;li&gt;UniversalFactory&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;
I have yet to move all the reuseable code that I have collected over the last year into the ASOGS project. Somethings that I plan to include are: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Exception Serialization Handling &lt;/li&gt;&lt;li&gt;Plugin Managment &lt;/li&gt;&lt;li&gt;Singleton Manager &lt;/li&gt;&lt;li&gt;Resource Pool Manager &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
I will try to post some details about these class in future blog entries, and get these additions into a ASOGS release soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-111929974470701521?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://workspaces.gotdotnet.com/ASOGS' title='All Sorts of Good Stuff'/><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/111929974470701521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=111929974470701521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111929974470701521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111929974470701521'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/06/all-sorts-of-good-stuff.html' title='All Sorts of Good Stuff'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-111902086245439202</id><published>2005-06-17T09:52:00.000-05:00</published><updated>2005-06-17T10:07:42.456-05:00</updated><title type='text'>Exception Handling Presentation</title><content type='html'>I gave a presentation on OOP exception handling at Northrop Grumman yesterday.  It covers the exception handling techniques that I have recently bogged about.  The slides are all up to date, but the comments are a little sparse toward the end.
After I digest the feedback from the presentation I will probably update the presentation.  Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-111902086245439202?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.gotdotnet.com/workspaces/releases/viewuploads.aspx?id=8cc76e56-81ab-446e-86de-d0188d3de006' title='Exception Handling Presentation'/><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/111902086245439202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=111902086245439202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111902086245439202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111902086245439202'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/06/exception-handling-presentation.html' title='Exception Handling Presentation'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-111819651793133320</id><published>2005-06-07T20:50:00.000-05:00</published><updated>2005-06-07T21:09:56.570-05:00</updated><title type='text'>An ExceptionHandler Example</title><content type='html'>Here is a quick example of an ExceptionHandler and how to use it.

First the dirived ExceptionHandler:

&lt;pre&gt;&lt;code&gt;

Class Example

    Public Shared Sub Main()
        Dim handler As New MyExceptionHandler
        Dim MyExample As New Example
        Try
            MyExample.UnsafeAction()
            MyExample.AnotherUnsafeAction()
        Catch ex As Exception
            If Not handler.HandleException(ex) Then
                Throw
            End If
        End Try
    End Sub

    Private Sub UnsafeAction()
        Throw New Exception("This is a test excaption")
    End Sub

    Private Sub AnotherUnsafeAction()
        Throw New IO.IOException("This is a test excaption")
    End Sub

End Class

&lt;/code&gt;&lt;/pre&gt;

Now using it:

&lt;pre&gt;&lt;code&gt;

Public Class MyExceptionHandler
    Inherits ExceptionHandlerBase

    Public Overloads Overrides Sub Handle(ByVal exception As System.Exception)
        Console.WriteLine(String.Format("Handling : {0}", exception))
    End Sub

    Public Overloads Sub Handle(ByVal exception As IO.IOException)
        Console.WriteLine(String.Format("Handling : {0}", exception))
    End Sub

    Protected Overrides ReadOnly Property UseDefaultHandler() As Boolean
        Get
            Return True
        End Get
    End Property

End Class

&lt;/code&gt;&lt;/pre&gt;

I you have played with the Exception Handling Application Block it may look
similar. I thought that MS had beet me to the punch when I found that
particular Application Block the other day. As far as I can tell so far they do
not do any thing like the visitor pattern or polymorphism with the excpetion
type. they use magic strings to determin which handler to give the exception
to. Maybe next post I will does a comparison fo the two approachs. I have
consitered contacting the mainters of that Application Block to discuss how the
approach I have inovated could be used in the Exception Handling Application Block.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-111819651793133320?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/111819651793133320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=111819651793133320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111819651793133320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111819651793133320'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/06/exceptionhandler-example.html' title='An ExceptionHandler Example'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-111819337446501871</id><published>2005-06-07T19:37:00.000-05:00</published><updated>2005-06-07T20:50:10.740-05:00</updated><title type='text'>Aggregate ExceptionHandlers</title><content type='html'>So I had a copy paste bug in my unit test for aggregate excpetion handling. It was
using a table of signatures and handlers to determine which handler to dispatch
to. The problem was &lt;pre&gt;&lt;code&gt;Hashtable(Signature)&lt;/code&gt;&lt;/pre&gt;does not do the
same job as &lt;pre&gt;&lt;code&gt;Type.GetMethod("MethodName", Signature)&lt;/code&gt;&lt;/pre&gt;.
The solution I found was &lt;strong&gt;Reflection.Emit&lt;/strong&gt;. It was nice to have
a real reason to learn some about this technology. I used emit to dynamicaly
create a type with methods matchs all the signatures in the table.


&lt;pre&gt;&lt;code&gt;

Public Sub [AddHandler](ByVal handler As IExceptionHandler, ByVal ParameterLists As Object())
    For Each ParameterList As Type() In ParameterLists
        If Me.HandlerSignatures.Contains(ParameterList) Then
            Throw New ArgumentException("There is a handler that overlaps with the requested addition.")
        End If
    Next
    For Each ParameterList As Type() In ParameterLists
        Me.HandlerSignatures.Add(ParameterList, handler)
    Next
    If Me.IsActive Then
        Me.CreateAggregate()
    End If
End Sub

&lt;/code&gt;&lt;/pre&gt;



A client would pass what signatures from the handler should be added to the
aggregate. The CreateAggregate method will use emit to create the aggregate.
That code is a bit borring, thought what it does is cool. I learned a lot from &lt;a href="http://weblogs.asp.net/kennykerr/"&gt;Kenny Kerr's&lt;/a&gt; blog on IL. Just like layout of a UI Control a client can control creation of the aggregate. If many aggregates where being added SuspendAggregation couls be called and when the addtions where complete ResumeAggregation could be called to create the aggregate.

When I was writting the HandleException methods of the AggregateExceptionHandler I noticed that the reflective double dispatch code I was writting was almost the same as ExceptionHandlerBase. I moved this code to a new class,
DoubleDispatchReflector.

&lt;pre&gt;&lt;code&gt;

Public Class DoubleDispatchReflector
      ' Methods
      Public Sub New()
      Public Sub New(ByVal subject As Object, ByVal methodName As String)
      Public Function DispatchTo(ByVal args As Object()) As MethodInfo
      Public Function DispatchTo(ByVal arg As Object) As MethodInfo
      Public Function DispatchTo(ByVal subject As Object, ByVal methodName As String, ByVal args As Object()) As MethodInfo
      Public Function DispatchTo(ByVal subject As Object, ByVal methodName As String, ByVal arg As Object) As MethodInfo

      ' Properties
      Public Property MethodName As String
      Public Property Subject As Object

End Class

&lt;/code&gt;&lt;/pre&gt;



With that the AggregateExceptionHandler was complete. Now there are two
standard ways to obtain reuse of ExceptionHandlers, inheritance and aggregation.

Please &lt;a href="http://workspaces.gotdotnet.com/ASOGS"&gt;download &lt;/a&gt;a copy and play with it.  Let me know what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-111819337446501871?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/111819337446501871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=111819337446501871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111819337446501871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111819337446501871'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/06/aggregate-exceptionhandlers.html' title='Aggregate ExceptionHandlers'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-111810337193599446</id><published>2005-06-06T19:02:00.000-05:00</published><updated>2005-06-07T19:36:55.590-05:00</updated><title type='text'>True OOP Exception Handling</title><content type='html'>&lt;p&gt;I have been having a problem with the use of try catch in .NET. It seems strange &lt;br/&gt;to me that a series of catch statements would be used when all the power of OOP &lt;br/&gt;is sitting there waiting to be used. I read an article about using &lt;a href="http://www.dotnetdevs.com/articles/ReflectionVisitor.aspx"&gt;Reflection in the Visitor Pattern &lt;/a&gt;for double dispatch. After reading this article I figured out &lt;br/&gt;how to handle exception in an object oriented manner with in the try catch scheme. It all boils down to the following class:
&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
Public MustInherit Class ExceptionHandlerBase

    Implements IExceptionHandler

    Protected MustOverride ReadOnly Property UseDefaultHandler() As Boolean

    Public Function HandleException(ByVal exception As Exception) As Boolean Implements IExceptionHandler.HandleException

        Dim handled As Boolean = False
        Dim types As Type() = New Type(0) {exception.GetType()}
        Dim MethodInformation As MethodInfo

        If Not exception.GetType Is GetType(Exception) Then
            MethodInformation = Me.GetType().GetMethod("Handle", types)
        End If

        If MethodInformation Is Nothing Then
            If Me.UseDefaultHandler Then
                Me.Handle(exception)
                handled = True
            End If
        Else
            MethodInformation.Invoke(Me, New Object(0) {exception})
            handled = True
        End If &lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;        Return handled
    End Function

    Public MustOverride Sub Handle(ByVal exception As Exception) Implements IExceptionHandler.Handle

End Class
&lt;/code&gt;
&lt;/pre&gt;
&lt;br/&gt;&lt;p&gt;
I have only thought of a few qualities of this approach to exception handling that &lt;br/&gt;make it a viable alternative or even an improvment on a catch blocks. First all &lt;br/&gt;the power of OOP can be allied to architect exception handling. Second what &lt;br/&gt;exceptions are handled is visible from the outside of a class. The following &lt;br/&gt;are examples of an inheritor and a client.
&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
Public Class ExampleExceptionHandler
    Inherits ExceptionHandlerBase

    Public Overloads Overrides Sub Handle(ByVal exception As System.Exception)

    End Sub

    Public Overloads Sub Handle(ByVal exception As IO.FileNotFoundException)
        'handle exception here
    End Sub

    Protected Overrides ReadOnly Property UseDefaultHandler() As Boolean
        Get
            Return False
        End Get
    End Property

End Class

Public Class Main

    Public Shared Sub Main()
        Try
            Throw New IO.FileNotFoundException("This is a test.")
        Catch ex As Exception
            Dim exceptionHandler As New ExampleExceptionHandler
            If Not exceptionHandler.HandleException(ex) Then
                Throw
            End If
        End Try
    End Sub

End Class
&lt;/code&gt;
&lt;/pre&gt;
&lt;br/&gt;&lt;p&gt;
Clearly the only exception that Class Main will handle, because it uses &lt;br/&gt;ExampleExceptionHandler, is FileNotFoundException. Normally one would have to &lt;br/&gt;read the code of Class Main know what exceptions are handled. I have finished &lt;br/&gt;an example for exception handling in the template Method Pattern, or Hollywood &lt;br/&gt;Pattern. It basically consists of a mirror hierarchy of ExceptionHandler &lt;br/&gt;classes, and a method factory implemented by the template Method concrete class &lt;br/&gt;to provide the concrete ExceptionHandler. I have also created an &lt;br/&gt;AggregateExceptionHandler which accepts multiple ExceptionHandlers. And I was &lt;br/&gt;thinking of an ExceptionHandler base class that accepts multiple parameters, ie &lt;br/&gt;ByVal exception as Exception, ByVal OtherObject as SomeOtherObject. &lt;/p&gt;&lt;p&gt;I had posted this entry a while ago but there was the possibility that my employer was &lt;br/&gt;going to claim it as it's intellectual property.&lt;/p&gt;&lt;p&gt;There will be some more &lt;br/&gt;posts on this subject shortly as the ideas did not seem patentable.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-111810337193599446?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/111810337193599446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=111810337193599446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111810337193599446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111810337193599446'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/06/true-oop-exception-handling.html' title='True OOP Exception Handling'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-111688241363675319</id><published>2005-05-23T16:06:00.001-05:00</published><updated>2005-05-23T16:24:47.773-05:00</updated><title type='text'>Serializer Plugin</title><content type='html'>I have release my first plugin for Relector, Serializer.  Below are some screen shots of the plugin in action.

Select a class that is serializable, right click it and select the Serzializer menu item.

&lt;a href="http://photos1.blogger.com/img/204/5923/1024/RelectorContextMenu.jpg"&gt;&lt;img style="border: 1px solid rgb(0, 0, 0); margin: 2px;" src="http://photos1.blogger.com/img/204/5923/400/RelectorContextMenu.jpg" border="0" /&gt;&lt;/a&gt;

The righthand panel will appear.  You can edit the values of the properties and save it as a file, SOAP or Binary.  If the property is typed as an abstract you can create a instance of a concrete type by right clicking the property name and selecting the type you wish to create.

&lt;a href="http://photos1.blogger.com/img/204/5923/1024/SerializerPropertyGridContextMenu.jpg"&gt;&lt;img style="border: 1px solid rgb(0, 0, 0); margin: 2px;" src="http://photos1.blogger.com/img/204/5923/400/SerializerPropertyGridContextMenu.jpg" border="0" /&gt;&lt;/a&gt;

If you were wanting to open up a serialized object you can use the &lt;span style="font-weight: bold;"&gt;Open&lt;/span&gt; button or you can drag and drop the file onto the property grid.  Don't for get to select what kind of formatter was used to serialize the object first.

I plan to add things like user configured decorator streams, e.g. Zip Stream and Encryption Stream.  Or even passing values to constructors.

You can get Serializer or the SerializerPlugin from &lt;a href="http://workspaces.gotdot.net.com/serializer"&gt;GotDotNet&lt;/a&gt;.
You will need &lt;span id="releasesControl_releaseRepeater__ctl0_contentLabel"&gt;Jonathan de Halleux's Relector.Framework for this to work. Please get  release 4.1.29.0 from &lt;a href="http://projectdistributor.net/Releases/Release.aspx?releaseId=177." target="_blank"&gt;ProjectDistributor.&lt;/a&gt;
You will also need &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;Relector&lt;/a&gt;.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-111688241363675319?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/111688241363675319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=111688241363675319' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111688241363675319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/111688241363675319'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2005/05/serializer-plugin.html' title='Serializer Plugin'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108583600009210442</id><published>2004-05-29T06:57:00.000-05:00</published><updated>2004-05-29T08:06:40.093-05:00</updated><title type='text'>The New Software Architect</title><content type='html'>Have you ever heard of genetic algorithms?  &lt;a href="http://www.codefarm.com/index.jsp"&gt;Codefarm&lt;/a&gt; is using genetic algorithms in their product &lt;b&gt;Galapagos&lt;/b&gt;.  They are marketing the software for engineering, finance, entertainment, biotechnology, and security.  I have only ever seen this technology used to create circuits.  It seems only a matter of time till this technology and software design patterns meet.  The question is how fill they fit, how best will they work together.
&lt;/br&gt;
If you know of &lt;b&gt;Microsoft's WhiteHorse&lt;/b&gt; (I think &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvsent/html/vsts-arch.asp"&gt;this&lt;/a&gt; is it and &lt;a href="http://msdn.microsoft.com/vstudio/teamsystem/developer/default.aspx?pull=/library/en-us/dv_vstechart/html/clssdsgnr.asp"&gt;this&lt;/a&gt; too) then you can imagine how one could use an interface similar to it to select an initial population.  The more difficult part, as always, would be in creating the fitness tests for the evaluations of the newly spawned generations.
Is your head spinning yet?  If not you must not understand.  This kind of technology has the potentially to change so much it is mind boggling.  It is already starting to change the &lt;a href="http://news.bbc.co.uk/1/hi/technology/3752725.stm"&gt;economy&lt;/a&gt;.  How will you be effected?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108583600009210442?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108583600009210442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108583600009210442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108583600009210442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108583600009210442'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/new-software-architect.html' title='The New Software Architect'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108525145524105939</id><published>2004-05-22T13:44:00.000-05:00</published><updated>2004-05-22T13:44:15.240-05:00</updated><title type='text'>WSS FAQ</title><content type='html'>&lt;a href="http://wss.collutions.com/default.aspx"&gt;Home - WSS FAQ&lt;/a&gt;
&lt;p&gt;
This is just an all around good SharePoint Services site.  Something I should hang on to.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108525145524105939?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://wss.collutions.com/default.aspx' title='WSS FAQ'/><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108525145524105939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108525145524105939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108525145524105939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108525145524105939'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/wss-faq.html' title='WSS FAQ'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-10852347455350914</id><published>2004-05-22T09:05:00.000-05:00</published><updated>2004-05-22T09:05:45.536-05:00</updated><title type='text'>Don Box's Spoutlet: Deconstructing Remoting</title><content type='html'>&lt;a href="http://www.gotdotnet.com/team/dbox/default.aspx?month=2004-04"&gt;Don Box's Spoutlet: April&lt;/a&gt;

Don has an excellent spout on .NET Remoting, where it is going, and what to count on.  His blog will not allow permalinks to old entries so I have copied it here.

Deconstructing Remoting
Grant Killian asks for the skinny on remoting.
 
I've watched people try to give high-level guidance on this, but the fact that this has become a permathread means that a different approach is in order. 
 
It's actually quite simple if you're willing to take a few minutes to look at what's actually under System.Runtime.Remoting.  
 
The Good 
 
The transparent proxy/stack builder sink allow you to cons up an object reference for ANY CLR interface. That technology is alive and well and a crucial part of the CLR.  When you make a channel call on a service contract in indigo M5 (our current milestone), the TP is working its magic on your stack frame.
 
The CLR uses the TP/SBS infrastructure to allow object references to marshal across appdomains inside a process. That technology is also alive and well and frankly, it just works (if it didn't, the CLR would melt down pretty quickly). If you've ever called AppDomain.CreateDomain, you've been using the TP/SBS stuff.  I would strongly recommend not counting on the existence of the CrossDomain channel. Its existence is undoc'ed and we've looked at various ways to change it's implementation radically to improve perf. 
 
The Bad 
 
We built support for WSDL under the TP/SBS infrastructure that is an architectural dead end. If you run into me at a conference, please do me a favor and let me remove SOAPSUDS.EXE from your laptop.
 
The Ugly 
 
.NET Remoting really assumes shared classes and shared assemblies between the two endpoints. Indigo exists to break this dependency. This is the biggest architectural change but it's profound.
 
V1 of the CLR shipped with an extensibility point for doing custom transport channels under the TP/SBS mechanism based on bytes. Indigo has a SOAP/Infoset-based architecture that we believe is more general and has a longer life span (yes, it's weird to think that SOAP will  outlive bytes).
 
V1 of the CLR shipped with a binary/TCP transport channel. There are no plans to support this one-off proprietary format natively in Indigo.
 
For some ugly historical reasons, the TP/SBS infrastructure allows class-based remoting using System.MarshalByRefObject. Indigo does not require MBRO.
 
Ending this permathread once and for all? 
 
The real asset is the TP/SBS infrastructure. If you find yourself wanting to use it, do so with a clear conscience. Feel free to point your management to this blog entry if that helps.
 
If you're crossing host boundaries, ASMX is probably a better choice, both architecturally as well as in terms of tracking where the platform is headed in the next 2-10 years. 
2004-04-26T03:14:52Z
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-10852347455350914?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.gotdotnet.com/team/dbox/default.aspx?month=2004-04' title='Don Box&apos;s Spoutlet: Deconstructing Remoting'/><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/10852347455350914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=10852347455350914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/10852347455350914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/10852347455350914'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/don-boxs-spoutlet-deconstructing.html' title='Don Box&apos;s Spoutlet: Deconstructing Remoting'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108523345974533195</id><published>2004-05-22T08:44:00.000-05:00</published><updated>2004-05-22T08:47:28.100-05:00</updated><title type='text'>A .NET Developer's Guide to Windows Security</title><content type='html'>&lt;a href="http://www.pluralsight.com/keith/book/html/book.html"&gt;A .NET Developer's Guide to Windows Security&lt;/a&gt;
&lt;p&gt;
As Don Box &lt;a href="http://www.gotdotnet.com/team/dbox/default.aspx?key=2004-05-21T04:27:00Z"&gt;spouts&lt;/a&gt; this book shows a "bottom up rather than the CAS-down approach".  Always good to know more than one perspective.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108523345974533195?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.pluralsight.com/keith/book/html/book.html' title='A .NET Developer&apos;s Guide to Windows Security'/><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108523345974533195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108523345974533195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108523345974533195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108523345974533195'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/net-developers-guide-to-windows.html' title='A .NET Developer&apos;s Guide to Windows Security'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108501316385855317</id><published>2004-05-19T19:32:00.000-05:00</published><updated>2004-05-19T19:32:43.856-05:00</updated><title type='text'>TheArchitect.co.uk - Jorgen Thelin's weblog: Developing an Alerts Web Service</title><content type='html'>&lt;a href="http://www.thearchitect.co.uk/weblog/archives/2004/05/000314.html"&gt;TheArchitect.co.uk - Jorgen Thelin's weblog: Developing an Alerts Web Service&lt;/a&gt;
&lt;p&gt;
It would be nice to to do some thing like this to create an alert system for CruiseControl.NET.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108501316385855317?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.thearchitect.co.uk/weblog/archives/2004/05/000314.html' title='TheArchitect.co.uk - Jorgen Thelin&apos;s weblog: Developing an Alerts Web Service'/><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108501316385855317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108501316385855317' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108501316385855317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108501316385855317'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/thearchitectcouk-jorgen-thelins-weblog.html' title='TheArchitect.co.uk - Jorgen Thelin&apos;s weblog: Developing an Alerts Web Service'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108501250694714426</id><published>2004-05-19T19:21:00.000-05:00</published><updated>2004-05-19T19:21:46.946-05:00</updated><title type='text'>Thoughtpost - Peer-to-Peer Development</title><content type='html'>&lt;a href="http://www.thoughtpost.com/p2p.aspx"&gt;Thoughtpost - Peer-to-Peer Development&lt;/a&gt;
&lt;p&gt;
This company offers a free wrapper to the MS P2P SDK.  It appears to be reputable, being that &lt;a href="http://devhawk.net/PermaLink.aspx?guid=03b84207-cf17-405d-8404-b3eab5924124"&gt;Harry Pierson&lt;/a&gt;, a member of the Microsoft Platform Strategy &amp; Partner Group, is using it instead of rolling his own.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108501250694714426?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.thoughtpost.com/p2p.aspx' title='Thoughtpost - Peer-to-Peer Development'/><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108501250694714426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108501250694714426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108501250694714426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108501250694714426'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/thoughtpost-peer-to-peer-development.html' title='Thoughtpost - Peer-to-Peer Development'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108493072840513574</id><published>2004-05-18T20:38:00.000-05:00</published><updated>2004-05-18T20:38:48.406-05:00</updated><title type='text'>Some Good EAI Stuff</title><content type='html'>&lt;html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"&gt;  &lt;head&gt; &lt;meta http-equiv=Content-Type content="text/html; charset=us-ascii"&gt; &lt;meta name=ProgId content=Word.Document&gt; &lt;meta name=Generator content="Microsoft Word 11"&gt; &lt;meta name=Originator content="Microsoft Word 11"&gt; &lt;link rel=File-List href="cid:filelist.xml@01C43D20.81D4EF00"&gt; &lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:OfficeDocumentSettings&gt;   &lt;o:DoNotRelyOnCSS/&gt;  &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:SpellingState&gt;Clean&lt;/w:SpellingState&gt;   &lt;w:GrammarState&gt;Clean&lt;/w:GrammarState&gt;   &lt;w:DocumentKind&gt;DocumentEmail&lt;/w:DocumentKind&gt;   &lt;w:EnvelopeVis/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:UseWord2002TableStyleRules/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" LatentStyleCount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt; &lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0in; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman";} a:link, span.MsoHyperlink 	{color:blue; 	text-decoration:underline; 	text-underline:single;} a:visited, span.MsoHyperlinkFollowed 	{color:purple; 	text-decoration:underline; 	text-underline:single;} span.EmailStyle17 	{mso-style-type:personal-compose; 	mso-style-noshow:yes; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:Arial; 	mso-ascii-font-family:Arial; 	mso-hansi-font-family:Arial; 	mso-bidi-font-family:Arial; 	color:windowtext;} span.SpellE 	{mso-style-name:""; 	mso-spl-e:yes;} span.GramE 	{mso-style-name:""; 	mso-gram-e:yes;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.25in 1.0in 1.25in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt; &lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */   table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin:0in; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt; &lt;/head&gt;  &lt;body lang=EN-US link=blue vlink=purple style='tab-interval:.5in'&gt;  &lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;span class=GramE&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;A list of architectural &lt;a href="http://msdn.microsoft.com/architecture/community/blogs/default.aspx"&gt;&lt;span class=SpellE&gt;Blogs&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;span class=GramE&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;Updated MSDN Architecture &lt;a href="http://msdn.microsoft.com/architecture/"&gt;Site&lt;/a&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Recently MS created &lt;a href="http://msdn.microsoft.com/architecture/community/workspaces/default.aspx"&gt;workspaces&lt;/a&gt; for community collaboration on architectural issues.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Book &lt;a href="http://msdn.microsoft.com/architecture/default.aspx?pull=/library/en-us/dnpag/html/intpatt.asp"&gt;preview&lt;/a&gt;, &lt;span class=SpellE&gt;Gregor&lt;/span&gt; &lt;span class=SpellE&gt;Hohpe&lt;/span&gt; is one of the authors.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;span class=GramE&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;A recent &lt;a href="http://www.eaipatterns.com/ramblings/08_integrationstyles.html"&gt;ramble&lt;/a&gt; of &lt;span class=SpellE&gt;Gregor&amp;#8217;s&lt;/span&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/body&gt;  &lt;/html&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108493072840513574?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108493072840513574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108493072840513574'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/some-good-eai-stuff.html' title='Some Good EAI Stuff'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108492709673866582</id><published>2004-05-18T19:38:00.000-05:00</published><updated>2004-05-18T19:38:16.736-05:00</updated><title type='text'>Quantum Entanglment May Effect You Sooner Than You Think</title><content type='html'>&lt;/br&gt;
&lt;a href="http://www.newscientist.com/news/news.jsp?id=ns99994988"&gt;New Scientist&lt;/a&gt;
&lt;/br&gt;
&lt;p&gt;
Apparently entangling a pair or more of photons lets you reduce their wavelength.  This little trick can be applied to CDs to increase the density of data stored.
&lt;/p&gt;
&lt;p&gt;
I wonder how long till entanglement can be used to teleport?
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108492709673866582?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.newscientist.com/news/news.jsp?id=ns99994988' title='Quantum Entanglment May Effect You Sooner Than You Think'/><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108492709673866582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108492709673866582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108492709673866582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108492709673866582'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/quantum-entanglment-may-effect-you.html' title='Quantum Entanglment May Effect You Sooner Than You Think'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108463414156661378</id><published>2004-05-15T10:15:00.000-05:00</published><updated>2004-05-15T11:00:50.503-05:00</updated><title type='text'>Get'n your news.</title><content type='html'>&lt;a href="http://uk.newsbot.msn.com/"&gt;MSN Newsbot&lt;/a&gt;

&lt;p&gt;This is nice alternative to the Google news site.&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108463414156661378?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108463414156661378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108463414156661378' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108463414156661378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108463414156661378'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/getn-your-news.html' title='Get&apos;n your news.'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108463203234279307</id><published>2004-05-15T09:40:00.000-05:00</published><updated>2004-05-15T10:21:19.093-05:00</updated><title type='text'>Breaking the Static Friction of Commercializing Space</title><content type='html'>&lt;html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"&gt;  &lt;head&gt; &lt;meta http-equiv=Content-Type content="text/html; charset=us-ascii"&gt; &lt;meta name=ProgId content=Word.Document&gt; &lt;meta name=Generator content="Microsoft Word 11"&gt; &lt;meta name=Originator content="Microsoft Word 11"&gt; &lt;link rel=File-List href="cid:filelist.xml@01C43A69.09E6BC30"&gt; &lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:OfficeDocumentSettings&gt;   &lt;o:DoNotRelyOnCSS/&gt;  &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:SpellingState&gt;Clean&lt;/w:SpellingState&gt;   &lt;w:GrammarState&gt;Clean&lt;/w:GrammarState&gt;   &lt;w:DocumentKind&gt;DocumentEmail&lt;/w:DocumentKind&gt;   &lt;w:EnvelopeVis/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:UseWord2002TableStyleRules/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" LatentStyleCount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt; &lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0in; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman";} a:link, span.MsoHyperlink 	{color:blue; 	text-decoration:underline; 	text-underline:single;} a:visited, span.MsoHyperlinkFollowed 	{color:purple; 	text-decoration:underline; 	text-underline:single;} span.EmailStyle17 	{mso-style-type:personal-compose; 	mso-style-noshow:yes; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:Arial; 	mso-ascii-font-family:Arial; 	mso-hansi-font-family:Arial; 	mso-bidi-font-family:Arial; 	color:windowtext;} span.SpellE 	{mso-style-name:""; 	mso-spl-e:yes;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.25in 1.0in 1.25in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt; &lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */   table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin:0in; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt; &lt;/head&gt;  &lt;body lang=EN-US link=blue vlink=purple style='tab-interval:.5in'&gt;  &lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;It looks to me like the &lt;a href="http://ffden-2.phys.uaf.edu/211_fall2002.web.dir/Ben_Townsend/StaticandKineticFriction.htm"&gt;static friction&lt;/a&gt; is about to be broken if it has not already. &lt;span style='mso-spacerun:yes'&gt;&amp;nbsp;&lt;/span&gt;Every week I see new articles about goings on in space by entities other than governments.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://www.orbitalrecovery.com/conexpress.html"&gt;Space Tug&lt;/a&gt;&lt;span style='mso-spacerun:yes'&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;font color=black face=Arial&gt;&lt;span style='font-family:Arial;color:black'&gt;&lt;a href="http://news.google.com/news?hl=en&amp;amp;edition=us&amp;amp;ie=UTF-8&amp;amp;newsclusterurl=http://www.wired.com/news/technology/0,1282,63475,00.html%3Ftw%3Dwn_tophead_1" target=nw&gt;&lt;font size=2 color=green face="Times New Roman"&gt;&lt;span style='font-size:10.0pt;font-family:"Times New Roman";color:green'&gt;and more &amp;raquo;&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://news.google.com/news?num=30&amp;amp;hl=en&amp;amp;edition=us&amp;amp;q=cluster:msnbc%2emsn%2ecom%2fid%2f4970837%2f"&gt;X Prize&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://news.google.com/news?num=30&amp;amp;hl=en&amp;amp;edition=us&amp;amp;ie=UTF-8&amp;amp;q=%22Spaceport%22+%22new+Mexico"&gt;Space Port&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://home.businesswire.com/portal/site/google/index.jsp?ndmViewId=news_view&amp;amp;newsId=20040412005534&amp;amp;newsLang=en"&gt;Space Elevator&lt;/a&gt; &lt;/span&gt;&lt;/font&gt;&lt;font color=black face=Arial&gt;&lt;span style='font-family: Arial;color:black'&gt;&lt;a href="http://news.google.com/news?num=30&amp;amp;hl=en&amp;amp;edition=us&amp;amp;ie=UTF-8&amp;amp;q=%22Space+Elevator%22" target=nw&gt;&lt;font size=2 color=green face="Times New Roman"&gt;&lt;span style='font-size:10.0pt;font-family:"Times New Roman";color:green'&gt;and more &amp;raquo;&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt;font-family:Arial'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;It is all so very exciting; I am lucky to like the time I am living in.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/body&gt;  &lt;/html&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108463203234279307?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108463203234279307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108463203234279307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108463203234279307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108463203234279307'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/breaking-static-friction-of.html' title='Breaking the Static Friction of Commercializing Space'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108439535193484310</id><published>2004-05-12T15:55:00.000-05:00</published><updated>2004-05-15T10:55:49.866-05:00</updated><title type='text'>I see said the blind man.</title><content type='html'>&lt;html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"&gt;  &lt;head&gt; &lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"&gt; &lt;meta name=Generator content="Microsoft Word 11 (filtered medium)"&gt; &lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0in; 	margin-bottom:.0001pt; 	font-size:12.0pt; 	font-family:"Times New Roman";} a:link, span.MsoHyperlink 	{color:blue; 	text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed 	{color:purple; 	text-decoration:underline;} span.EmailStyle17 	{mso-style-type:personal-compose; 	font-family:Arial; 	color:windowtext;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.25in 1.0in 1.25in;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;  &lt;/head&gt;  &lt;body lang=EN-US link=blue vlink=purple&gt;  &lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I have my monitors set to 1280 x 1024. I can read most everything just fine on the flat panel, but on the laptop monitor things are just a little blurry.&amp;nbsp; I saw a link on my MSN for &lt;a href="http://www.microsoft.com/typography/ClearTypeInfo.mspx"&gt;ClearType&lt;/a&gt;.&amp;nbsp; It is font display technology.&amp;nbsp; I won&amp;#8217;t go into the details, it just works.&amp;nbsp; It made a significant difference for me.&amp;nbsp; The following link will help you adjust your computer.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://www.microsoft.com/typography/cleartype/tuner/1.htm"&gt;http://www.microsoft.com/typography/cleartype/tuner/1.htm&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/body&gt;  &lt;/html&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108439535193484310?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108439535193484310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108439535193484310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108439535193484310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108439535193484310'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/i-see-said-blind-man.html' title='I see said the blind man.'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108437884547862687</id><published>2004-05-12T11:20:00.000-05:00</published><updated>2004-05-15T10:56:19.770-05:00</updated><title type='text'>Strange Indeed</title><content type='html'>&lt;html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"&gt;  &lt;head&gt; &lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"&gt; &lt;meta name=Generator content="Microsoft Word 11 (filtered medium)"&gt; &lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0in; 	margin-bottom:.0001pt; 	font-size:12.0pt; 	font-family:"Times New Roman";} a:link, span.MsoHyperlink 	{color:blue; 	text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed 	{color:purple; 	text-decoration:underline;} span.EmailStyle17 	{mso-style-type:personal-compose; 	font-family:Arial; 	color:windowtext;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.25in 1.0in 1.25in;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;  &lt;/head&gt;  &lt;body lang=EN-US link=blue vlink=purple&gt;  &lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I want one.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://www.ambientdevices.com/cat/orb/orborder.html"&gt;http://www.ambientdevices.com/cat/orb/orborder.html&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/body&gt;  &lt;/html&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108437884547862687?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108437884547862687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108437884547862687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108437884547862687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108437884547862687'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/strange-indeed.html' title='Strange Indeed'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108431408843832901</id><published>2004-05-11T17:21:00.000-05:00</published><updated>2004-05-15T10:56:59.990-05:00</updated><title type='text'>Never in a million years</title><content type='html'>&lt;html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"&gt;  &lt;head&gt; &lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"&gt; &lt;meta name=ProgId content=Word.Document&gt; &lt;meta name=Generator content="Microsoft Word 11"&gt; &lt;meta name=Originator content="Microsoft Word 11"&gt; &lt;link rel=File-List href="cid:filelist.xml@01C43784.C6619070"&gt; &lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:OfficeDocumentSettings&gt;   &lt;o:DoNotRelyOnCSS/&gt;  &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:SpellingState&gt;Clean&lt;/w:SpellingState&gt;   &lt;w:GrammarState&gt;Clean&lt;/w:GrammarState&gt;   &lt;w:DocumentKind&gt;DocumentEmail&lt;/w:DocumentKind&gt;   &lt;w:EnvelopeVis/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:UseWord2002TableStyleRules/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" LatentStyleCount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt; &lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0in; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman";} a:link, span.MsoHyperlink 	{color:blue; 	text-decoration:underline; 	text-underline:single;} a:visited, span.MsoHyperlinkFollowed 	{color:purple; 	text-decoration:underline; 	text-underline:single;} span.EmailStyle17 	{mso-style-type:personal-compose; 	mso-style-noshow:yes; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:Arial; 	mso-ascii-font-family:Arial; 	mso-hansi-font-family:Arial; 	mso-bidi-font-family:Arial; 	color:windowtext;} span.SpellE 	{mso-style-name:""; 	mso-spl-e:yes;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.25in 1.0in 1.25in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt; &lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */   table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin:0in; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt; &lt;/head&gt;  &lt;body lang=EN-US link=blue vlink=purple style='tab-interval:.5in'&gt;  &lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;I never expected to see such a credible source for a UFO sighting. &lt;span style='mso-spacerun:yes'&gt;&amp;nbsp;&lt;/span&gt;Amazing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://www.alertnet.org/thenews/newsdesk/N11505757.htm"&gt;http://www.alertnet.org/thenews/newsdesk/N11505757.htm&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/body&gt;  &lt;/html&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108431408843832901?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108431408843832901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108431408843832901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108431408843832901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108431408843832901'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/never-in-million-years.html' title='Never in a million years'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3917528.post-108430703893082503</id><published>2004-05-11T15:23:00.000-05:00</published><updated>2004-05-15T10:58:14.626-05:00</updated><title type='text'>X Prize 2005 Races</title><content type='html'>&lt;html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:st1="urn:schemas-microsoft-com:office:smarttags" xmlns="http://www.w3.org/TR/REC-html40"&gt;  &lt;head&gt; &lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"&gt; &lt;meta name=Generator content="Microsoft Word 11 (filtered medium)"&gt; &lt;o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"  name="State"/&gt; &lt;o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"  name="place"/&gt; &lt;!--[if !mso]&gt; &lt;style&gt; st1\:*{behavior:url(#default#ieooui) } &lt;/style&gt; &lt;![endif]--&gt; &lt;style&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{margin:0in; 	margin-bottom:.0001pt; 	font-size:12.0pt; 	font-family:"Times New Roman";} a:link, span.MsoHyperlink 	{color:blue; 	text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed 	{color:purple; 	text-decoration:underline;} span.EmailStyle17 	{mso-style-type:personal-compose; 	font-family:Arial; 	color:windowtext;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.25in 1.0in 1.25in;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;  &lt;/head&gt;  &lt;body lang=EN-US link=blue vlink=purple&gt;  &lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;Looks like &lt;st1:State w:st="on"&gt;&lt;st1:place w:st="on"&gt;New Mexico&lt;/st1:place&gt;&lt;/st1:State&gt; could be a hot place to live in the near future.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;a href="http://www.azcentral.com/news/articles/0511xprize-ON.html"&gt;http://www.azcentral.com/news/articles/0511xprize-ON.html&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;font size=2 face=Arial&gt;&lt;span style='font-size:10.0pt; font-family:Arial'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;/body&gt;  &lt;/html&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3917528-108430703893082503?l=jflowers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jflowers.blogspot.com/feeds/108430703893082503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3917528&amp;postID=108430703893082503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108430703893082503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3917528/posts/default/108430703893082503'/><link rel='alternate' type='text/html' href='http://jflowers.blogspot.com/2004/05/x-prize-2005-races.html' title='X Prize 2005 Races'/><author><name>Jay Flowers</name><uri>http://www.blogger.com/profile/17708391544466063061</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/img/204/5923/320/Vacation%200021.jpg'/></author><thr:total>0</thr:total></entry></feed>
