<?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-6199398143014448393</id><updated>2011-11-27T17:16:09.985-06:00</updated><category term='Namespace'/><category term='TeamBuild'/><category term='xmlns'/><category term='MSBuild'/><category term='XPath'/><category term='XMLUpdate'/><title type='text'>Code Baboon</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-8928018016141685744</id><published>2010-12-08T21:25:00.002-06:00</published><updated>2010-12-08T21:51:55.667-06:00</updated><title type='text'>TechDays Follow Up</title><content type='html'>After my presentation on Build Automation with TFS 2010 this week at TechDays I was presented with a few questions that I didn't have a great answer for at the time. So guess what? I've dusted off the old blog! This kind of feels like a big comeback concert for a retired musician, only if instead of conjuring images of a Led Zeppelin or Eagles reunion, it's a little more like some dude that played in local bars on open mic night in his 20's getting drunk at his son's wedding social and playing with the live band for 25 minutes before throwing up a little on his guitar strap and being kindly asked to sit down.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anywho, lets talk business.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Question the first&lt;/b&gt;: Where can I find documentation on existing 2010 build activities?&lt;/div&gt;&lt;div&gt;&lt;b&gt;Answer&lt;/b&gt;: You can't. Seriously, lame as this answer is, from what I understand there is no documentation to be found. Sorry.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Question&lt;/b&gt; &lt;b&gt;the second&lt;/b&gt;: Is there an activity to deploy a website to IIS?&lt;/div&gt;&lt;div&gt;&lt;b&gt;Answer&lt;/b&gt;: The answer is technically no, but you can do this via MS Deploy and then add some build arguments to kick it off. Check out &lt;a href="http://blogs.allmatech.com.br/Blogs/ALMTeam/post/MSDeploy-Series.aspx"&gt;this post&lt;/a&gt; which describes the process in pretty solid detail.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Question the last&lt;/b&gt;: What is the link to Ewald Hofman's blog post about creating custom activities that you failed to walk through because you forgot you had no internet connection?&lt;/div&gt;&lt;div&gt;&lt;b&gt;Answer&lt;/b&gt;: You can find the specific post &lt;a href="http://www.ewaldhofman.nl/post/2010/04/29/Customize-Team-Build-2010-e28093-Part-4-Create-your-own-activity.aspx"&gt;here&lt;/a&gt;, which is one of a series of great posts on customizing team build. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And that's it! This has been kind of fun, and makes me want to revive the blog a little, but I'm not making any promises. If you really feel like you need a little baboon in your life, check me out on twitter (@codebaboon).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-8928018016141685744?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/8928018016141685744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=8928018016141685744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8928018016141685744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8928018016141685744'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2010/12/techdays-follow-up.html' title='TechDays Follow Up'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-1590342294856601403</id><published>2009-11-13T10:11:00.004-06:00</published><updated>2009-11-13T10:39:59.698-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XPath'/><category scheme='http://www.blogger.com/atom/ns#' term='XMLUpdate'/><category scheme='http://www.blogger.com/atom/ns#' term='xmlns'/><category scheme='http://www.blogger.com/atom/ns#' term='Namespace'/><category scheme='http://www.blogger.com/atom/ns#' term='MSBuild'/><category scheme='http://www.blogger.com/atom/ns#' term='TeamBuild'/><title type='text'>MSBuild + XMLUpdate + XPath + Namespaces</title><content type='html'>&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;Today I came across an issue trying to use an XMLUpdate statement against the web.config in our team deployment build, and while the Googling did end up helping me resolve the issue, it didn't turn up any direct results that really showed/explained what I needed to do. So what would Brian Boitano do? Well, besides using his magical fire breath to save a maiden, he'd probably decide to dig up the rotting corpse of his blog and fill the void himself. So here we are!&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;Anyways, check out the relevant chunk of my config file (sensitive info obfuscated, of course):&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; min-height: 13.0px"&gt;&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px 'Courier New'; color: #2b30fa"&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;xml &lt;span style="color:#ff1111;"&gt;version&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;1.0&lt;span style="color:#000000;"&gt;"&lt;/span&gt;?&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;&lt;&lt;/span&gt;configuration&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span class="Apple-style-span"  style="color:#2B30FA;"&gt;...&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;  &lt;&lt;span style="color:#b51f1f;"&gt;openaccess&lt;/span&gt; &lt;span style="color:#ff1111;"&gt;xmlns&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;http://www.telerik.com/OpenAccess&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;    &lt;&lt;/span&gt;references&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;      &lt;&lt;span style="color:#b51f1f;"&gt;reference&lt;/span&gt; &lt;span style="color:#ff1111;"&gt;assemblyname&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;OurAssembly.Name&lt;span style="color:#000000;"&gt;"&lt;/span&gt; &lt;span style="color:#ff1111;"&gt;configrequired&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;True&lt;span style="color:#000000;"&gt;"&lt;/span&gt; /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;    &amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;references&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;    &lt;&lt;/span&gt;connections&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;      &lt;&lt;span style="color:#b51f1f;"&gt;connection&lt;/span&gt; &lt;span style="color:#ff1111;"&gt;id&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;OurDatabase&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;databasename&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;OurDB&lt;span class="Apple-style-span" style="color: rgb(43, 48, 250); "&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;databasename&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;servername&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;.\SQLEXPRESS&lt;span class="Apple-style-span" style="color: rgb(43, 48, 250); "&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;servername&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;integratedSecurity&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;True&lt;span class="Apple-style-span" style="color: rgb(43, 48, 250); "&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;integratedSecurity&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;backendconfigurationname&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;mssqlConfiguration&lt;span class="Apple-style-span" style="color: rgb(43, 48, 250); "&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;backendconfigurationname&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;connectionParams&lt;span style="color:#2b30fa;"&gt;&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;connectionParams&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;      &amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;connection&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;    &amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;connections&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;    &lt;&lt;/span&gt;backendconfigurations&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;      &lt;&lt;span style="color:#b51f1f;"&gt;backendconfiguration&lt;/span&gt; &lt;span style="color:#ff1111;"&gt;id&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;mssqlConfiguration&lt;span style="color:#000000;"&gt;"&lt;/span&gt; &lt;span style="color:#ff1111;"&gt;backend&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;mssql&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;mappingname&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;mssqlMapping&lt;span class="Apple-style-span" style="color: rgb(43, 48, 250); "&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;mappingname&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;logging.logEventsToTrace&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;False&lt;span class="Apple-style-span" style="color: rgb(43, 48, 250); "&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;logging.logEventsToTrace&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;logging.logEvents&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;verbose&lt;span class="Apple-style-span" style="color: rgb(43, 48, 250); "&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;logging.logEvents&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;lockTimeout&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;5000&lt;span class="Apple-style-span" style="color: rgb(43, 48, 250); "&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;lockTimeout&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;        &lt;&lt;/span&gt;logging.logEventsToSysOut&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;False&lt;span class="Apple-style-span" style="color: rgb(43, 48, 250); "&gt;&amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;logging.logEventsToSysOut&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;      &amp;lt;&lt;span class="Apple-style-span" style="color: rgb(181, 31, 31); "&gt;&lt;span style="color:#2b30fa;"&gt;/&lt;/span&gt;backendconfiguration&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;    &amp;lt;/&lt;/span&gt;backendconfigurations&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;  &amp;lt;/&lt;/span&gt;openaccess&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;...&lt;/p&gt;&lt;br /&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: normal; color: rgb(43, 48, 250); "&gt;&amp;lt;/&lt;/span&gt;configuration&lt;span style="color:#2b30fa;"&gt;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#b51f1f;"&gt;&lt;span style="color:#2b30fa;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; min-height: 13.0px"&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;As you can see, we're using the Telerik OpenAccess ORM tools. My goal was to insert some values into the connectionParams node specific to our deployed application scenario, so I originally had a statement in the team build proj file that looked like this:&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;    &lt;&lt;span style="color:#b51f1f;"&gt;XmlUpdate&lt;/span&gt;  &lt;span style="color:#ff1111;"&gt;XmlFileName&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;%(WebConfig.FullPath)&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;        &lt;span style="color:#ff1111;"&gt;XPath&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;//configuration/openaccess/connections/connection[@id='OurDatabase']/@connectionParams&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;        &lt;span style="color:#ff1111;"&gt;Value&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;AttachDbFileName=$(DropLocation)\$(LabelName)\$(Configuration)\_PublishedWebsites\$(WebProjectName)\OurDB.mdf&lt;span style="color:#000000;"&gt;"&lt;/span&gt; /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #2b30fa; min-height: 12.0px"&gt;    &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;Unfortunately, it didn’t work. After some digging I discovered that the xmlns attribute on the openaccess node messes with XPath, and that I could use a Namespace attribute to help solve that problem, but nothing really showed how exactly to do it. I used a little trial and error and came up with the solution as seen here:&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;    &lt;&lt;span style="color:#b51f1f;"&gt;XmlUpdate&lt;/span&gt; &lt;span style="color:#ff1111;"&gt;XmlFileName&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;%(WebConfig.FullPath)&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;        &lt;span style="color:#ff1111;"&gt;Prefix&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;n&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b30fa;"&gt;        &lt;span style="color:#ff1111;"&gt;Namespace&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;http://www.telerik.com/OpenAccess&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;/p&gt; &lt;p color="#2b30fa" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;        &lt;span style="color:#ff1111;"&gt;XPath&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;//configuration/n:openaccess/n:connections/n:connection[@id='OurDatabase']/n:connectionParams&lt;span style="color:#000000;"&gt;"&lt;/span&gt;&lt;/p&gt; &lt;p color="#2b30fa" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;        &lt;span style="color:#ff1111;"&gt;Value&lt;/span&gt;=&lt;span style="color:#000000;"&gt;"&lt;/span&gt;AttachDbFileName=$(DropLocation)\$(LabelName)\$(Configuration)\_PublishedWebsites\$(WebProjectName)\OurDB.mdf&lt;span style="color:#000000;"&gt;"&lt;/span&gt; /&gt;&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-size:85%;color:#2B30FA;"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:10px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; min-height: 13.0px"&gt;So as a way of explanation, we define the namespace we're hunting for and assign it a prefix. Then, in the XPath, we use the prefix for any node that falls within that namespace, but not for the nodes before it takes effect (such as configuration).&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; min-height: 13.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica"&gt;All of this info is out there on the web in pieces, and I'm sure smarter folks than I can put it together quickly and move on, but hopefully this post will help the other goobers like me who would otherwise take an hour or two to put all the pieces of the puzzle together.&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica, serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica, serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:11px;"&gt;Faithfully yours,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica, serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica, serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:11px;"&gt;Code Baboon&lt;/span&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/6199398143014448393-1590342294856601403?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/1590342294856601403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=1590342294856601403' title='31 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1590342294856601403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1590342294856601403'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2009/11/msbuild-xmlupdate-xpath-namespaces.html' title='MSBuild + XMLUpdate + XPath + Namespaces'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>31</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-2644561674113085684</id><published>2009-05-29T12:03:00.001-05:00</published><updated>2009-05-29T12:07:02.649-05:00</updated><title type='text'>Inspiration Ain't No Dime-Store Booty Call</title><content type='html'>If there is something I've learned over the 30-some years I've sullied this planet with my presence, it's that creative inspiration is not your average mistress.&lt;br /&gt;&lt;br /&gt;You see, your average mistress is just a 7 digit SMS away, always lustily awaiting your poetic summons. "Motel 6 rte 53 7pm smel good". As you pull up to that grungy roadside inn, 10 minutes late and whiffing of stale rye, you can be certain that your average mistress is patiently waiting inside, ready to get the business. 25 minutes and one step closer to hell later, your average mistress will blissfully watch you leave, reassuring you all the while that she really doesn't mind taking the city bus to meet up. It's only one transfer, and besides, it gives her uninterrupted time to think just of you.&lt;br /&gt;&lt;br /&gt;But inspiration... inspiration is a much different creature. Inspiration flits around the edges of your mind all day, but never heeds your call. Inspiration does not arrive at a time of your choosing, but rather taps incessantly on your bedroom window at 2:45am while you lay beside your gently sleeping betrothed. At times inspiration will disappear for weeks, even months, nowhere to be found. There is no note, no phone call, no "Gone to Cancun, back next week with pics" text message. Simply an empty void where something important should be. No, inspiration ain't no dime-store booty call.&lt;br /&gt;&lt;br /&gt;So, what to do when inspiration comes knocking, awkwardly thrusting it's heaving bosom of creativity in your direction at the most unworkable of times? Do you risk turning it away, spurning the unique joy and passion that only inspiration can provide, perhaps not to see it again for what may seem an unlivable period of time? Or do you drop what you're doing, hand your 5 year-old child a $20 bill and say "I've got another one of these for you if I don't see you for the next hour", and harken the call of your supple muse?&lt;br /&gt;&lt;br /&gt;Ultimately, it's your call. But perhaps the most vexing attribute of inspiration is that even when you welcome it and embrace it, even as you relish awash in the waves of sheer beauty emanating from it, and often just as you are certain you are experiencing the most climactic of surreal epiphanies, even with all that, time and again it will simply vanish, and your handiwork is left unfini-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-2644561674113085684?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/2644561674113085684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=2644561674113085684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2644561674113085684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2644561674113085684'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2009/05/inspiration-aint-no-dime-store-booty.html' title='Inspiration Ain&apos;t No Dime-Store Booty Call'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-5723731788765336667</id><published>2009-05-19T13:44:00.004-05:00</published><updated>2009-05-19T14:07:15.953-05:00</updated><title type='text'>Too. Much. Fun</title><content type='html'>I've been blessed with a new laptop here at work, and so over the last week I've slowly been transitioning to it. Today I went to open a PDF document and realised that I had yet to install a PDF Viewer. Now, I've long hated &lt;a href="http://www.adobe.com/products/reader/"&gt;Acrobat Reader&lt;/a&gt; due to it's terrible load times, and a few years back discovered a much better option in &lt;a href="http://www.foxitsoftware.com/pdf/reader/"&gt;Foxit Reader&lt;/a&gt;. However, I felt it might be time to take a quick look at the PDF Viewer landscape and see if anything else might have popped up that I could try out.&lt;br /&gt;&lt;br /&gt;As luck (or Google) would have it, I came across some positive feedback regarding something called &lt;a href="http://www.docu-track.com/home/prod_user/PDF-XChange_Tools/pdfx_viewer"&gt;PDF-XChange Viewer&lt;/a&gt;. Normally a name that lame is enough to turn me away, but the good feedback I read convinced me to at least check it out. So I went to the download section and saw that they had both a regular version and a 'portable' version. Curiously, the portable version was for normal Windows systems, not mobile systems as I had initially expected, so I was interested to see what the feature differences existed between the two. Luckily, there is a link to a feature comparison, as seen here:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__Pu93fvm4rQ/ShMAdzkyjHI/AAAAAAAAAD4/ZP6-DE9VaYU/s1600-h/featurecomp.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 275px;" src="http://3.bp.blogspot.com/__Pu93fvm4rQ/ShMAdzkyjHI/AAAAAAAAAD4/ZP6-DE9VaYU/s400/featurecomp.PNG" alt="" id="BLOGGER_PHOTO_ID_5337610495424892018" border="0" /&gt;&lt;/a&gt;This is where the awesome kicks in. Clicking that link yields the following gem:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__Pu93fvm4rQ/ShMCODPKZQI/AAAAAAAAAEA/PZhjKaFmMxA/s1600-h/openfeaturecomp.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 309px;" src="http://4.bp.blogspot.com/__Pu93fvm4rQ/ShMCODPKZQI/AAAAAAAAAEA/PZhjKaFmMxA/s400/openfeaturecomp.png" alt="" id="BLOGGER_PHOTO_ID_5337612423774496002" border="0" /&gt;&lt;/a&gt;&lt;img src="file:///C:/Users/Dave/AppData/Local/Temp/moz-screenshot.jpg" alt="" /&gt;Yes, that's right: in order to adequately judge which PDF Viewer to download the user must first have a PDF Viewer installed. Genius! Too bad there isn't a handy document format that this information could have been stored in which would have allowed people to view the information without requir--- WHY THE DEUCE IS THIS CHART NOT HTML?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-5723731788765336667?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/5723731788765336667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=5723731788765336667' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5723731788765336667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5723731788765336667'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2009/05/too-much-fun.html' title='Too. Much. Fun'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__Pu93fvm4rQ/ShMAdzkyjHI/AAAAAAAAAD4/ZP6-DE9VaYU/s72-c/featurecomp.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-5221415965377992167</id><published>2008-12-07T23:19:00.006-06:00</published><updated>2008-12-08T00:02:38.277-06:00</updated><title type='text'>Hot Dog</title><content type='html'>While my wife and I were on vacation, my parents were kind enough to take care of our Old English Sheepdog, Molly. They live out in the woods near Kenora, so this is a real treat for Molly because she can run free out there; plus, my parents are retired and home during the day, so she isn't alone as much.&lt;br /&gt;&lt;br /&gt;Now, life with Molly is always a bit of an &lt;a href="http://codebaboon.blogspot.com/2007/12/christmas-reflections.html"&gt;adventure&lt;/a&gt;, so when we got back from Hawaii we called to ask how things were going, and sure enough my parents had a lot of stories to tell. Most of them were pretty typical Molly stories (running directly at oncoming vehicles, licking one of my dad's leather slippers so thoroughly one night that it is now hard as a rock since it dried out, and general tales of her legendary clumsiness), but one story truly stood out.&lt;br /&gt;&lt;br /&gt;As the story goes, one night shortly after we left, my parents were relaxing in the house watching TV. As with most dogs, Molly likes to be wherever the people are, so she was lying in the room with them, off near a wall. As they all sit there, my dad begins to pick up the scent of something unpleasant. Now, Molly is well known for her profound ability to light up a room, so to speak, so assuming Molly has just let loose, my dad continues to watch TV in hopes the smell will soon dissipate.&lt;br /&gt;&lt;br /&gt;As the minutes pass, however, the smell not only remains, but it strengthens. And it doesn't smell quite like gas... it smells like burning. So my dad starts to look around for a fire. He wanders out to the kitchen, around the house, looking for the source of the smell. Nothing seems out of the ordinary, but the smell is still there. As he is doing this, Molly goes to the back door and waits to go outside, so my mom lets her out.&lt;br /&gt;&lt;br /&gt;Over the next few minutes they continue to look around for the source of the smell, but nothing seems amiss. So they resume watching TV, and sure enough the smell starts to lessen.&lt;br /&gt;&lt;br /&gt;Later, Molly barks to come inside. As my dad lets her in the door, he discovers the source of the smell: all down one side, Molly's fur is a nice burnt orange. It seems she was sleeping next to an electric baseboard heater, and her fur must have pushed up against the heater coils and caught fire. Luckily she didn't go up in flames, but rather the fur must have smoldered for awhile, causing the smell. It seems that she never even noticed, and most likely just went outside to either avoid the smell, or because she was feeling a bit on the warmish side... likely from being on fire!&lt;br /&gt;&lt;br /&gt;Looking at her now, about 2 weeks after the incident, the burnt fur isn't very noticeable, although it does cover quite a large patch of her right side. My dad says that for the first few days it was very obvious, and that everyone who saw her immediately asked what she'd gotten into, or why her fur was discolored. So he would have to tell them the story of Molly catching on fire, and most listeners would respond by telling him that he'd better trim the fur off and pretend that nothing happened if he ever expects to be able to watch his soon-to-exist Grandchild.&lt;br /&gt;&lt;br /&gt;All I can say is, he's going to have to try harder than that if he wants to get out of babysitting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-5221415965377992167?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/5221415965377992167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=5221415965377992167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5221415965377992167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5221415965377992167'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/12/hot-dog.html' title='Hot Dog'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-3752062881108433660</id><published>2008-12-05T00:42:00.008-06:00</published><updated>2008-12-05T01:17:31.752-06:00</updated><title type='text'>Lots to talk about, so little time</title><content type='html'>I can't believe all the stuff that's been going on that I haven't blogged about! Obama is on his way to the White House; our own politicians back home are acting like children at best, idiots at worst (and I mean all of them, Harper, Dion, Layton, the whole lot); I spent 10 days in Hawai'i; I did a presentation on WPF Data Binding at the Microsoft Tech Days conference here in Winnipeg; and many more little things that I've been itching to spew opinions on. Oh, and my wife is 7 months pregnant.&lt;br /&gt;&lt;br /&gt;Unfortunately, life has been a bit of a maelstrom and I just haven't taken the time to nurture this web site. Hopefully this post will be the beginning of the renaissance here at Chez Code Baboon.&lt;br /&gt;&lt;br /&gt;So, with all the amazing things happening right now, what am I going to talk about first? A petty annoyance with a technology, of course!&lt;br /&gt;&lt;br /&gt;At Tech Days everyone received a free copy of DVDs containing videos of every presentation from Tech-Ed 2008. I was pumped, so this evening I plopped a DVD into my computer and got ready to see what all was on there. There is an absolute boat-load of content, so MS has provided a Silverlight app to allow you to search and discover the content and figure out what disc it will be on.&lt;br /&gt;&lt;br /&gt;Sounds great, right?&lt;br /&gt;&lt;br /&gt;Well, it would be if the app on the DVDs wasn't written in Silverlight 2 Beta 2. You see, I like to stay current, and Silverlight 2.0 RTW has been released so that's what I have installed. You'd think the final release would be able to handle running an app written in Beta 2 of itself, right?&lt;br /&gt;&lt;br /&gt;Nope.&lt;br /&gt;&lt;br /&gt;That's right, the DVD tells me I need to install Silverlight (specifically Silverlight 2 Beta 2). It provides me with a link to the Silverlight download site, but that site kindly informs me that the page I was redirected from is running an old version of Silverlight and needs to be updated to the latest version. Seriously, check it out (you may need to click the image to see it in full size to read the hilarious text in green):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__Pu93fvm4rQ/STjSJwa1g-I/AAAAAAAAADw/Mlh9GbXgOKE/s1600-h/no_silverlight_for_you%21.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 227px;" src="http://3.bp.blogspot.com/__Pu93fvm4rQ/STjSJwa1g-I/AAAAAAAAADw/Mlh9GbXgOKE/s400/no_silverlight_for_you%21.jpg" alt="" id="BLOGGER_PHOTO_ID_5276198028522652642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Kinda hard to update something burned onto a DVD.&lt;br /&gt;&lt;br /&gt;I tried to uninstall Silverlight and follow the link again, but it just had me install the 2.0 release again (since it is the latest version, after all). In order to actually view the content on those discs, I ended up having to Google search for the Beta 2 bits where I eventually &lt;a href="http://www.filehippo.com/download_silverlight/"&gt;found them&lt;/a&gt; on some filehippo site. I downloaded and installed it anyways; I mean, if you can't trust filehippo, who can you trust? Of course, the upshot here is that I now can't view any Silverlight sites written for 2.0. Sweet!&lt;br /&gt;&lt;br /&gt;I've noticed problems like this before with Silverlight apps. It seems like there are about 25 different versions of the Silverlight framework out there, and none of them can view apps written in older or newer versions than themselves.&lt;br /&gt;&lt;br /&gt;MS needs to sort this crap out; this is not the path to becoming the Flash/Flex Killer they aim to be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-3752062881108433660?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/3752062881108433660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=3752062881108433660' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3752062881108433660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3752062881108433660'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/12/lots-to-talk-about-so-little-time.html' title='Lots to talk about, so little time'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__Pu93fvm4rQ/STjSJwa1g-I/AAAAAAAAADw/Mlh9GbXgOKE/s72-c/no_silverlight_for_you%21.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-3187367193867241434</id><published>2008-10-10T15:26:00.003-05:00</published><updated>2008-10-10T15:52:53.028-05:00</updated><title type='text'>New And Improved</title><content type='html'>When I began this blog, the idea was, ostensibly, to create a little corner of the interweb where I could espouse my views on the various and sundry details of software development, hopefully providing some useful information with a dusting of humour to keep things moving. Sure, a handful of &lt;a href="http://codebaboon.blogspot.com/2007/09/vids.html"&gt;posts&lt;/a&gt; &lt;a href="http://codebaboon.blogspot.com/2007/12/how-christmas-is-supposed-to-work.html"&gt;strayed&lt;/a&gt; from the &lt;a href="http://codebaboon.blogspot.com/2008/05/time-machines-and-white-socked-ninjas.html"&gt;premise&lt;/a&gt;, but for the most part I tried to stick to my guns and not litter the site with pages of unrelated fluff. In my head I always wanted to maintain a ratio of at least 1:1 between crunch and fluff, as it were.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, what I've discovered is that there are long periods of time when, for various reasons, I have nothing relevant to add in regards to crunch. So what happens is that I end up posting nothing at all, because I don't want the blog to become &lt;a href="http://icanhascheezburger.files.wordpress.com/2007/04/is-not-fat-is-just-fluffy.jpg"&gt;overly fluffy&lt;/a&gt;. But you know what's worse than a fluffy blog? A &lt;a href="http://icanhascheezburger.files.wordpress.com/2008/02/funny-pictures-orange-meh-cat.jpg"&gt;dead one&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So from here on out, the shackles are coming off. I'm going to post about whatever I feel like; be it sports, politics, arts, or anything else. Hopefully we'll get the odd software post mixed in, if for no other reason than to keep the name at least borderline relevant. But there are no promises.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So let us all raise our cups to the new and improved Code Baboon Blog!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;... By the way, I'm virtually clinking glasses with all of my imaginary readers right now, and it's totally awesome.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-3187367193867241434?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/3187367193867241434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=3187367193867241434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3187367193867241434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3187367193867241434'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/10/new-and-improved.html' title='New And Improved'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-667998166808535223</id><published>2008-09-18T09:15:00.003-05:00</published><updated>2008-09-18T09:24:29.774-05:00</updated><title type='text'>The Phoenix Rises</title><content type='html'>Remember &lt;a href="http://codebaboon.blogspot.com/2008/06/on-being-out-babooned.html"&gt;this post&lt;/a&gt;? That was one crazy night. Perhaps some day I will explain it. For now, just know that the baboon in question is fine. Also know that some things, once seen, cannot be unseen.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm back.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-667998166808535223?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/667998166808535223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=667998166808535223' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/667998166808535223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/667998166808535223'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/09/phoenix-rises.html' title='The Phoenix Rises'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-7769783232261584944</id><published>2008-06-04T08:49:00.004-05:00</published><updated>2008-06-04T09:11:56.155-05:00</updated><title type='text'>On Being Out-Babooned</title><content type='html'>I'm being out-babooned. A few months ago I decided it might be a good idea to snag the codebaboon.com domain, only to realise that someone else (Mark Theunissen apparently) had registered it literally days earlier. A little frustrated by my lack of initiative, I figured it was no big deal, that this new baboon would probably just do nothing with it or put up some craptastic site that I could mock now and again.&lt;br /&gt;&lt;br /&gt;Boy was I wrong. Not to pimp some stranger's site, but &lt;a href="http://codebaboon.com/"&gt;check it out&lt;/a&gt;. Pretty nice looking, eh? He's got a cool little baboon logo that kind of looks like him, and a very nice, clean style. He shows up first in the &lt;a href="http://www.google.ca/search?hl=en&amp;amp;q=code+baboon&amp;amp;btnG=Google+Search&amp;amp;meta="&gt;Google search for code baboon&lt;/a&gt;, and has far more comments on his posts (which means he has a few readers). And to top it all off the bastard even has a &lt;a href="http://codebaboon.com/about"&gt;photo of himself and a baboon&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Looks like I need to step it up. My frequency of posts has been increasing lately, so that's a start. I'm not sure what more I can do to make Blogger look sexy, so maybe I need to look into registering www.therealcodebaboon.com or something. Most importantly, I'll be heading to the Zoo this weekend to steal a baboon for a night on the town. I'm going to get photos of us having a drink on a patio, playing flag football in a park, riding a tandem bike, and high-fiving after scoring the winning touchdown in a game of flag football. Eat that, Mark.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-7769783232261584944?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/7769783232261584944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=7769783232261584944' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7769783232261584944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7769783232261584944'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/06/on-being-out-babooned.html' title='On Being Out-Babooned'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-7463087298935425211</id><published>2008-06-02T14:56:00.010-05:00</published><updated>2008-06-02T16:05:01.137-05:00</updated><title type='text'>Oops, I Did It Again...</title><content type='html'>By 'it', I mean Assert. But lets step back.&lt;br /&gt;&lt;br /&gt;Following a dry run for Ryan Weppler's upcoming webcast &lt;a href="https://www119.livemeeting.com/lrs/8000153370/Registration.aspx?pageName=j8l7d1rddtq7sjm3&amp;amp;FromPublicUrl=1"&gt;Testing Out the MVC Routing&lt;/a&gt;, a few guys got into a discussion about multiple Assert statements in a unit test. &lt;a href="http://homepage.mac.com/stevevrporter/blog/Ta.html"&gt;Steve&lt;/a&gt; 'asserted' (oh yeah, I just went there) that you should only ever have 1 Assert per unit test (&lt;span style="font-style: italic;font-size:78%;" &gt;edit: from Steve per the comments: "the one Assert per test thing is just best practice, not a written-in-stone sort of thing. As long as you have a good reason for doing it, then fill your boots. Just ask yourself why you're doing it."&lt;/span&gt;). I was attending remotely and didn't have a mic, so I could not respond, which turned out to be a good thing. You see, I wanted to say something like "I have a bunch of tests from my demo code that used multiple Asserts, and they all were necessary/made sense". Because I couldn't speak, I decided to send an email to that effect.&lt;br /&gt;&lt;br /&gt;But the good thing about email is that it generally encourages you to back up your random statements with crazy things like facts and examples, so I popped open the Dice Hockey code and looked at my tests. Sure enough a bunch have more than one Assert. Yet as I gazed upon those 'perfect' tests with the intent to throw them in Steve's metrosexually attractive visage, I realised that I couldn't do it. In each case, Steve was right. Damn him and the Mac he rode in on!&lt;br /&gt;&lt;br /&gt;Anyways, et's take a look for ourselves at a function from one of my tests:&lt;br /&gt;&lt;br /&gt;&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;private&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;void&lt;/span&gt;&lt;span style="font-size:85%;"&gt; EnsureAllDesiredPlayersWereRetrieved(&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;                &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;IEnumerable&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;Guid&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&gt; playerIds)&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;Assert&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.AreEqual(playerIdsToRetrieve.Length, &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;        playerIds.Count(), &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);font-size:85%;" &gt;"Not all players retrieved!"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;);&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;IEnumerable&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;Guid&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&gt; playersNotRetrieved = &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;        (&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;from&lt;/span&gt;&lt;span style="font-size:85%;"&gt; ptr &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;in&lt;/span&gt;&lt;span style="font-size:85%;"&gt; playerIdsToRetrieve&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;         &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;select&lt;/span&gt;&lt;span style="font-size:85%;"&gt; ptr).Except(playerIds);&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;Assert&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.IsTrue(playersNotRetrieved.Count() == 0, &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;       &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);font-size:85%;" &gt;"Not all players retrieved!"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;);&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/pre&gt; &lt;/div&gt;&lt;br /&gt;&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;div face="Courier New" size="10pt" color="black" style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;div face="Courier New" size="10pt" color="black" style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  &lt;/div&gt;  &lt;/div&gt;  &lt;/div&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red128\green128\blue128;\red0\green128\blue0;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}??\fs20         \cf3 ///\cf4  \cf3 &lt;summary&gt;\par ??\cf0         \cf3 ///\cf4  Ensures that all of the players that were supposed to be\par ??\cf0         \cf3 ///\cf4  retrieved were indeed retrieved\par ??\cf0         \cf3 ///\cf4  \cf3 &lt;/summary&gt;\par ??\cf0         \cf3 ///\cf4  \cf3 &lt;param name="playerIds"&gt;\cf4 The list of playerIds that were retrieved\cf3 &lt;/param&gt;\par ??\cf0         \cf5 private\cf0  \cf5 void\cf0  EnsureAllDesiredPlayersWereRetrieved(\cf6 IEnumerable\cf0 &lt;\cf6 Guid\cf0&gt; playerIds)\par ??        \{\par ??            \cf6 Assert\cf0 .AreEqual(playerIdsToRetrieve.Length, playerIds.Count(), \cf7 "Not all players retrieved!"\cf0 );\par ??\par ??            \cf6 IEnumerable\cf0 &lt;\cf6 Guid\cf0&gt; playersNotRetrieved = (\cf5 from\cf0  ptr \cf5 in\cf0  playerIdsToRetrieve\par ??                                                     \cf5 select\cf0  ptr).Except(playerIds);\par ??            \cf6 Assert\cf0 .IsTrue(playersNotRetrieved.Count() == 0, \cf7 "Not all players retrieved!"\cf0 );\par ??        \}} --&gt;In this first example, the first Assert is meaningless. It only has value because I know that during my data initialization at the start of the test I put more players into the database than I did in my list of ID's to retrieve. But really, the second Assert is the one that makes sure everyone got retrieved that should have been. If I want to test that no other players were retrieved (which is basically what that first Assert is doing), I should have another test.&lt;br /&gt;&lt;br /&gt;And hey, speaking of that, I do have another test for that! Well, sort of. I have another function, as seen here:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red128\green128\blue128;\red0\green128\blue0;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}??\fs20         \cf3 ///\cf4  \cf3 &lt;summary&gt;\par ??\cf0         \cf3 ///\cf4  Ensures that none of the retrieved players were \par ??\cf0         \cf3 ///\cf4  in the list of players not to be retrieved\par ??\cf0         \cf3 ///\cf4  \cf3 &lt;/summary&gt;\par ??\cf0         \cf3 ///\cf4  \cf3 &lt;param name="playerIds"&gt;\cf4 The list of playerIds that were retrieved\cf3 &lt;/param&gt;\par ??\cf0         \cf5 private\cf0  \cf5 void\cf0  EnsureNoPlayersWereRetrievedThatShouldNotHaveBeen(\cf6 IEnumerable\cf0 &lt;\cf6 Guid\cf0&gt; playerIds)\par ??        \{\par ??            \cf6 IEnumerable\cf0 &lt;\cf6 Guid\cf0&gt; playersThatShouldntHaveBeenRetrieved = (\cf5 from\cf0  p \cf5 in\cf0  playerIds\par ??                                                                      \cf5 join\cf0  ptnr \cf5 in\cf0  playerIdsToNotRetrieve \cf5 on\cf0  p \cf5 equals\cf0  ptnr\par ??                                                                      \cf5 select\cf0  p);\par ??            \cf6 Assert\cf0 .IsTrue(playersThatShouldntHaveBeenRetrieved.Count() == 0, \cf7 "Players were retrieved that should not have been!"\cf0 );\par ??\par ??        \}} --&gt; &lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;private&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;void&lt;/span&gt;&lt;span style="font-size:85%;"&gt; EnsureNoPlayersWereRetrievedThatShouldNotHaveBeen(&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;            &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;IEnumerable&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;Guid&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&gt; playerIds)&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;IEnumerable&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;Guid&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&gt; playersThatShouldntHaveBeenRetrieved = &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;       (&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;from&lt;/span&gt;&lt;span style="font-size:85%;"&gt; p &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;in&lt;/span&gt;&lt;span style="font-size:85%;"&gt; playerIds&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;join&lt;/span&gt;&lt;span style="font-size:85%;"&gt; ptnr &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;in&lt;/span&gt;&lt;span style="font-size:85%;"&gt; playerIdsToNotRetrieve &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;on&lt;/span&gt;&lt;span style="font-size:85%;"&gt; p &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;equals&lt;/span&gt;&lt;span style="font-size:85%;"&gt; ptnr&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;        &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;select&lt;/span&gt;&lt;span style="font-size:85%;"&gt; p);&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;    Assert&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.IsTrue(&lt;br /&gt;       playersThatShouldntHaveBeenRetrieved.Count() == 0, &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;          &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);font-size:85%;" &gt;"Players were retrieved that should not have been!"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;);&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/pre&gt; &lt;/div&gt;  &lt;/div&gt;&lt;br /&gt;That looks nice, right? But check out where these functions get used:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red128\green128\blue128;\red0\green128\blue0;\red43\green145\blue175;\red0\green0\blue255;}??\fs20         \cf3 ///\cf4  \cf3 &lt;summary&gt;\par ??\cf0         \cf3 ///\cf4  Tests to ensure that the Gateway can retrieve players based on their PlayerIds\par ??\cf0         \cf3 ///\cf4  \cf3 &lt;/summary&gt;\par ??\cf0         [\cf5 TestMethod\cf0 ]\par ??        \cf6 public\cf0  \cf6 void\cf0  Should_retrieve_only_specified_players_from_Players_table()\par ??        \{\par ??            \cf6 var\cf0  retrievedPlayers = testGateway.GetPlayers(playerIdsToRetrieve);\par ??\par ??            \cf4 // Check that all desired players were retrieved\par ??\cf0             EnsureAllDesiredPlayersWereRetrieved((\cf6 from\cf0  rp \cf6 in\cf0  retrievedPlayers\par ??                                                  \cf6 select\cf0  rp.PlayerId));\par ??\par ??            \cf4 // Check that no players were retrieved that should not have been\par ??\cf0             EnsureNoPlayersWereRetrievedThatShouldNotHaveBeen((\cf6 from\cf0  rp \cf6 in\cf0  retrievedPlayers\par ??                                                               \cf6 select\cf0  rp.PlayerId));\par ??        \}} --&gt; &lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;div style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-family: Courier New; font-size: 10pt; color: black;"&gt; &lt;div face="Courier New" size="10pt" color="black" style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;[&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;TestMethod&lt;/span&gt;&lt;span style="font-size:85%;"&gt;]&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;public&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;void&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Should_retrieve_only_specified_players_from_Players_table()&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;{&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;var&lt;/span&gt;&lt;span style="font-size:85%;"&gt; retrievedPlayers = &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;        testGateway.GetPlayers(playerIdsToRetrieve);&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;span style=";font-size:85%;color:green;"  &gt;// Check that all desired players were retrieved&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    EnsureAllDesiredPlayersWereRetrieved(&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;        (&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;from&lt;/span&gt;&lt;span style="font-size:85%;"&gt; rp &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;in&lt;/span&gt;&lt;span style="font-size:85%;"&gt; retrievedPlayers&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;         &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;select&lt;/span&gt;&lt;span style="font-size:85%;"&gt; rp.PlayerId));&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;span style=";font-size:85%;color:green;"  &gt;// Check that no players were retrieved that &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    &lt;/span&gt;&lt;span style=";font-size:85%;color:green;"  &gt;// should not have been&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;    EnsureNoPlayersWereRetrievedThatShouldNotHaveBeen(&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;        (&lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;from&lt;/span&gt;&lt;span style="font-size:85%;"&gt; rp &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;in&lt;/span&gt;&lt;span style="font-size:85%;"&gt; retrievedPlayers&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;         &lt;/span&gt;&lt;span style=";font-size:85%;color:blue;"  &gt;select&lt;/span&gt;&lt;span style="font-size:85%;"&gt; rp.PlayerId));&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/pre&gt; &lt;/div&gt;  &lt;/div&gt;  &lt;/div&gt;&lt;br /&gt;That's a pretty clear-cut case of bad test writing; those should be two seperate tests, one for each function. Combine that with the clean-up of the two Asserts in that first function and we'd have a much nicer solution.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE: Code is all visable now, sorry for the formatting issues.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-7463087298935425211?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/7463087298935425211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=7463087298935425211' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7463087298935425211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7463087298935425211'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/06/oops-i-did-it-again.html' title='Oops, I Did It Again...'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-1996922494593297446</id><published>2008-05-29T13:34:00.003-05:00</published><updated>2008-05-29T14:08:42.960-05:00</updated><title type='text'>Time Machine's and White-Socked Ninja's</title><content type='html'>With 2 of my friends finally moving to Gmail accounts this week, I decided to click the "oldest" button in my "All Mail" section to see how long I'd been a member. Turns out my 4 year Gmail Anniversary will arrive on June 16th. In that time I've never deleted anything, leaving a little over 6000 e-mails essentially tracking the last 4 years of my life. Looking back at those early email threads is like having my own little time machine back into 2004, which feels like a lifetime ago now. A lot has changed for me since then. I've married, purchased a home, purchased a dog, changed jobs, and exited my 20's.&lt;br /&gt;&lt;br /&gt;But my favorite part was seeing the first email I ever sent from the account. It is an email to my long-time friend Jeremy Maxom with an attachment describing the sacred teachings of the White-Socked Ninja Clan, a clan whose actions the two of us have been tracking since high school. This document was listed as highly-classified, but the time has come for the public to be aware. So, with little fanfare but much significance, I present...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Sacred Teachings of the White-Socked Ninja&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Within this document are details of a clan, a clan which has existed, surprisingly, for ages, or at least 10 years. Few have knowledge of the White-Socked Ninja, but those who do are wise to respect and honor the fierce irony that members of the clan must face. For a White-Socked Ninja is as his name implies: a ninja, skillfully trained, deadly and swift, cunning and agile, heard of often, yet never seen… from the ankles up.&lt;br /&gt;&lt;br /&gt;You see, a White-Socked Ninja, much like your run-of-the-mill, everyday ninja, is above all else a man of stealth. Clothed all in black, a ninja can stalk the night like no other. But a White-Socked Ninja must adhere to the number 1 rule of the clan: White tube-socks must be worn, and visible, at all times. Although quite comfortable and stylish, this requirement has been the undoing of more than 1 White-Socked Ninja. In fact, it has foiled 100% of all missions the clan has attempted.&lt;br /&gt;&lt;br /&gt;The exact date of inception for the clan is unknown, and some members have been known to claim it has been around for centuries. However, historians and clan co-founders have narrowed the likely date to sometime in 1993. The clan was borne out of a growing distaste for the normal ninja clans of its time. Tired of the outrageousness of the Teenage Mutant Ninja Turtles, yet bored of the non-distinct look of most other ninja clans (often derided by WSN members as being “effective but boring”), clan founders decided that a subtle yet cool ninja clan was “where it’s at”.&lt;br /&gt;&lt;br /&gt;A uniform was quickly decided upon. Not wanting to stray too far from tradition, black was chosen as the predominant color. It was also noted by one co-founder that “black is slimming”. To maximize effectiveness in the field, while maintaining cool-non-vanilla Flava, the trim color could not be above the waist. When one co-founder noted that white tube socks could be easily acquired for low prices at many convenient locations in the metro area, the decision was unanimous and the White-Socked Ninjas were born.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Mantra&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;“Stealth Is Important, But So Are Style And Affordability.”&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Rules &amp;amp; Regulations&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;   White Tube-socks must be worn, and visible, at all times. These replace the standard two-toed ninja booties most trainees are familiar with.&lt;/li&gt;&lt;li&gt;   All other Standard Ninja Rules, as dictated by the International Consortium of Ninjadom, apply unless in direct conflict with rule 1.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Methods of Sneakiness&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;   Missions should be attempted during night-time hours if at all possible.&lt;/li&gt;&lt;li&gt;   Approach targets from any angle that is not the front.&lt;/li&gt;&lt;li&gt;   No chewing gum.&lt;/li&gt;&lt;li&gt;   Know your surroundings. Grass and carpet are good. Hardwood floors and bubble-wrap are bad.&lt;/li&gt;&lt;li&gt;   When in doubt, do what a cat would do, unless the cat would purr.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Mission That Almost Succeeded&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The lights were low that fateful night,&lt;br /&gt;When white-socked ninjas approached the site.&lt;br /&gt;The clouds hung low and children shivered,&lt;br /&gt;For soon the strike would be delivered.&lt;br /&gt;&lt;br /&gt;The quarry lay so still and quiet,&lt;br /&gt;This was the perfect night to try it!&lt;br /&gt;So up the fence the members shimmied&lt;br /&gt;And through the door that one guy jimmied.&lt;br /&gt;&lt;br /&gt;The group that night it counted four:&lt;br /&gt;The first guy stayed to guard the door.&lt;br /&gt;The second one was stationed outside,&lt;br /&gt;Because he’d borrowed his grannies’ ride.&lt;br /&gt;&lt;br /&gt;If things went poorly, as they often did,&lt;br /&gt;And if the members could not be hid,&lt;br /&gt;Then slam the car into drive he would&lt;br /&gt;And they’d peel out of this neighborhood.&lt;br /&gt;&lt;br /&gt;The two that continued had their orders;&lt;br /&gt;Divide the quarry into quarters.&lt;br /&gt;So up the stairs they softly stepped&lt;br /&gt;And down a corridor they quickly crept.&lt;br /&gt;&lt;br /&gt;And through a door, and there they were:&lt;br /&gt;Their target in sight, of that we’re sure.&lt;br /&gt;But what came next is somewhat muddy,&lt;br /&gt;Like a story from your drunk friend Buddy.&lt;br /&gt;&lt;br /&gt;In most accounts, someone screamed,&lt;br /&gt;The jig was up, or so it seemed.&lt;br /&gt;“Honey, honey, there’s someone here!”&lt;br /&gt;“Where?!? Oh where? Pray tell me dear!”&lt;br /&gt;&lt;br /&gt;”I’m not quite certain, it’s oh so dark,&lt;br /&gt;But I saw a flash, a white-ish spark.&lt;br /&gt;It was low to the ground, say ankle high&lt;br /&gt;Please dear believe me, I wouldn’t lie!”&lt;br /&gt;&lt;br /&gt;Later that night in a secret place,&lt;br /&gt;Where a secret leader secretly paced,&lt;br /&gt;The group of four softly entered&lt;br /&gt;And faced their leader front and center.&lt;br /&gt;&lt;br /&gt;“We failed again sir” said one member&lt;br /&gt;“Our fourth failure since December”&lt;br /&gt;The leader shook his head and sighed&lt;br /&gt;“What happened this time, that no one died?”&lt;br /&gt;&lt;br /&gt;“Same as always, like hands on clocks,&lt;br /&gt;Despite our skill they saw our socks”&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-1996922494593297446?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/1996922494593297446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=1996922494593297446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1996922494593297446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1996922494593297446'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/time-machines-and-white-socked-ninjas.html' title='Time Machine&apos;s and White-Socked Ninja&apos;s'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-1660654375403319731</id><published>2008-05-28T12:36:00.007-05:00</published><updated>2008-06-02T16:02:55.758-05:00</updated><title type='text'>Gateway Webcast: The Files</title><content type='html'>Things went ok on the webcast today, although I did forget a couple of things that I wanted to show in the demo. I will make a post later tonight highlighting the content that I missed in the webcast for anyone who is interested to read through.&lt;br /&gt;&lt;br /&gt;During the webcast I mentioned that I would be putting up links to the various resources used in the webcast, so here they are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://cid-5db91a93e4d81439.skydrive.live.com/self.aspx/Public/WCF%20Service%20Gateways%20with%20CSharp%203.0%20and%20Linq-to-Sql.pptx"&gt;The Powerpoint Slides&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cid-5db91a93e4d81439.skydrive.live.com/self.aspx/Public/DiceHockey.zip"&gt;The DiceHockey Solution Files&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cid-5db91a93e4d81439.skydrive.live.com/self.aspx/Public/gateway-webcast.zip"&gt;The Webcast Video&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Disclaimer&lt;/span&gt;: The code provided is not supported or guaranteed in any way: use at your own risk. In fact, it is not entirely complete (being that the intent is to build it out into a full project) and so you will see at least one failing test because the method it tests is not even implemented.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Related Posts&lt;/span&gt;: &lt;a href="http://codebaboon.blogspot.com/2008/06/oops-i-did-it-again.html"&gt;Oops, I did it again...&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-1660654375403319731?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/1660654375403319731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=1660654375403319731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1660654375403319731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1660654375403319731'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/gateway-webcast-files.html' title='Gateway Webcast: The Files'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-3922323438298482775</id><published>2008-05-26T12:39:00.004-05:00</published><updated>2008-05-26T12:54:07.631-05:00</updated><title type='text'>Webcast Dry Run</title><content type='html'>Well today was the dry run for &lt;a href="https://www119.livemeeting.com/lrs/8000153370/Registration.aspx?pageName=0ggc1605gzxfjkkf&amp;amp;FromPublicUrl=1"&gt;my upcoming webcast&lt;/a&gt;. As I've mentioned before, this is a first for me, so it was interesting. Things went ok, but we had some audio issues which I need to resolve by Wednesday. I suspect Vista is the problem, which is nice and ironic.&lt;br /&gt;&lt;br /&gt;The other things I learned by way of feedback as well as just things I noticed myself while speaking or listening to the recording afterwards:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I should explain that we won't be deep-diving into any specific areas.&lt;/li&gt;&lt;li&gt;I forgot to have SQL Server Management Studio open.&lt;/li&gt;&lt;li&gt;I didn't have server explorer connection set up (not sure why, I set it up yesterday. Guess VS forgot it, so I'll need to set it up right before the presentation on wednesday).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I skipped around and didn't follow my notes properly! I need to make my notes easier to follow (NOT handwritten!).&lt;/li&gt;&lt;li&gt;I forgot to explain the Lambda expressions properly.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I need to expand the references section a bit.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I should use tinyurl for long URL's.&lt;/li&gt;&lt;li&gt;I set up bookmarks in Visual Studio, and then proceeded to not use them at all.&lt;/li&gt;&lt;li&gt;I intended to use Full Screen view in Visual Studio but forgot. This resulted in lots of sideways scrolling because I had the Solution Explorer pinned. I didn't clue in on this AT ALL during the entire presentation.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The timing was pretty good, 29 minutes start to finish. I would have preferred about 25 minutes because this doesn't give me much wiggle room to stray from my notes, but I suppose this will keep things focused and moving.&lt;br /&gt;&lt;br /&gt;Listening to the recording was interesting. I have always hated listening to my own voice, but I didn't sound quite as stupid as I thought I had, so that was positive. Of course, with the audio cutting out constantly perhaps the dumb portions were mercifully absent.&lt;br /&gt;&lt;br /&gt;Finally, the one thing I really noticed was how I sort of 'went blank' as I spoke. I was in some kind of zombie trance, and the couple times that I tripped up because I wasn't following my notes properly left me totally dumbfounded for a few seconds. I think the audio issues hid this pretty well actually, but there were a couple times when I stared at my notes for like 5-10 seconds thinking "What the heck? Where was I? What am I doing next? OH NOES!". Hopefully this does not happen on Wednesday!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-3922323438298482775?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/3922323438298482775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=3922323438298482775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3922323438298482775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3922323438298482775'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/webcast-dry-run.html' title='Webcast Dry Run'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-3297104726542140930</id><published>2008-05-19T12:20:00.002-05:00</published><updated>2008-05-19T12:27:11.694-05:00</updated><title type='text'>Well That Ended Quickly</title><content type='html'>The great Linux experiment of '08 is officially over. I will really miss the virtual workspaces and other nice features, but until there is a reliable Exchange mail client it just won't do the trick for me. Evolution is beyond buggy, and I can't have my email and calendering crashing constantly. Thunderbird/Lightning didn't seem any better. I couldn't get Outlook to work under Wine.&lt;br /&gt;&lt;br /&gt;So I'm back to Windows, and I'm giving Vista a third spin. I'm going to try my darndest to keep the OS 'clean' and hopefully have something that performs reasonably well. Of course, on a fresh install with just Firefox running I'm currently using 675MB of RAM... ugh.&lt;br /&gt;&lt;br /&gt;I'm still glad I tried, and I think I might try installing Kubuntu under Wubi and seeing how Kontact works, but I don't hold out much hope. Maybe someday I'll be able to switch back, but for now I'm stuck.&lt;br /&gt;&lt;br /&gt;Boo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-3297104726542140930?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/3297104726542140930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=3297104726542140930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3297104726542140930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3297104726542140930'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/well-that-ended-quickly.html' title='Well That Ended Quickly'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-101088284199871562</id><published>2008-05-14T23:07:00.005-05:00</published><updated>2008-05-14T23:43:38.262-05:00</updated><title type='text'>Made The Switch</title><content type='html'>As of last night I'm officially an Ubuntu user. Things have gone pretty well so far, although Evolution seems to have some kind of leak because towards the end of the day I noticed my system slowing down, and a quick check in the System Monitor showed Evolution using 780MB of RAM and 25% CPU! I watched the RAM usage slowly grow for a few megs, during which time Evolution did not appear to be doing anything. I re-started it and the memory usage dropped back to the normal 20MB or so and my system became snappy again. Definitely another impetus to find an alternative.&lt;br /&gt;&lt;br /&gt;Now lets talk about some things I like. Performance is the first thing. Everything just seems faster. Perhaps it isn't fair because I don't have nearly the list of services running and I need to use XP VM's to do a lot of tasks, but for anything I do within Ubuntu itself I really feel like the speed is much faster. Apps load faster, things respond to my actions quicker, and the file system manager (Nautilus I think) seems quicker than Explorer.&lt;br /&gt;&lt;br /&gt;The other big plus so far is the window management. I absolutely love the virtual workspaces, and using the keyboard shortcuts to switch between them is starting to feel natural. Moving between them is quick and seamless, and it just gives the feel that I 'have all of my stuff spread out on my desk'. That's the best analogy I can think of.&lt;br /&gt;&lt;br /&gt;Finally, tonight I've been playing with the neat desktop effects. I tried the famous Cube but I couldn't get all the effects to work (not sure why) and I find the default Wall behaviour to be more natural and efficient anyways. The zoom feature is great, I should get some use out of that, and the Expose feature might be useful as well (if all those Mac zealots can be believed). Last but not least are the eye candy effects, like wobbly-windows and whatnot, which I assumed would hurt performance but don't seem to really have any effect at all (aside from being neat).&lt;br /&gt;&lt;br /&gt;All in all the jury is still out on how functional this can be given my Microsoft-centric career, but I would not hesitate to use Ubuntu on a home PC. Not my Mom's home PC, mind you, because despite all the fervor around how user-friendly Ubuntu is, there is a LOOOONG way to go. I may be crazy, but I'm not THAT crazy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-101088284199871562?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/101088284199871562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=101088284199871562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/101088284199871562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/101088284199871562'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/made-switch.html' title='Made The Switch'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-2996320587422487340</id><published>2008-05-14T14:20:00.002-05:00</published><updated>2008-05-14T14:26:03.664-05:00</updated><title type='text'>Webcast Update</title><content type='html'>Couple of things. First off, &lt;a href="http://homepage.mac.com/stevevrporter/blog/Ta.html"&gt;Steve&lt;/a&gt; did a great job with the first Webcast today, check out that link for all of his materials. For anyone who missed the live presentation, the recording should be available soon, I'll post a link when it's up.&lt;br /&gt;&lt;br /&gt;Second off, the official launch of the webcast series has been put up on the Imaginet website, you can check it out &lt;a href="http://www.imaginets.com/news--events/spring-2008-webcast-series.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Last off, my own presentation is now only 2 weeks away, and that officially has me feeling nervous. Guess I better start prepping a bit eh?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-2996320587422487340?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/2996320587422487340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=2996320587422487340' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2996320587422487340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2996320587422487340'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/webcast-update.html' title='Webcast Update'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-182872168598115750</id><published>2008-05-12T21:46:00.004-05:00</published><updated>2008-05-12T21:50:41.232-05:00</updated><title type='text'>Imaginet Webcasts Revealed</title><content type='html'>A couple weeks ago I mentioned that &lt;a href="http://www.imaginets.com/"&gt;Imaginet&lt;/a&gt; would be presenting a weekly series of Webcasts (I called 'em Webinars back then), but I didn't know many of the details. Well, the &lt;a href="http://weblogs.asp.net/jsemeniuk/archive/2008/05/12/free-webcast-on-process-template-customization-and-more.aspx"&gt;details have been released&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Make sure to &lt;a href="https://www119.livemeeting.com/lrs/8000153370/Registration.aspx?pageName=73fdz3q11vj4s4hl&amp;amp;FromPublicUrl=1"&gt;check out the first one&lt;/a&gt;, presented by &lt;a href="http://homepage.mac.com/stevevrporter/blog/Ta.html"&gt;Steve Porter&lt;/a&gt;, this Wednesday!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-182872168598115750?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/182872168598115750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=182872168598115750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/182872168598115750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/182872168598115750'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/imaginet-webcasts-revealed.html' title='Imaginet Webcasts Revealed'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-8045035499114064656</id><published>2008-05-12T16:15:00.003-05:00</published><updated>2008-05-12T16:44:43.358-05:00</updated><title type='text'>Making The Switch Part 2</title><content type='html'>I didn't have time to do the full move to Ubuntu last night, but I did decide that I would try to work exclusively out of the Wubi installation today. Things went ok, although I did have to jump to Windows in order to view a Live Meeting with audio. This was kind of annoying because MS advertises that you can view Live Meetings via a Web Browser applet, but they neglect to mention that this doesn't include audio. But hey, who needs audio, right?&lt;br /&gt;&lt;br /&gt;I guess I'll have to install Live Meeting into one of my VPC's, or make a Live Meeting Appliance or something. I expected to have to do this for actually presenting anyways, so not the end of the world, although it would be nice to be able to accept impromptu invites within the browser.&lt;br /&gt;&lt;br /&gt;I also came across a pretty serious bug that I need to look into more; twice today I completely lost the ability to use my shift or caps lock keys. Yep, no capital letters, underscores, question marks, or exclamation marks. How can I _WORK_ without those?!&lt;br /&gt;&lt;br /&gt;Anyways, I did a quick search and it appears to be related to VMWare, which kind of sucks considering how reliant I will be on virtual machines for much of my day to day activities. There is supposedly a command you can type into your terminal that will restore your proper keystokes, but whenever I brought up my terminal and started to type it would disappear (something not unique to me based on the comments I was reading relating to this bug). The only solution for me was to log out and log back in. Not good.&lt;br /&gt;&lt;br /&gt;Again, I don't want to let this stop me from moving over, but it is a SERIOUS bug that will cause me to give up and go back to windows if I can't find a fix or work around in a reasonable amount of time. Maybe &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; is the answer? I mean, if I'm going 'alternative', why stop at just the OS? Of course if I start dating men you'll know I've taken this too far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-8045035499114064656?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/8045035499114064656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=8045035499114064656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8045035499114064656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8045035499114064656'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/making-switch-part-2.html' title='Making The Switch Part 2'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-7681718938218168073</id><published>2008-05-11T22:05:00.002-05:00</published><updated>2008-05-11T22:29:50.110-05:00</updated><title type='text'>Making The Switch</title><content type='html'>I've been curious about Linux for years. I've dipped my toe in the water in the past (installed Ubuntu on my home PC (that I never really use) a year or so ago until I flipped it to a Media Center PC), but I've never gone &lt;a href="http://www.news.com.au/common/imagedata/0,,5500277,00.jpg"&gt;whole hog&lt;/a&gt;. I've never taken a primary machine and removed Windows. I've talked about it, I've pondered it, but I've never taken the leap.&lt;br /&gt;&lt;br /&gt;Well, I'm about to leap.&lt;br /&gt;&lt;br /&gt;The last week or two I've been evaluating the logistics of moving my work PC to Ubuntu. With the new &lt;a href="http://wubi-installer.org/"&gt;Wubi&lt;/a&gt; installation option, I've been able to flip back and forth without needing to deal with the whole partitioning/dual-boot mess that I hate. I've managed to prove out most of my usage scenarios, and despite some frustrations and a bit of the 'sheen' coming off, I think I'm going to dive in. I'm about 99% certain that I can wipe my drive and throw Ubuntu on and still do everything I need to do, with virtual machines being my main fall back scenario where things just don't work.&lt;br /&gt;&lt;br /&gt;I'm currently un-DRMing my purchased iTunes content, after which I should be ready to go. I don't know if I'll do it tonight, but likely sometime this week. I'll post my issues as I uncover them, but going in here are the things I'm a little disappointed about:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Evolution&lt;/span&gt;: It's the Outlook replacement, and I'm not super impressed. Seems pretty slow, I had some crashes while it downloaded my emails from exchange, and it's not real pretty. I might see if I can get connected via IMAP using Thunderbird, but I'll give Evolution more of a chance.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Networking&lt;/span&gt;: The NetworkManager app seems a little quirky, and I've had to mess with settings to get first connected wirelessly, and then again when I wanted to VPN to my office network. Even worse though, once VPN'd I can mount a windows share from work, but the file list I see is incomplete. I'm hoping I can figure this issue out, as I don't want to have to use a virtual machine to browse Windows network shares. This one almost sunk my move plans, but I've decided that there _must_ be a fix and that I'm not letting it stop me. If I can't resolve it after a few weeks, this might cause me to go back to XP. We'll see.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;iTunes&lt;/span&gt;: No Linux version, and it doesn't seem like it works using Wine (at least for connecting to the iTunes store and/or actually sync-ing to my iPod). This isn't 'mission critical', so I haven't exhausted my research, so I might find a workable solution. I might try creating a VMWare Virtual Appliance thing specifically for iTunes too, see what that's all about.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Installing Apps&lt;/span&gt;: The Package Manager thing is pretty wicked, but installing apps that aren't in repositories is pretty painful. Linux needs to get that issue resolved if they ever hope to convert anyone aside from nerds.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Everything else seems pretty positive. I'm looking forward to becoming familiar with the OS as I use it on a daily basis. The speed seems pretty nice, and it's also fun to just be outside of my familiar Windows world, get out of the comfort zone and force myself to grow.&lt;br /&gt;&lt;br /&gt;Wish me luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-7681718938218168073?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/7681718938218168073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=7681718938218168073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7681718938218168073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7681718938218168073'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/making-switch.html' title='Making The Switch'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-2077409980329724614</id><published>2008-05-07T11:50:00.006-05:00</published><updated>2008-05-07T13:30:26.544-05:00</updated><title type='text'>[Fact] vs [Test]</title><content type='html'>I got into a great discussion with &lt;a href="http://miscjibberish.blogspot.com/"&gt;Jeremy&lt;/a&gt; this morning on &lt;a href="http://www.codeplex.com/xunit/"&gt;xUnit&lt;/a&gt;'s use of the attribute &lt;a href="http://www.codeplex.com/xunit/Wiki/View.aspx?title=Comparisons&amp;amp;referringTitle=Home"&gt;[Fact]&lt;/a&gt; instead of a more common term like [Test]. I cringed the moment I saw [Fact]; it just felt wrong. And the more I read about the author's justifications for it, the more I cringe.&lt;br /&gt;&lt;br /&gt;In most unit test frameworks, the word Test is used to describe or annotate the methods you write to prove your behaviour. For example, MSTest uses the [TestMethod] attribute, while NUnit and MbUnit simply use [Test]. xUnit has decided to go against convention and use [Fact]. Their reasoning seems to stem from an earlier decision they had made, which was to use [Theory] to annotate what are essentially data-driven tests, or more appropriately tests that are run against a set of inputs (think 'for-each thing in this set, do this test').&lt;br /&gt;&lt;br /&gt;Here is what James Newkirk had to say in &lt;a href="http://jamesnewkirk.typepad.com/posts/2007/10/xunitnet-beta-1.html"&gt;explaining [Fact]&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;...someone in the audience said that if you were going to call "for-all" tests "Theory" then you should call a single test "Fact". Since then I have had a number of conversations with people and Fact seems to fit.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;That explanation didn't exactly blow me away, so &lt;a href="http://www.codeplex.com/xunit/Thread/View.aspx?ThreadId=16734"&gt;here is another one&lt;/a&gt;, this time from James' partner Brad Wilson:&lt;br /&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_PostRepeater_ctl00_BodyLabel"&gt;&lt;blockquote&gt;The primary motivation is that it changes the expectations that what you do with this framework is capital-T Testing (aka, quality assurance). In reality, Test Driven Development is not really about testing at all. It's an example-driven design methodology which uses code to express the intentions of the class that is under design. The fact that it increases quality is a secondary benefit, and should not be considered a replacement for the work done by capital-T Testers. In Brian Marick's &lt;a href="http://www.testing.com/cgi-bin/blog/2003/08/21" class="externalLink"&gt;four quadrants of exploration through example&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, TDD-style code really only represents one of those quadrants (the &lt;a href="http://www.testing.com/cgi-bin/blog/2003/08/27#agile-testing-project-3" class="externalLink"&gt;technology-facing programmer support&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; quadrant).&lt;br /&gt;&lt;br /&gt;Additionally, as a word, &lt;span class="codeInline"&gt;[Fact]&lt;/span&gt; has very good symmetry with &lt;span class="codeInline"&gt;[Theory]&lt;/span&gt;. The two kinds of tests are fundamentally different; a &lt;span class="codeInline"&gt;[Fact]&lt;/span&gt; is an invariant statement which is always true, and a &lt;span class="codeInline"&gt;[Theory]&lt;/span&gt; is a statement which is true for all the given input values.&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;Now here is where my feathers start to ruffle. Brad writes about the xUnit framwork that "&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_PostRepeater_ctl00_BodyLabel"&gt;it's an example-driven design methodology which uses code to express the intentions of the class that is under design." Say what? Isn't that a fancy description of a unit test framework? Reading that is like going into a restaurant and having the waiter describe the &lt;a href="http://en.wikipedia.org/wiki/Ravioli"&gt;ravioli&lt;/a&gt; as "a splendid blend of finely aged cheeses, high-quality bovine, and succulent savoy spinach, hand-sealed between two layers of circular pasta dough before being boiled in freshly salted mineral waters".&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;The argument that TDD is not really about testing at all does not fly with me. Of course it is about testing. Are there ways of doing TDD that provide more benefits than others? Sure, but they ALL provide the benefit of added quality (unless you are writing completely useless tests I suppose).&lt;br /&gt;&lt;br /&gt;The entire usage of "capital-T Testing" irks me. Capital-T Testing is not the only kind of testing in a project, nor should it be. Look at it this way: we have a development environment, a QA environment, and a production environment. They are all still environments. Similarly we have developer testing and quality assurance testing. They are both forms of testing, and I've never heard anyone argue that developer (or unit testing, which is just a more structured and accurate approach than old-school test harnesses) should take the place of quality assurance testing.&lt;br /&gt;&lt;br /&gt;Next, Brad almost spells out the exact reason why [Fact] is a poor choice: "&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_PostRepeater_ctl00_BodyLabel"&gt;a &lt;span class="codeInline"&gt;[Fact]&lt;/span&gt; is an invariant statement which is always true". Ok, except when that "example-driven code expression" fails during a build, in which case your [Fact] is no longer a fact, it is something else.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Finally, lets just see how this would work in practice:&lt;br /&gt;&lt;br /&gt;"Hey Joe, your facts are failing in the current build".&lt;br /&gt;&lt;br /&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_PostRepeater_ctl00_BodyLabel"&gt;&lt;/span&gt;Here is the bottom-line: all of this smells like people changing things just to be different. I can be convinced to get behind [Theory] for the 'for-all' tests, but until I hear some better rationale, the decision to switch to [Fact] seems arbitrary, and, if I may be so bold, wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-2077409980329724614?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/2077409980329724614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=2077409980329724614' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2077409980329724614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2077409980329724614'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/05/fact-vs-test.html' title='[Fact] vs [Test]'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-8421347546337498278</id><published>2008-04-29T12:59:00.003-05:00</published><updated>2008-04-29T13:24:02.936-05:00</updated><title type='text'>Running</title><content type='html'>As I made my previous post I noticed something while linking to the &lt;a href="http://www.imaginets.com/"&gt;Imaginet&lt;/a&gt; (gratuitous link) web site. Once again Imaginet is supporting the &lt;a href="http://www.manitobamarathon.mb.ca/"&gt;Manitoba Marathon&lt;/a&gt; with our &lt;a href="http://www.imaginets.com/news--events/imaginet-presents-the-hard-drive-to-the-finish-customer-challenge-in-association-with-the-manitoba-marathon.aspx"&gt;Hard Drive to the Finish Contest&lt;/a&gt;, and it reminded me that I haven't yet blogged about something I've been doing over the last several weeks: running.&lt;br /&gt;&lt;br /&gt;My wife and I signed up for a Learn To Run class at our local &lt;a href="http://www.runningroom.com/hm/"&gt;Running Room&lt;/a&gt;, which began about 5 weeks ago. If you're wondering how you learn to run, it is not as simple as the instructor simply throwing us into a gymnasium with a polar bear and telling us to survive until time is up. No, running is a little more involved than that.&lt;br /&gt;&lt;br /&gt;The course is 10 weeks long, with one day each week devoted to an instructional presentation. So far we have learned how to properly select shoes, what sort of clothing to wear, how to best incorporate cross-training into our exercise plans, and most recently about how heart rate monitoring can be used to both pace yourself and as an indicator for whether you are actually working as hard as you think are (the likely answer: you're not).&lt;br /&gt;&lt;br /&gt;After the instructional portion we go out in a pack and run for 25 minutes or so. The first week started with "1 and 1's", which is to say that for every minute we ran, we then walked a minute. This has been boosted as we progressed to where some of us are currently on "6 and 1's" and others are on "4 and 1's". By the end of the 10 weeks we should all be able to do "10 and 1's" as well as run 5k in duration.&lt;br /&gt;&lt;br /&gt;Beyond the once-a-week instruction/run class, students are expected to run two more times during the week. Many of us meet up on Wednesdays to run together, which is nice, and just leaves one run to do alone. My wife and I have taken to bringing our dog Molly along with us on many of our runs, although I'm starting to worry that it might be bad for her to try to run too much as we get running for longer times and distances. I intend to speak with the vet about it this week, at which point I will post their advice here.&lt;br /&gt;&lt;br /&gt;The bottom line in all of this: I've discovered that running is actually really fun! I'm not sure I would ever want to give up all of the team sports that I enjoy so much (hooray for &lt;a href="http://en.wikipedia.org/wiki/Ultimate_%28sport%29"&gt;Ultimate&lt;/a&gt; starting soon!) to focus solely on running, but it certainly is something I intend to continue doing after the class ends. I can't recommend a program like the Learn To Run class highly enough, and I encourage anyone who is even remotely interested to go sign up for something similar. You won't regret it!&lt;br /&gt;&lt;br /&gt;And to tie this all together, my wife and I will be running in the relay portion of the Manitoba Marathon this spring. I ran it two years ago without any training of any sort, and while I gutted it out and did ok, I had no idea how to pace myself and the last mile was excruciating. This year I intend to have a goal in terms of time, as well as a goal to pace myself better and not feel terrible by the end. Next year I want to run the half-marathon, so that is my longer term goal... but one thing at a time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-8421347546337498278?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/8421347546337498278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=8421347546337498278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8421347546337498278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8421347546337498278'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/04/running.html' title='Running'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-3804812418144314104</id><published>2008-04-29T12:44:00.003-05:00</published><updated>2008-04-29T12:57:28.595-05:00</updated><title type='text'>Webinars</title><content type='html'>My employer, &lt;a href="http://www.imaginets.com/"&gt;Imaginet Resources&lt;/a&gt;, will be starting a series of webinars this spring. Details are just being worked out, but we will be producing one per week on a variety of topics. Currently I am scheduled to host two 'episodes':&lt;br /&gt;&lt;ul&gt;&lt;li&gt;May 28 2008 - WCF Service Gateways with C# 3.0 and Linq-To-Sql; and&lt;/li&gt;&lt;li&gt;June 25 2008 - NHibernate: An Entry-Level Primer&lt;/li&gt;&lt;/ul&gt;I'll post links to the rest of the topics and further details as they come out over the next couple weeks.&lt;br /&gt;&lt;br /&gt;While many of the other presenters are seasoned vets at this sort of thing, this will be my first externally facing presentation. I'll probably post a couple of different thoughts as I prepare, and I will certainly post with my thoughts after each presentation. Hopefully I will learn some things that can be passed on to whichever poor soul Google's the wrong combination of terms and finds themselves at this blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-3804812418144314104?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/3804812418144314104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=3804812418144314104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3804812418144314104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3804812418144314104'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/04/webinars.html' title='Webinars'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-1169999045844468008</id><published>2008-04-19T00:14:00.003-05:00</published><updated>2008-04-19T00:27:39.459-05:00</updated><title type='text'>Am I Becoming An Experienced Traveler?</title><content type='html'>I've now traveled twice since the last time I wrote about my usual misadventures. Once to Vancouver, and now again to New York. And both times, nothing really of note occurred.&lt;br /&gt;&lt;br /&gt;For most people this is probably normal, but I am far from a normal traveler and so we should be expecting lots of good material whenever I get sent away from home. Sure I brought the wrong suit to Vancouver and through a quirk in how I unpacked my bag spent about 45 panicked seconds at 6:00am the first morning thinking I had brought no pants. Sure, I pack 2-3 times more stuff than anyone I travel with, including most recently 4 pairs of shoes for 3 days in New York. And sure, I'm still totally awkward in pretty much any situation that involves speaking with hotel staff.&lt;br /&gt;&lt;br /&gt;But this stuff isn't really up to snuff; I seem to be getting too good at traveling. We can only hope that maybe next time I'll lose my passport and have to spend a few nights at the Canadian consulate or something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-1169999045844468008?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/1169999045844468008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=1169999045844468008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1169999045844468008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1169999045844468008'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/04/am-i-becoming-experienced-traveler.html' title='Am I Becoming An Experienced Traveler?'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-9097130930933934299</id><published>2008-04-18T23:27:00.006-05:00</published><updated>2008-04-19T00:12:36.690-05:00</updated><title type='text'>Should I Become A Rangers Fan?</title><content type='html'>I was in New York this week for work, and was lucky enough to catch game 4 of the Rangers/Devils series at Madison Square Garden. This was the first NHL playoff game I've seen in person since the Jets left way back in '96, and it was everything I hoped it would be.&lt;br /&gt;&lt;br /&gt;The Garden itself is pretty amazing, and the fans and energy of New York just add that much more. There are several cool little traditions that I had no idea existed before I went, which were a joy to discover. I won't detail them all (you can read about them &lt;a href="http://en.wikipedia.org/wiki/History_of_the_New_York_Rangers#Traditions"&gt;here&lt;/a&gt;), but my favorite is the &lt;a href="http://www.youtube.com/watch?v=UPgc1Z5xrAc"&gt;song they all sing&lt;/a&gt; after each Rangers goal, followed closely by the "Potvin Sucks!" chant that at the time seemed random. I just love that people are still pooping on a guy that has been retired for 20 years for an incident that happened 30 years ago. Great stuff.&lt;br /&gt;&lt;br /&gt;Now, was it as glorious as the playoff games I watched the Jets play back at the Winnipeg Arena in the 90's? No, but it couldn't possibly be. First off, I was in my teens back then, and things like using up a deodorant stick seemed like monumental events. Second off, the white-outs were ridiculously awesome, and ridiculously loud. If you showed up at school the next day with anything resembling your normal voice it meant you weren't really at the game.&lt;br /&gt;&lt;br /&gt;But mostly the games back then were better because I cared so much more about who won the game. I read every Jets article in the newspaper every day. I spent more time studying box scores and leader boards than I did doing homework. I watched almost every game that came on TV (the Jets didn't get on TV all that often), and listened to many more on the radio in my room as I pretended to sleep (called marvelously by Curt Keilback).&lt;br /&gt;&lt;br /&gt;But once the Jets left, my interest in the NHL declined. I'm still a fan, but now I mostly scan the headlines in the Sports section. I don't even glance at box scores or leaderboards, and honestly don't really know who is in what place in their division until the last week or so of the season. I don't even follow the scoring leaders anymore, despite my annual hockey pool.&lt;br /&gt;&lt;br /&gt;Now don't get me wrong: I still love NHL hockey. I watch a few games on TV throughout the year, and I probably watch about 50 games over the course of the playoffs. But with no rooting interest, the results and stats have lost a lot of meaning. After the Jets left I hated the Coyotes. I resented them for leaving, and wanted nothing more than for them to fail badly. Thankfully they did just that, sparing me the fate so many Nordiques fans have tortuously endured.&lt;br /&gt;&lt;br /&gt;If I wanted to really feel involved, I needed a team of my own. I had a brief fling with Buffalo during their couple strong years at the end of the decade, but that didn't stick. I tried to like the Canadiens during my 6 month stint in Montreal, but that died out soon after I left. Burned twice by brief flings, I swore off false allegiances and have since simply rooted for teams that played a fun style or had players I liked.&lt;br /&gt;&lt;br /&gt;Unfortunately the ramification of this hockey chastity is that I never really get swept up in the games or series' anymore. Sometimes I will really want a specific team to lose (like Devils because I will hate them forever for inventing the trap), but mostly I just watched passively and marveled at individual plays or displays of skill. The only games that remind me of the old days are international games involving Team Canada, but those are few and far between.&lt;br /&gt;&lt;br /&gt;So with all of this said, after enjoying a great time at MSG and being quite impressed by the fans and their traditions, is it time to give another team a chance? Should I adopt the Rangers as my new favorite NHL team?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-9097130930933934299?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/9097130930933934299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=9097130930933934299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/9097130930933934299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/9097130930933934299'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/04/should-i-become-rangers-fan.html' title='Should I Become A Rangers Fan?'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-8576282875900797478</id><published>2008-04-04T08:24:00.002-05:00</published><updated>2008-04-04T09:04:44.529-05:00</updated><title type='text'>I've Only Been Into It For A Couple Hours Though, But I'm REALLY Into It</title><content type='html'>I decided that it might be fun to list the stuff I'm currently "into". Theoretically this type of list might inform or inspire a reader to check something out, but the reality is I'm the only one who will read this so it's more just for historical purposes. I think it might be fun to find this blog 5 years from now and remember all the stuff I thought was great back in '08.&lt;br /&gt;&lt;br /&gt;As an aside, I really wish I'd made a list like this every year of my life. It would be hilarious to see what 12-year old Dave was all about. I can make an educated guess (G.I. Joe, Transformers, spandex bike shorts, and my brother's-friend's-sister) but I'm sure I'm forgetting lots of stuff and my time line for others might be way off (perhaps 12-year old Dave thinks G.I. Joe is lame now! That was 11-year old Dave, and he was a loser).&lt;br /&gt;&lt;br /&gt;Anyways, onto the list. I'll break this into two categories: tech stuff, and other stuff.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tech Stuff&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;LINQ - In the spirit of Brick Tamland, I love LINQ! I'm not sold on LINQ-to-SQL, but LINQ-to-Entities is the best thing since sliced bread.&lt;/li&gt;&lt;li&gt;Lambda - I'm finding some nice places to use Lambda expressions, and it's happening more often. I can even write them without referring to old ones for guidance now!&lt;/li&gt;&lt;li&gt;NHibernate - This is really recent, as in this week, but I've finally gotten around to looking into NHibernate and I really think it's cool. Nothing like being 3-4 years late to the party, but whatever.&lt;/li&gt;&lt;li&gt;Gateways - I stole a cool Service and DAL architecture from some DinnerNow samples and have used it in a couple of projects now. It uses 'the Gateway pattern' (if such a thing actually exists) and just seems clean to me. Again I'm probably late to this party (and likely butchering terms - terms are not my strong suit), but whatever.&lt;/li&gt;&lt;li&gt;Macs - I'm dying to own a Mac. Yes, I am a marketers dream. Yes I'm jealous of &lt;a href="http://homepage.mac.com/stevevrporter/blog/Ta.html"&gt;Steve &lt;/a&gt;and &lt;a href="http://juanlarios.blogspot.com/"&gt;Juan&lt;/a&gt;, those handsome, Mac-toting, metro-sexual bastards.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other Stuff&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Call of Duty 4 - This is a surprise to me and everyone I know. I hate on games like CoD all the time. I'm not a big FPS fan in general. And to top it off, previous versions of CoD made me sick when I watched or played them. But I've fallen for this one, aided by the fact that 7 of my friends also own it. Private matches are the bees knees.&lt;/li&gt;&lt;li&gt;Super Mario Galaxy - No one should be surprised by this. SMG is right in my video game wheelhouse, and it hits a home run. Fun times.&lt;/li&gt;&lt;li&gt;Motion-sensing light switches - The bathroom at the office I'm currently in has one, and inspired me to install them all over my house. I will be posting about my experiences soon, I just need to find about 3 hours to type it all out.&lt;/li&gt;&lt;li&gt;D&amp;amp;D - My friends and I have been getting back into D&amp;amp;D after a long hiatus. Yes, 30-year old men playing D&amp;amp;D in my basement; we are the uber-nerds. I don't care though, it's been a blast, and soon version 4 will be out and I'll get to soak in a bunch of new rules etc (my personal favorite part of RPG's is reading the books and making characters. Actually playing is merely icing on the cake).&lt;/li&gt;&lt;li&gt;Running - My wife and I just started a 10-week class at the Running Room called Learn to Run. I don't think I'm going to become 'a runner' or anything, but the class looks to be enjoyable and will hopefully prepare us to run in the relay portion of the Manitoba Marathon this summer (the other time I ran it my 'training' consisted of using my elliptical machine twice in the week leading up to the race... I did ok, but the idea of pacing was foreign to me and that last mile was pathetic and excruciating).&lt;/li&gt;&lt;li&gt;Hockey - My spongee and ice hockey seasons have just ended, but I felt this needed to be listed. Despite my ineptitude, I love playing all forms of hockey. I wish I could get into a summer league of ice hockey. Oh well, maybe some year.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I think that's it for now. I can't wait to review this thing in 2013 and discover what a dork I was!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-8576282875900797478?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/8576282875900797478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=8576282875900797478' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8576282875900797478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8576282875900797478'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/04/ive-only-been-into-it-for-couple-hours.html' title='I&apos;ve Only Been Into It For A Couple Hours Though, But I&apos;m REALLY Into It'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-3364271726012905683</id><published>2008-02-11T13:50:00.000-06:00</published><updated>2008-02-11T15:07:08.684-06:00</updated><title type='text'>Guess Who Traveled Again?</title><content type='html'>My wife and I just got back from a week long vacation in California. We had a great time, spent two awesome days skiing on &lt;a href="http://www.bearmountain.com/index_winter.php"&gt;Bear Mountain&lt;/a&gt;, and another fun one at &lt;a href="http://disneyland.disney.go.com/disneyland/en_US/home/home?name=HomePage&amp;amp;bhcp=1"&gt;Disneyland&lt;/a&gt;, visited with my snow-bird parents, saw some sights, etc. But I was vexed, &lt;a href="http://www.theboxset.com/images/reviewcaptures/892cap012.jpg"&gt;very vexed&lt;/a&gt;, with one particular task I attempted. It was a task that at first looked easy, perhaps even mundane, but as usual the devil is in the details. What was this seemingly easy, yet incredibly difficult (and ultimately failed) undertaking?&lt;br /&gt;&lt;br /&gt;Filling my dad's car with gas.&lt;br /&gt;&lt;br /&gt;Don't laugh (ok, laugh), but that simple, every day activity had me absolutely steaming. Why was it so hard? Because America is stupid, that's why! Well maybe not, but somehow my anger took me there, as you will see. Here's what went down:&lt;br /&gt;&lt;br /&gt;My wife and I took my Dad's Dodge to Disneyland. On the way home, I thought it would be awful nice (or at least mildly courteous) of me to leave him with a full tank of gas. So a few miles away from home I pulled into a friendly-looking &lt;a href="http://www.chevron.com/"&gt;Chevron&lt;/a&gt; station. I approached the pump, which indicated I needed to insert my debit card before I could fill.&lt;br /&gt;&lt;br /&gt;"Fair enough", says I, so I swipe it through. Then it asks for my 5 digit zip code. Umm, I'm like, not from here... I don't have a zip. So I use a California one, which it tells me is invalid. Apparently the pump is 'smart' enough to check the zip against the address of my credit card (at least, that's what I assume it did). A little annoyed, but still pretty positive about the chances of getting this car filled up, I head inside to speak with staff.&lt;br /&gt;&lt;br /&gt;Now here's where it gets fun. I present you with the transcript of my chat with the semi-English speaking Chevron employee (SESCE):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SESCE&lt;/span&gt;: How much?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: Fill please. (I hand my credit card)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SESCE&lt;/span&gt;: How much?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: I'd like a full tank of gas.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SESCE&lt;/span&gt;: I need number.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: I don't know how much it will take, I just want to fill it up.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SESCE&lt;/span&gt;: You tell me number, that's how much you get.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: But what if I tell you $50 and it only takes $42?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SESCE&lt;/span&gt;: You tell me number, that's what you pay.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: &lt;exasperated&gt; But I want to fill up the car, and I don't know the exact dollar amount it will take!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SESCE&lt;/span&gt;: I need number.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: Fine $40!!&lt;br /&gt;&lt;br /&gt;So he runs my card through and actually charges it for $40 before I've even received any gas! Outside at the pump I'm fuming.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: How can I tell him a number if I don't know how much I need! I just want a fill!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My wife&lt;/span&gt;: Calm down.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: No! This is stupid! Why is this so difficult?!?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wife&lt;/span&gt;: Do you think it will stop automatically at $40 or do we need to slow down?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: Keep holding it to the max, if it goes over $40 we're taking everything we can get!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wife&lt;/span&gt;: What?!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: It shouldn't be "pay me $40 and hope you get some gas" it should be "give me some gas and hope I pay you for it"!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wife&lt;/span&gt;: Sssh! These pumps have microphones, he can hear you!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;: Good! He should hear this! This is dumb! I've just about had enough of this stupid country!!&lt;br /&gt;&lt;br /&gt;Once I'd slandered an entire country for the actions of one gas station, it went downhill from there (I think I muttered random swears until the pumped stopped automatically at $40, which of course hadn't totally filled the car).&lt;br /&gt;&lt;br /&gt;Can someone please explain to me why it was essentially impossible for me to fill my Dad's car with gas? Why do I need a zip code to pay at the pump? What kind of insane system makes you pay for something you possibly aren't going to get? If the car had only taken $32 in gas, could I have received a refund? Was there some kind of communication breakdown between me and the semi-English speaking Chevron employee? WTF??&lt;br /&gt;&lt;br /&gt;I demand answers, and until such time as this makes sense, I am declaring that America is stupid.&lt;/exasperated&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-3364271726012905683?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/3364271726012905683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=3364271726012905683' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3364271726012905683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3364271726012905683'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/02/my-wife-and-i-just-got-back-from-week.html' title='Guess Who Traveled Again?'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-8917520832636303578</id><published>2008-01-31T11:08:00.000-06:00</published><updated>2008-01-31T11:08:31.396-06:00</updated><title type='text'>JP Boodhoo, You Magnificent Bastard!</title><content type='html'>For a little while now, my co-workers and I have been watching videos from &lt;a href="http://www.dnrtv.com/"&gt;dnrTV&lt;/a&gt; over lunch once a week. Recently we have been watching &lt;a href="http://www.jpboodhoo.com/blog/"&gt;JP Boodhoo&lt;/a&gt;'s series on demystifying design patterns, which has been nothing short of excellent. But one of the neatest things I learned while watching was something he and the host mostly glossed over: A strongly typed Constants class.&lt;br /&gt;&lt;br /&gt;In the past when I've done a Constants class, it has looked something like this:&lt;br /&gt;&lt;br /&gt;&lt;div face="Courier New" size="10pt" color="black" style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}??\fs20     \cf3 public\cf0  \cf3 class\cf0  \cf4 MyConstants\par ??\cf0     \{\par ??        \cf3 public\cf0  \cf3 const\cf0  \cf3 string\cf0  MyFirstValue = \cf5 "VALUE1"\cf0 ;\par ??        \cf3 public\cf0  \cf3 const\cf0  \cf3 string\cf0  MySecondValue = \cf5 "VALUE2"\cf0 ;\par ??    \}} --&gt; &lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   22&lt;/span&gt;     &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   23&lt;/span&gt;     {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   24&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; MyFirstValue = &lt;span style="color: rgb(163, 21, 21);"&gt;"VALUE1"&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   25&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; MySecondValue = &lt;span style="color: rgb(163, 21, 21);"&gt;"VALUE2"&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   26&lt;/span&gt;     }&lt;/p&gt; &lt;/div&gt;  &lt;/div&gt;&lt;br /&gt;Then to use them it goes sort of like this:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs20     \cf3 public\cf0  \cf3 class\cf0  \cf4 MyClass\par ??\cf0     \{\par ??        \cf3 public\cf0  \cf3 string\cf0  MyValue \{ \cf3 get\cf0 ; \cf3 set\cf0 ; \}\par ??    \}} --&gt; &lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   17&lt;/span&gt;     &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyClass&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   18&lt;/span&gt;     {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   19&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; MyValue { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   20&lt;/span&gt;     }&lt;/p&gt; &lt;/div&gt; &lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs20     \cf3 class\cf0  \cf4 Program\par ??\cf0     \{\par ??        \cf3 static\cf0  \cf3 void\cf0  Main(\cf3 string\cf0 [] args)\par ??        \{\par ??            \cf4 MyClass\cf0  myObj = \cf3 new\cf0  \cf4 MyClass\cf0  \{ MyValue = \cf4 MyConstants\cf0 .MyFirstValue \};\par ??            \cf4 Console\cf0 .Write(myObj.MyValue);\par ??        \}\par ??    \}} --&gt; &lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;    8&lt;/span&gt;     &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Program&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;    9&lt;/span&gt;     {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   10&lt;/span&gt;         &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   11&lt;/span&gt;         {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   12&lt;/span&gt;             &lt;span style="color: rgb(43, 145, 175);"&gt;MyClass&lt;/span&gt; myObj = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyClass&lt;/span&gt; { MyValue = &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;.MyFirstValue };&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   13&lt;/span&gt;             &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.Write(myObj.MyValue);&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   14&lt;/span&gt;         }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   15&lt;/span&gt;     }&lt;/p&gt; &lt;/div&gt; &lt;br /&gt;Which would print out "VALUE1".&lt;br /&gt;&lt;br /&gt;This works out fine, but has an inherent flaw: you are still just passing around a string, and there is nothing stopping someone from forgetting there is a class of constants and simply assigning their own random string value. This is where JP comes in. In &lt;a href="http://www.dnrtv.com/default.aspx?showNum=65"&gt;this episode&lt;/a&gt;, somewhere near the end, he whips up a quick strongly-typed Constants class, and it works really, really well. Here's what my example above would look like if I had a quarter of Mr. Boodhoo's intelligence:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs20     \cf3 public\cf0  \cf3 class\cf0  \cf4 MyConstants\par ??\cf0     \{\par ??        \cf3 public\cf0  \cf3 static\cf0  \cf3 readonly\cf0  \cf4 MyConstants\cf0  MyFirstValue = \cf3 new\cf0  \cf4 MyConstants\cf0 ();\par ??        \cf3 public\cf0  \cf3 static\cf0  \cf3 readonly\cf0  \cf4 MyConstants\cf0  MySecondValue = \cf3 new\cf0  \cf4 MyConstants\cf0 ();\par ??\par ??        \cf3 private\cf0  MyConstants() \{ \}\par ??    \}} --&gt; &lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   22&lt;/span&gt;     &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   23&lt;/span&gt;     {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   24&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt; MyFirstValue = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;();&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   25&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt; MySecondValue = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;();&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   26&lt;/span&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   27&lt;/span&gt;         &lt;span style="color: blue;"&gt;private&lt;/span&gt; MyConstants() { }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   28&lt;/span&gt;     }&lt;/p&gt; &lt;/div&gt; &lt;br /&gt;Now when you use it, it can be typed:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs20     \cf3 public\cf0  \cf3 class\cf0  \cf4 MyClass\par ??\cf0     \{\par ??        \cf3 public\cf0  \cf4 MyConstants\cf0  MyValue \{ \cf3 get\cf0 ; \cf3 set\cf0 ; \}\par ??    \}} --&gt; &lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   17&lt;/span&gt;     &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyClass&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   18&lt;/span&gt;     {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   19&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt; MyValue { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   20&lt;/span&gt;     }&lt;/p&gt; &lt;/div&gt; &lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs20     \cf3 class\cf0  \cf4 Program\par ??\cf0     \{\par ??        \cf3 static\cf0  \cf3 void\cf0  Main(\cf3 string\cf0 [] args)\par ??        \{\par ??            \cf4 MyClass\cf0  myObj = \cf3 new\cf0  \cf4 MyClass\cf0  \{ MyValue = \cf4 MyConstants\cf0 .MyFirstValue \};\par ??            \cf4 Console\cf0 .Write(myObj.MyValue);\par ??        \}\par ??    \}} --&gt; &lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;    8&lt;/span&gt;     &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Program&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;    9&lt;/span&gt;     {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   10&lt;/span&gt;         &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   11&lt;/span&gt;         {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   12&lt;/span&gt;             &lt;span style="color: rgb(43, 145, 175);"&gt;MyClass&lt;/span&gt; myObj = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyClass&lt;/span&gt; { MyValue = &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;.MyFirstValue };&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   13&lt;/span&gt;             &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.Write(myObj.MyValue);&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   14&lt;/span&gt;         }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   15&lt;/span&gt;     }&lt;/p&gt; &lt;/div&gt; &lt;br /&gt;Which would print out... ConsoleApplication1.MyConstants? Oh crap, we're only part way there. But JP didn't leave us much to do, we just need to find a way to get a string value out of that object. Here's what our class could look like now:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}??\fs20     \cf3 public\cf0  \cf3 class\cf0  \cf4 MyConstants\par ??\cf0     \{\par ??        \cf3 public\cf0  \cf3 static\cf0  \cf3 readonly\cf0  \cf4 MyConstants\cf0  MyFirstValue = \cf3 new\cf0  \cf4 MyConstants\cf0 (\cf5 "VALUE1"\cf0 );\par ??        \cf3 public\cf0  \cf3 static\cf0  \cf3 readonly\cf0  \cf4 MyConstants\cf0  MySecondValue = \cf3 new\cf0  \cf4 MyConstants\cf0 (\cf5 "VALUE2"\cf0 );\par ??        \cf3 private\cf0  \cf3 readonly\cf0  \cf3 string\cf0  value;\par ??\par ??        \cf3 private\cf0  MyConstants(\cf3 string\cf0  value)\par ??        \{\par ??            \cf3 this\cf0 .value = value;\par ??        \}\par ??\par ??        \cf3 public\cf0  \cf3 override\cf0  \cf3 string\cf0  ToString()\par ??        \{\par ??            \cf3 return\cf0  value;\par ??        \}\par ??    \}} --&gt; &lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}??\fs20     \cf3 public\cf0  \cf3 class\cf0  \cf4 MyConstants\par ??\cf0     \{\par ??        \cf3 public\cf0  \cf3 static\cf0  \cf3 readonly\cf0  \cf4 MyConstants\cf0  MyFirstValue = \par ??            \cf3 new\cf0  \cf4 MyConstants\cf0 (\cf5 "VALUE1"\cf0 );\par ??        \cf3 public\cf0  \cf3 static\cf0  \cf3 readonly\cf0  \cf4 MyConstants\cf0  MySecondValue = \par ??            \cf3 new\cf0  \cf4 MyConstants\cf0 (\cf5 "VALUE2"\cf0 );\par ??        \cf3 private\cf0  \cf3 readonly\cf0  \cf3 string\cf0  value;\par ??\par ??        \cf3 private\cf0  MyConstants(\cf3 string\cf0  value)\par ??        \{\par ??            \cf3 this\cf0 .value = value;\par ??        \}\par ??\par ??        \cf3 public\cf0  \cf3 override\cf0  \cf3 string\cf0  ToString()\par ??        \{\par ??            \cf3 return\cf0  value;\par ??        \}\par ??    \}} --&gt; &lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   22&lt;/span&gt;     &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   23&lt;/span&gt;     {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   24&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt; MyFirstValue = &lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   25&lt;/span&gt;             &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"VALUE1"&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   26&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt; MySecondValue = &lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   27&lt;/span&gt;             &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"VALUE2"&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   28&lt;/span&gt;         &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; value;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   29&lt;/span&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   30&lt;/span&gt;         &lt;span style="color: blue;"&gt;private&lt;/span&gt; MyConstants(&lt;span style="color: blue;"&gt;string&lt;/span&gt; value)&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   31&lt;/span&gt;         {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   32&lt;/span&gt;             &lt;span style="color: blue;"&gt;this&lt;/span&gt;.value = value;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   33&lt;/span&gt;         }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   34&lt;/span&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   35&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; ToString()&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   36&lt;/span&gt;         {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   37&lt;/span&gt;             &lt;span style="color: blue;"&gt;return&lt;/span&gt; value;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   38&lt;/span&gt;         }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   39&lt;/span&gt;     }&lt;/p&gt; &lt;/div&gt; &lt;br /&gt;Now let's use it again:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs20     \cf3 public\cf0  \cf3 class\cf0  \cf4 MyClass\par ??\cf0     \{\par ??        \cf3 public\cf0  \cf4 MyConstants\cf0  MyValue \{ \cf3 get\cf0 ; \cf3 set\cf0 ; \}\par ??    \}} --&gt; &lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   17&lt;/span&gt;     &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyClass&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   18&lt;/span&gt;     {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   19&lt;/span&gt;         &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt; MyValue { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   20&lt;/span&gt;     }&lt;/p&gt; &lt;/div&gt; &lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red43\green145\blue175;}??\fs20     \cf3 class\cf0  \cf4 Program\par ??\cf0     \{\par ??        \cf3 static\cf0  \cf3 void\cf0  Main(\cf3 string\cf0 [] args)\par ??        \{\par ??            \cf4 MyClass\cf0  myObj = \cf3 new\cf0  \cf4 MyClass\cf0  \{ MyValue = \cf4 MyConstants\cf0 .MyFirstValue \};\par ??            \cf4 Console\cf0 .Write(myObj.MyValue.ToString());\par ??        \}\par ??    \}} --&gt; &lt;div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;    8&lt;/span&gt;     &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Program&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;    9&lt;/span&gt;     {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   10&lt;/span&gt;         &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   11&lt;/span&gt;         {&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   12&lt;/span&gt;             &lt;span style="color: rgb(43, 145, 175);"&gt;MyClass&lt;/span&gt; myObj = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MyClass&lt;/span&gt; { MyValue = &lt;span style="color: rgb(43, 145, 175);"&gt;MyConstants&lt;/span&gt;.MyFirstValue };&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   13&lt;/span&gt;             &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.Write(myObj.MyValue.ToString());&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   14&lt;/span&gt;         }&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   15&lt;/span&gt;     }&lt;/p&gt; &lt;/div&gt; &lt;br /&gt;Pretty sweet eh?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-8917520832636303578?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/8917520832636303578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=8917520832636303578' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8917520832636303578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8917520832636303578'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/01/jp-boodhoo-you-magnificent-bastard.html' title='JP Boodhoo, You Magnificent Bastard!'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-5878023747646463581</id><published>2008-01-31T10:16:00.000-06:00</published><updated>2008-01-31T10:26:44.447-06:00</updated><title type='text'>The Latest Christmas Post Evar</title><content type='html'>When last I wrote, I promised a picture of this year's Christmas tree, in all it's glory. Six weeks later, I've gotten around to it. Here it is, check out the girth of this thing:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/__Pu93fvm4rQ/R6H2DJcmpjI/AAAAAAAAABk/3f_0wmUdS8M/s1600-h/big_tree.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/__Pu93fvm4rQ/R6H2DJcmpjI/AAAAAAAAABk/3f_0wmUdS8M/s400/big_tree.png" alt="" id="BLOGGER_PHOTO_ID_5161677181879232050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm gonna miss that tree, what a monster. Compare it to last year's tree from my previous post they both have the same tree skirt!&lt;br /&gt;&lt;br /&gt;Coming soon: A useful post!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-5878023747646463581?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/5878023747646463581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=5878023747646463581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5878023747646463581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5878023747646463581'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2008/01/latest-christmas-post-evar.html' title='The Latest Christmas Post Evar'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/__Pu93fvm4rQ/R6H2DJcmpjI/AAAAAAAAABk/3f_0wmUdS8M/s72-c/big_tree.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-5570864303368799850</id><published>2007-12-17T18:07:00.000-06:00</published><updated>2007-12-17T18:33:49.072-06:00</updated><title type='text'>Christmas Reflections</title><content type='html'>We just brought home our Christmas '07 tree, which is so awesomely huge that, not only did it mark up the ceiling, but it also caused us to run out of lights! So I don't have any completed decorating shots yet, but I decided it might be fun to post the before and after shots of Christmas '05, when Molly, our goofy sheepdog (and at that time about 9 months old), decided to play with the tree one day while we were out.&lt;br /&gt;&lt;br /&gt;Here is a look at our proud (yet admittedly small) tree from '05 in all it's glory:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/__Pu93fvm4rQ/R2cSD4-eJEI/AAAAAAAAABM/iuA0aA1eoUQ/s1600-h/tree+v2.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/__Pu93fvm4rQ/R2cSD4-eJEI/AAAAAAAAABM/iuA0aA1eoUQ/s400/tree+v2.jpg" alt="" id="BLOGGER_PHOTO_ID_5145100957337396290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And here is what it looked like after Molly had her way with it (I hurriedly stood it up before I thought to take a picture):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/__Pu93fvm4rQ/R2cSpo-eJFI/AAAAAAAAABU/SH9pBTm6HkY/s1600-h/tree+fall+down.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/__Pu93fvm4rQ/R2cSpo-eJFI/AAAAAAAAABU/SH9pBTm6HkY/s400/tree+fall+down.jpg" alt="" id="BLOGGER_PHOTO_ID_5145101605877458002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, while there is no visual evidence of the culprit from that day, here is a picture from this afternoon. Do not be fooled by the innocent expression, this dog is 100% rascal...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/__Pu93fvm4rQ/R2cTb4-eJGI/AAAAAAAAABc/nl_4iFX_B1U/s1600-h/030.JPG"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/__Pu93fvm4rQ/R2cTb4-eJGI/AAAAAAAAABc/nl_4iFX_B1U/s400/030.JPG" alt="" id="BLOGGER_PHOTO_ID_5145102469165884514" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-5570864303368799850?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/5570864303368799850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=5570864303368799850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5570864303368799850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5570864303368799850'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/12/christmas-reflections.html' title='Christmas Reflections'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/__Pu93fvm4rQ/R2cSD4-eJEI/AAAAAAAAABM/iuA0aA1eoUQ/s72-c/tree+v2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-6885141770051029671</id><published>2007-12-10T12:00:00.001-06:00</published><updated>2007-12-10T13:13:37.493-06:00</updated><title type='text'>How Christmas Is Supposed To Work</title><content type='html'>My buddy D'Arcy is apparently &lt;a href="http://geekswithblogs.net/dlussier/archive/2007/12/09/117531.aspx"&gt;new to the real Christmas tree thing&lt;/a&gt;. I'm a little shocked, as I always believed he came from somewhere up north, a place where I assumed fake trees would be properly mocked for the craptastic little plastic devils that they are. For anyone out there curious about my take on artificial Christmas trees, here it is:&lt;br /&gt;&lt;blockquote&gt;Fake trees are for housewives and little girls. &lt;span style="font-weight: bold;"&gt;Men&lt;/span&gt; slowly kill something beautiful by removing it from nature, erecting it in their dwelling, and carefully dressing it up before spending 2-3 weeks watching it slowly whither and die. When finally it has succumbed, &lt;span style="font-weight: bold;"&gt;men&lt;/span&gt; haul the carcass into the back yard and hack it to pieces in preparation for it's final resting place: the fire pit. Forget the Baby Jesus, this is what Christmas is all about. -- Dave Harris&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;But alas, it appears that D'Arcy has never had the joy of a real tree before! It seems he is learning quickly, but I fear he is not properly appreciating the traditions and joy that come with a real Christmas. Yes, I leave 'tree' off that sentence for a reason: Christmas without a real tree is not a real Christmas. This is not open for debate.&lt;br /&gt;&lt;br /&gt;Anyways, this is how a real Christmas works, and it should be celebrated and loved for all its glorious tribulations:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Buy a perfectly imperfect Christmas tree. Or better yet, chop one down out of the woods in the middle of the night (it helps to scout out the tree you want during the day when it is light out, that way you can avoid needing a flashlight when it comes time for the Big Dirty).&lt;/li&gt;&lt;li&gt;Drag the tree into your house and stand it up in the base. If you do this right, you should have snow, needles, and branches all over your house.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you picked your tree properly, it will be at least 2-3 feet too tall. You will need to cut the bottom off, but you want to make sure that you don't cut too much. The proper final height should leave the tree-topper bent over sideways up against the ceiling. Do the cutting in place on the living room floor, which should closely resemble the tree's original home by the time you are done.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;While you get all sappy holding the tree up straight, have your wife or another family member fight their way through the needles and screw it into place. This entire process should result in at least one good yelling fit by the involved parties.&lt;/li&gt;&lt;li&gt;Circle the tree like a wolf circles it's prey. You are looking to find the 'good' side, the side that has the least number of gaping holes and broken limbs. Once you've found it, face that side towards the viewing area.&lt;/li&gt;&lt;li&gt;Your tree, if properly selected, is now gorgeously engrossing a good portion of the room it is in, pressing out against the ceiling and walls on 2-3 sides. If you've wedged it in good you might be set, but just in case, it isn't a bad idea to tie it to a couple hooks or fixtures. These ropes add ambiance and 'festive spirit' to your decor.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Time for the lights! Now, if you're doing this right, you should have a couple boxes of tangled up lights, preferably containing strands from as many different eras as possible. Don't take time planning anything out or testing the lights though; just start grabbing strands of lights out at random and spiraling them down the tree, from top to bottom.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you are lucky, you will have a few &lt;a href="http://www1.istockphoto.com/file_thumbview_approve/335900/2/istockphoto_335900_old_time_bubble_lights.jpg"&gt;bubble lights&lt;/a&gt; on your tree. These can be hard to find, so don't be ashamed if you don't have any yet, but be sure to acquire them whenever you can, and hold on to them dearly! You can go years, if not decades, without seeing bubble lights in stores. It is imperative that you treat the ones you have like Smeagol treats his precioussssss.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://farm1.static.flickr.com/191/484034551_153507ae76_m.jpg"&gt;And now is the time on Sprockets when we dance&lt;/a&gt;!&lt;/li&gt;&lt;li&gt;After the dancing, get out your boxes of decorations. These decorations should be a mishmash of things you made when you were 6 and that were handed down to  you from your dead grandparents. Nothing should 'match'. I repeat: NOTHING. SHOULD. MATCH. 'Designer' Christmas trees make the Baby Jesus cry.&lt;/li&gt;&lt;li&gt;Once the tree is littered with ornaments, some people think they are done! Those people are dumb. For now it is time for the coup de grace: tinsel! And not garland or whatever, but real &lt;a href="http://www.cheap-christmas-decorations.co.uk/index_files/cheap_christmas_tinsel_xmas_tinsel.jpg"&gt;tinsel&lt;/a&gt;. Old tinsel is even better, it used to be heavier and hung nicer than the stuff they make now. So just like bubble lights, horde your good tinsel. Do NOT throw it out with the tree! Not only is that bad for the environment, but you need that good stuff!&lt;/li&gt;&lt;li&gt;Tinsel is extremely important; it can mean the difference between looking at a rotting bark-carcass strung up in your living room, or viewing a modern-day, pine-scented Van Gogh. So when it comes to applying the tinsel, technique is very important. You can't just take hunks of it and slap it all over the tree in 15 minutes and say you're done. A properly tinseled tree is done one strand at a time, hung across one individual needle. Each little 'finger' on each branch should have at least 2-3 pieces of tinsel. To avoid frustration, it's best to start at the top and work down. Also work from the inside of the branch outwards. For a good 10 foot tree this process should take a few hours, so it is acceptable to span the work across a couple of days.&lt;/li&gt;&lt;/ol&gt;There you have it, the 12 building blocks which are the foundation of a fantastic Christmas! The tree at the Harris household will be going up next weekend, so I will post a picture of it sometime next week in all of it's imperfect, half-dead, tinsel-laden glory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-6885141770051029671?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/6885141770051029671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=6885141770051029671' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/6885141770051029671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/6885141770051029671'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/12/how-christmas-is-supposed-to-work.html' title='How Christmas Is Supposed To Work'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-5460212409438409876</id><published>2007-11-29T10:00:00.000-06:00</published><updated>2007-11-29T10:17:47.562-06:00</updated><title type='text'>XSD.EXE, oh how you vex me</title><content type='html'>I ran into an interesting issue with xsd.exe today. I was generating some classes based on a schema, but when I went to use the classes, I became confused. For some reason when generating a section that simply contains an array of another complex type, it ends up creating a double array of the inner class, rather than a normal array of the parent type which would contain a single array of the child class. This had me pretty confused for awhile but luckily I was able to find a &lt;a href="http://seroter.wordpress.com/2007/10/05/issue-when-serializing-biztalk-auto-generated-schemas-to-net-objects/"&gt;solution online&lt;/a&gt;, which saved me from hand-bombing the fix.&lt;br /&gt;&lt;br /&gt;Interestingly, while I'm currently using xsd.exe to gen the classes, I'm actually more a fan of the &lt;a href="http://www.bonesoft.com/SkeletonCrew/"&gt;Skeleton Crew tools from BoneSoft&lt;/a&gt;. If you ever need to generate schema's from XML, or classes from schema's, or both, give it a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-5460212409438409876?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/5460212409438409876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=5460212409438409876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5460212409438409876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/5460212409438409876'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/11/xsdexe-oh-how-you-vex-me.html' title='XSD.EXE, oh how you vex me'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-8016703359985088401</id><published>2007-11-13T12:51:00.000-06:00</published><updated>2007-11-14T01:01:07.033-06:00</updated><title type='text'>Back in the Whale's Vagina</title><content type='html'>I've been sent back to San Diego for some more time on-site with our favorite U.S. of American client, but if you're hoping for more embarrassing &lt;a href="http://codebaboon.blogspot.com/2007/08/heres-list-of-things-ive-learned-about.html"&gt;traveling tales&lt;/a&gt; you will be sorely disappointed by this post. On the other hand, I think we can all agree that the title alone would make this a solid 3.5 even if I just pasted the &lt;a href="http://www.lipsum.com/"&gt;"Lorem Ipsum" placeholder text&lt;/a&gt; in for content. Lets hope I can do better than that, but I'm not making any promises.&lt;br /&gt;&lt;br /&gt;This time around I'm here a little longer, and I've had a little more time to get off the hotel-office trolley tracks and enjoy the place. I got here early Sunday and took the opportunity to see the &lt;a href="http://www.chargers.com/assets/002/11568.mp3"&gt;San Diego Super Chargers&lt;/a&gt; take on Peyton Manning and the Baltimore Colts of Indianapolis. This was my first NFL game, and although it cost me a pretty penny to buy my ticket from &lt;a href="http://www.stubhub.com/"&gt;stubhub.com&lt;/a&gt;, and although I'm pretty sure that I broke a state law in doing so, it was worth it*.&lt;br /&gt;&lt;br /&gt;I've never been to a sporting event by myself before. In fact, I've never even so much as attended a movie by myself, so it felt a little weird. But the awesome, drunken fans around me made me feel welcome, and I enjoyed myself in spite of the awkwardness. There was a true Super Fan right behind me and he screamed and hollered the entire game, even during TV timeouts and the space between quarters. I left my seat to wander the stadium at half-time, so he may have been quiet during that period, but I'm skeptical. He had our whole section in stitches the entire game, but I think my favorite part was when he got so excited he started stomping up and down in a puddle of his own spilled beer, at which point his extraordinarily patient significant other finally had to pull out the "please settle down honey, you're spraying beer everywhere" line. This caused him to "squeegee" the beer away from his literal stomping grounds with his shoes in case he got too excited later on.&lt;br /&gt;&lt;br /&gt;The game itself had everything. The Chargers returned the opening kick-off for a touchdown. They returned a punt for a touchdown. They intercepted the golden boy every time he threw the ball in the first half. And yet they still almost found a way to snatch defeat from the jaws of victory. Thankfully Adam Vinatieri is in the early stages of his &lt;a href="http://en.wikipedia.org/wiki/Heel_%28professional_wrestling%29"&gt;heel turn&lt;/a&gt; (in which he will slowly destroy the Colts from within before revealing that he is still a Patriot at heart) so he missed the game-winning field goal and sent everyone home happy.&lt;br /&gt;&lt;br /&gt;The other thing that a little more time to wander around outside has allowed me to do is notice the giant &lt;a href="http://www.crateandbarrel.com/"&gt;Crate and Barrel&lt;/a&gt; store across the street from my hotel. What a wondrous land of well-priced linens and stately knick-knacks.&lt;br /&gt;&lt;br /&gt;Just kidding, what I've actually begun to appreciate is the beauty that is San Diego and its weather. This place is simply amazing. I'm not sure I'd want to live here (for a bunch of reasons that I won't get into), but I simply cannot argue that perpetual summer doesn't have some serious appeal.&lt;br /&gt;&lt;br /&gt;It certainly doesn't hurt that the cold spectre of winter is looming menacingly back in Winnipeg. In fact, if I get sent here in February there is a 37% chance that I will get caught making out with a palm tree. As with the sketchy ducat purchase noted above, however, this is a risk I'm willing to take.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;*If the police read this and I get arrested before I'm back in Canada it was in no way worth it.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-8016703359985088401?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/8016703359985088401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=8016703359985088401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8016703359985088401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8016703359985088401'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/11/back-in-whales-vagina.html' title='Back in the Whale&apos;s Vagina'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-756628816922679209</id><published>2007-11-06T10:23:00.001-06:00</published><updated>2007-11-06T10:50:31.241-06:00</updated><title type='text'>On Babies And Shelvesets</title><content type='html'>One of my co-workers is expecting his first baby any day now, and yet at the same time we've saddled him with some rather large changes that spread across all areas of our code base. The fall back, in case he cannot complete the changes to a suitable state for check-in by the time the baby arrives, has been for him to "shelve early and often". Basically, if he walks away from the computer we want him to shelve his code into TFS. This way, if he doesn't come back to the computer for a few days because a stork knocked on his door, I can just un-shelve his changes and finish up the leftover bits.&lt;br /&gt;&lt;br /&gt;This seemed like a great plan; many backs were slapped, high-fives initiated (and returned!) and egos inflated. We are genius! So I don't know about the other guys, but I've been sleeping like a newborn baby knowing that all our bases were covered. I think you know where this is going. Except it's not. But it almost did.&lt;br /&gt;&lt;br /&gt;Basically, papa-to-be was curious why some tests were failing and asked if I could unshelve his latest change and give it a look-see. When I went to do so, I got the following lovely error:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;SupportTestData.xls is locked for check-out by INSERTCOWORKERHERE in workspace COWORKERSWORKSPACE.&lt;/blockquote&gt;&lt;br /&gt;Umm, that's not good. You see, xls is binary, so you can't share a check-out. And I can't download a shelveset unless I can check out every file. This is apparently a 'feature' of TFS, because hey, shelving isn't made for sharing, that's just a nice side-benefit, so don't expect it to always work the way you hoped it would.&lt;br /&gt;&lt;br /&gt;Thankfully we discovered this pre-stork. Now we have the knowledge that he can simply undo his pending changes following his shelves, ensuring that there are no locks if he never comes back.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-756628816922679209?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/756628816922679209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=756628816922679209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/756628816922679209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/756628816922679209'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/11/on-babies-and-shelvesets.html' title='On Babies And Shelvesets'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-4963755572777515986</id><published>2007-09-20T17:20:00.000-05:00</published><updated>2007-09-20T17:23:30.792-05:00</updated><title type='text'>Nerds Can Make Anything Dirty</title><content type='html'>An innocent question about web cam's quickly turned into a hilarious discussion about broadcasting "Dev Porn". From &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;Dependency Injection&lt;/a&gt; to &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control"&gt;Inversion of Control&lt;/a&gt;, from the &lt;a href="http://en.wikipedia.org/wiki/Command_Pattern"&gt;Command Pattern&lt;/a&gt; to the &lt;a href="http://en.wikipedia.org/wiki/Observer_pattern"&gt;Observer Pattern&lt;/a&gt;, from &lt;a href="http://en.wikipedia.org/wiki/Unit_tests"&gt;Unit Tests&lt;/a&gt; to &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile Practices&lt;/a&gt;, we pretty much mined the depths of indecency while speaking only in development terms.&lt;br /&gt;&lt;br /&gt;Good times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-4963755572777515986?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/4963755572777515986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=4963755572777515986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/4963755572777515986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/4963755572777515986'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/09/we-can-make-anything-dirty.html' title='Nerds Can Make Anything Dirty'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-8901378927883320379</id><published>2007-09-13T21:39:00.000-05:00</published><updated>2007-09-14T08:26:18.380-05:00</updated><title type='text'>Vids</title><content type='html'>This is ostensibly a code-related blog, but there are other nerdly things that I'm totally geeked about right now. Don't worry, I'll get back to boring subjects like Exchange Requests soon enough, but this week I'm focusing on video games.&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Armageddon Empires&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.crypticcomet.com/games/AE/armageddon_empires.html"&gt;Armageddon Empires&lt;/a&gt; is a PC game that plays more like a board game combined with a card game. &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://dubiousquality.blogspot.com/2007/08/pc-game-of-year-2007-armageddon-empires.html"&gt;Bill Harris has given it a lot of love&lt;/a&gt;, and I have to echo his opinions, this is a really fun game. To top it all off the creator even writes a very interesting blog about game development and other things, &lt;a href="http://www.crypticcomet.com/blog/"&gt;check it out&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NHL '08&lt;/span&gt;&lt;br /&gt;I've only played the demo on the Xbox 360, but what a game! The demo only allows for you to play 1 period, and you must always use the same teams (Anaheim and Ottawa), yet my brother and I played it for about 3 hours straight the other night. We then followed that up with another night of playing with some more of my friends. From what I can tell, this is the best sports game ever. Seriously, check out &lt;a href="http://www.1up.com/do/reviewPage?cId=3162700&amp;sec=REVIEWS"&gt;this review&lt;/a&gt;. Now I just need to petition EA to bring it to the Wii, or petition the wife to bring the 360 to me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Guitar Hero&lt;/span&gt;&lt;br /&gt;I finally got a chance to play one of these games over the summer, and while I had an inkling it would be fun, I didn't realize just how much I would enjoy it. Guitar Hero II is perhaps the best game I've ever played. Yes, as psyched as I am about NHL '08, I'm even more psyched about Guitar Hero III. And no petition's necessary on this one, it hits the Wii at the end of October like all good games should.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-8901378927883320379?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/8901378927883320379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=8901378927883320379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8901378927883320379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8901378927883320379'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/09/vids.html' title='Vids'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-1099216850187487806</id><published>2007-09-04T08:58:00.000-05:00</published><updated>2007-09-04T09:04:51.016-05:00</updated><title type='text'>Exchange Requests</title><content type='html'>I was reading a few of the responses to &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/08/31/trying-to-answer-hard-questions-about-agile-development.aspx"&gt;Jeremy Miller's attempt to answer hard questions about Agile development&lt;/a&gt;, and came across &lt;a href="http://www.rgoarchitects.com/nblog/2007/09/02/FixedBidsAndAgileProjects.aspx"&gt;this post from Arnon Rotem-Gal-Oz&lt;/a&gt;. I really like the idea (and terminology) of "exchange requests", it seems like a reasonable tactic to manage a project, as well as something that you could actually sell a client on up front.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-1099216850187487806?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/1099216850187487806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=1099216850187487806' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1099216850187487806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1099216850187487806'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/09/exchange-requests.html' title='Exchange Requests'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-3526866508474759678</id><published>2007-09-03T15:55:00.000-05:00</published><updated>2007-09-03T16:00:10.114-05:00</updated><title type='text'>DVD Power Burner Burned Me Alright</title><content type='html'>Friday was "Beta Day" for me and my co-workers, as we were to ship out the Beta release of our current project. Things actually went pretty well as we wrote up documentation and ran through some final tests. No lions had lept from the undergrowth to block our way, and we were actually cracking jokes and having a good time as we approached the finish line.&lt;br /&gt;&lt;br /&gt;The final act is always to burn a few DVD's containing a VPC sandbox for the users to play in and ship them out. Zipping and Ripping the DVD's always takes some time, and as usual we were fast approaching the 4:30 drop-off deadline for our local courier. In an effort to speed things up 3 of us decided to each burn 1 copy of the DVD (rather than have 1 guy burn 3 copies, which is how it usually goes down). This seemed great and we all grabbed the files from the network share and loaded our nicely labeled Beta disks into our drives.&lt;br /&gt;&lt;br /&gt;This is when the Mogwai officially became Gremlins, at least for me. I don't do a lot of CD or DVD burning, and so I discovered that I had not bothered to install any DVD burning software the last time I "refreshed" Windows XP. Still, I thought, XP has some basic burning capabilities; I should be good. Wrong. For some reason, XP didn't think I had a burner (likely missing drivers or whatnot).&lt;br /&gt;&lt;br /&gt;Anyways, I was not to be dissuaded. I quickly hit &lt;a href="http://www.download.com/"&gt;download.com&lt;/a&gt; and searched. I came across "DVD Power Burner", which the editors had given 5 stars. I quickly began the download, although I noticed that the user rating was 1.5 stars. I decided to check the comments, and on the first page of comments all I saw were the same "1 star" responses with what looked like the same comment: "DVD Power Burner". I was in a rush, so I wrote it off as some disgruntled spammer and carried on.&lt;br /&gt;&lt;br /&gt;But wait! Look at &lt;a href="http://www.download.com/DVD-Power-Burner/3000-2646_4-10355694.html?tag=lst-0-8#rateit"&gt;this page&lt;/a&gt; and check it out for yourself. Obviously, I'm an idiot. I have no idea how I missed the giant blue text of each review, but I did. And boy (or girl), did I pay for it.&lt;br /&gt;&lt;br /&gt;Sure enough, as each of the posters warned (especially topper2), this is not a 5-star product. Upon installing, I was told I needed to reboot. I did so, and then went to run the program. It was at this point that a dialog came up saying something to the effect of (paraphrasing) "A program has modified user32.dll, Windows has moved it for your safety". The app then crashed.&lt;br /&gt;&lt;br /&gt;This struck me as not being good, but I figured "hey, Windows figured this out, its moved stuff for my safety, I'm probably ok. Let's just uninstall this thing and get something else". Well, after uninstalling I was asked to reboot again, and that was the last time I ever saw my desktop alive.&lt;br /&gt;&lt;br /&gt;Yep, my system was borked. And how! I could not boot Windows; no safe mode, no "last known good configuration", nothing. Clearly I was not going to be much help in burning the Beta DVD's at this point, so I sought some opinions on how to at least recover my files and went home.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Recovery option 1: Use BartPE&lt;/span&gt;&lt;br /&gt;Umm, I'm not even sure what this thing is (the guys at work gave it to me), but apparently it is some kind of utility for recovering systems that seems to be built in some way on the XP kernel. I loaded it, and it looked like something a Warez team had released. Anyways, I went through every single menu and option, and nothing presented me with any sort of view into my data. Goodbye Bart.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Recovery option 2: Do a "system repair" from an XP boot disk&lt;/span&gt;&lt;br /&gt;This did not work. After waiting for 10 minutes while Windows loaded 8 trillion files, I was presented with the repair option. I selected it, only to be told that, as Windows understood it, my computer had no hard drive. I yelled "yes I do!" but it wouldn't listen. On to option 3.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Recovery option 3: Reinstall windows&lt;/span&gt;&lt;br /&gt;Again, no dice. I was told that I could reinstall the OS without wiping my data files (although I'd lose all my installed programs, etc). This sounded ok, at this point all I wanted to do was recover the stuff off my "Data" partition and start fresh anyways. However, again after 10 minutes of waiting, Windows told me I had no hard drive. More yelling by me, and again Windows held firm. Uppity little OS. Anyways, on to option 4.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Recovery option 4: Run a Linux Live CD, mount the data partition, use Samba to share it out, and then copy the data from my home computer (another XP machine).&lt;/span&gt;&lt;br /&gt;Thankfully I have an Ubuntu Live CD kicking around, since I have Ubuntu installed on one of my home machines (much to my wife's chagrin). I think I'll save the gory details of this for another post, but after a couple hours I finally had my data copying onto my home XP computer. Thank you Linux!!&lt;br /&gt;&lt;br /&gt;Thus the great System Recovery Saga of 2007 was over. Sort of. I had my files, but I was still in need of a working OS on my laptop. The XP install still didn't think I had a hard drive, so it was not an option. Apple still won't let heathens like me install Tiger or Liger or whatever its called on a non-Mac system, so it was out. And as thankful as I am to Linux for recovering my files, I'm a long way away from being savvy enough with it to use it as my main work OS. This left me with one place to go: Vista.&lt;br /&gt;&lt;br /&gt;As I began the Vista install and progressed far enough to be sure that, yes, it knew I had a hard drive, a small part of me died inside. I've spent the last 6 months hating on Vista, and I think for good reason. It is bloated and buggy, and in my estimation it is basically the new "Windows ME". But it has won (by default) a second chance on my system, and a small part of me hopes that things work out better between us this time around.&lt;br /&gt;&lt;br /&gt;Just don't tell &lt;a href="http://miscjibberish.blogspot.com/"&gt;Jeremy&lt;/a&gt; I said that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-3526866508474759678?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/3526866508474759678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=3526866508474759678' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3526866508474759678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3526866508474759678'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/09/dvd-power-burner-burned-me-alright.html' title='DVD Power Burner Burned Me Alright'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-3759392116829603212</id><published>2007-08-16T17:24:00.000-05:00</published><updated>2007-09-04T23:59:57.054-05:00</updated><title type='text'>Traveling</title><content type='html'>Here's a list of things I've learned about traveling to San Diego this week:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Don't piss off the US Custom's agent.&lt;/span&gt; It really isn't hard to do either; in fact I'm somewhat convinced he sort of likes being pissed off. Anyways, despite angering this most temperamental of beasts, I was able to weasel my way into a work visa and onto my plane just in time (after being thrown back into Canada once, mind you).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Sometimes it pays to take a cab. &lt;/span&gt;My hotel is only a 20 minute walk or so from the office I was working in, so to me it made sense to just walk to and from work. Well, that makes sense when it isn't 8000 degrees Fahrenheit outside.&lt;br /&gt;&lt;br /&gt;I wore a suit to work on Wednesday, and I must say that as I left the hotel I looked damn good. I pretty much was guaranteed to make all the women at the office swoon when I got there.... except that by the time I walked through the front door my shirt was literally soaked right through. I'm not exaggerating (I wish I were), it looked like someone had poured a bucket of water on me and slapped a suit jacket over top. Thankfully the suit jacket hid my shame, but it was at least an hour before I dried off.&lt;br /&gt;&lt;br /&gt;I took a cab this morning and consider it $15 well spent.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Speaking of the heat, &lt;span style="font-weight: bold;"&gt;pack some shorts.&lt;/span&gt; Who the hell goes to California and forgets to pack shorts? The answer, of course, is me.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Speaking of forgetting things, apparently &lt;span style="font-weight: bold;"&gt;in San Diego when you ask for a toothbrush, they bring you chocolate mints.&lt;/span&gt; Very odd.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Don't expect the place you're staying to be like the place you're from.&lt;/span&gt; This is probably a given for most people, but nothing is ever a given for me. I come from a land where 7-11's, Subways, and McDonald's are plentiful and spring forth from the streets like dandelions on my brother-in-laws front lawn. Food is always in sight, no matter where you are.&lt;br /&gt;&lt;br /&gt;Apparently in La Jolla, San Diego, the only buildings that developers have the plans to build are hotels and "office parks"; you know, the cute little groupings of fancy office buildings with names like "Eastgate Technology Centre" and "Regent's Delight".&lt;br /&gt;&lt;br /&gt;Seriously, I went over 24 hours without food upon arrival because, as far as I can tell, it doesn't exist. I've been surviving on Hostess Cup cakes and instant noodles from the vending machines in the lunch room at the office. I can't wait for the scurvy to kick in so I can see what it looks like to have my joints bleed from the inside.&lt;/li&gt;&lt;/ol&gt;I might have some more to add to this by the time I get home, lets hope one of them is not "Don't get lost in an area controlled by the 92 Hoover Crips".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-3759392116829603212?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/3759392116829603212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=3759392116829603212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3759392116829603212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3759392116829603212'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/08/heres-list-of-things-ive-learned-about.html' title='Traveling'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-1703515350941860819</id><published>2007-07-31T00:40:00.001-05:00</published><updated>2007-07-31T00:50:08.636-05:00</updated><title type='text'>Transparent Intellisense = Happy Baboon</title><content type='html'>Just finished reading &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/07/28/nice-vs-2008-code-editing-improvements.aspx"&gt;this post&lt;/a&gt; by Scott Guthrie and was extremely excited to see the new Transparent Intellisense feature in VS 2008. I am constantly vexed when I have to escape out of Intellisense, and this solution looks great.&lt;br /&gt;&lt;br /&gt;As for the rest of the post, the VB Intellisense Filtering and C# Using Statement Optimizing are already in place in &lt;a href="http://www.jetbrains.com/resharper/"&gt;Resharper&lt;/a&gt;, so nothing mind-blowing there. And again I'm reminded how annoying it is that the two languages are diverging further and further from each other. Why can't both languages have those features? How hard would it be to port the Intellisense Filtering to C# and the Using Statement Optimizing into Import Optimizing for VB? Why does VB get cool LINQ Intellisense that C# doesn't get? Little interface things like this seem like such obvious candidates for cross-language compatibility.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-1703515350941860819?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/1703515350941860819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=1703515350941860819' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1703515350941860819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/1703515350941860819'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/07/transparent-intellisense-happy-baboon.html' title='Transparent Intellisense = Happy Baboon'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-3464611493157013186</id><published>2007-07-27T00:42:00.000-05:00</published><updated>2007-07-27T00:47:32.721-05:00</updated><title type='text'>Fun with Type Inference</title><content type='html'>Recently a &lt;a href="http://miscjibberish.blogspot.com/"&gt;co-worker&lt;/a&gt; of mine turned me on to the glories of &lt;a href="http://www.jetbrains.com/resharper/"&gt;Resharper&lt;/a&gt;. Using Resharper to optimize my code I learned that when calling a &lt;a href="http://msdn2.microsoft.com/en-us/library/twcad0zb%28VS.80%29.aspx"&gt;generic method&lt;/a&gt;, it is often not necessary to specify the type, as the compiler will work it out for you. Aside from a little less typing, I hadn't really figured out how this could be useful. Until this week.&lt;br /&gt;&lt;br /&gt;I was writing some basic data layer code, adding parameters to a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx"&gt;SqlCommand&lt;/a&gt; object. A couple of the annoying .NET/SQL Server 'gotchas' reared their heads at me yet again:&lt;br /&gt;&lt;br /&gt;1) You can't stick a null value in as a parameter value, it has to be transformed to DBNull.Value; and&lt;br /&gt;2) You can't stick a date of DateTime.MinValue into a DateTime field.&lt;br /&gt;&lt;br /&gt;I wanted a generic function that I could simply wrap all of my parameters into, so that I didn't have to specifically remember "oh this is a date field, call this function" or "oh this variable might contain a null, call this function".&lt;br /&gt;&lt;br /&gt;Unfortunately the DateTime comparison can't be used in a generic function, so I needed at least 2 functions, but thanks to overloading and type inference I can still use the same call everywhere. Here are my two functions:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/__Pu93fvm4rQ/RqmC3FJgmEI/AAAAAAAAAA0/02SMvXHqD1A/s1600-h/create_sqlparm.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/__Pu93fvm4rQ/RqmC3FJgmEI/AAAAAAAAAA0/02SMvXHqD1A/s400/create_sqlparm.png" alt="" id="BLOGGER_PHOTO_ID_5091744736505534530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;t&gt;&lt;t&gt;&lt;t&gt;&lt;t&gt;&lt;br /&gt;Normally when  you call a generic method, you specify the type in the call, such as:&lt;br /&gt;&lt;br /&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/__Pu93fvm4rQ/RqmGolJgmGI/AAAAAAAAABE/dq-_PFRrcXI/s1600-h/generic_parm.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/__Pu93fvm4rQ/RqmGolJgmGI/AAAAAAAAABE/dq-_PFRrcXI/s400/generic_parm.png" alt="" id="BLOGGER_PHOTO_ID_5091748885443942498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;t&gt;&lt;t&gt;&lt;t&gt;&lt;t&gt;&lt;br /&gt;If this were always the case, my calls would differ everywhere, and especially when using DateTime's because the DateTime overload is not generic.&lt;br /&gt;&lt;br /&gt;But thanks to Type Inference, I can now write code like the following, without having to care what type of variable I'm dealing with:&lt;br /&gt;&lt;br /&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/__Pu93fvm4rQ/RqmDaVJgmFI/AAAAAAAAAA8/wdcEcZeBkro/s1600-h/parms.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/__Pu93fvm4rQ/RqmDaVJgmFI/AAAAAAAAAA8/wdcEcZeBkro/s400/parms.png" alt="" id="BLOGGER_PHOTO_ID_5091745342095923282" border="0" /&gt;&lt;/a&gt;&lt;t&gt;&lt;t&gt;&lt;t&gt;&lt;t&gt;&lt;br /&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-3464611493157013186?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/3464611493157013186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=3464611493157013186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3464611493157013186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/3464611493157013186'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/07/fun-with-type-inference.html' title='Fun with Type Inference'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/__Pu93fvm4rQ/RqmC3FJgmEI/AAAAAAAAAA0/02SMvXHqD1A/s72-c/create_sqlparm.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-8048695238518641952</id><published>2007-07-23T12:57:00.000-05:00</published><updated>2007-07-23T16:22:43.682-05:00</updated><title type='text'>Fun with Anonymous Methods</title><content type='html'>A few years back when .NET 1.0 came out, I was presented with a choice: C# or VB? At the time, both languages shared all the same features; if you could do it in C#, you could do it in VB. Another cool thing with the advent of .NET was the fact that a VB assembly could reference a C# assembly (and vice-versa). So, having an extensive background in VB, I decided to stick with what I knew.&lt;br /&gt;&lt;br /&gt;Fast-forward a few years. The languages have taken different paths, and with each new .NET release C# got 1 or 2 cool language features that VB didn't have. I kept sticking with my roots, however, and blindly forged ahead as a "VB guy".&lt;br /&gt;&lt;br /&gt;This spring, however, I was thrown into the C# world and forced to swim. And you know what? I freakin' love it! I don't plan on ever going back; VB is old and busted, C# is the new hotness.&lt;br /&gt;&lt;br /&gt;With all of that said, I've had some learning to do, and some catch-up to play. One of the features of C# that VB did not pick up was the use of &lt;a href="http://msdn2.microsoft.com/en-us/library/0yw3tz5k%28VS.80%29.aspx"&gt;anonymous methods&lt;/a&gt;. Even after learning about them, I still wasn't sure if I was keen on using them. There were pluses and minuses, and I couldn't decide which out-weighed the other, so I mostly shoved them into the back of my mind and forged ahead in other areas.&lt;br /&gt;&lt;br /&gt;All this changed last week. I finally found a slam-dunk place to use anonymous methods: unit tests. By writing the method implementation in-line right into the unit test it can be more immediately clear what the test is doing. Here is a sample:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/__Pu93fvm4rQ/RqUbEFJgmCI/AAAAAAAAAAk/tKkZhH8gC3Q/s1600-h/anon_method.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/__Pu93fvm4rQ/RqUbEFJgmCI/AAAAAAAAAAk/tKkZhH8gC3Q/s400/anon_method.png" alt="" id="BLOGGER_PHOTO_ID_5090504710727702562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Don't worry too much about what the test is actually doing, but notice the highlighted part, which is attaching an anonymous method as an event handler. What I like about this is that it makes reading the unit test very clear. You don't have to jump to another function to see what exactly it is doing. I mean, even if you name it well, there is a chance it is not implemented correctly. Putting the implementation right into the test allows someone to easily verify the functionality without jumping around in the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-8048695238518641952?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/8048695238518641952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=8048695238518641952' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8048695238518641952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8048695238518641952'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/07/fun-with-anonymous-methods.html' title='Fun with Anonymous Methods'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/__Pu93fvm4rQ/RqUbEFJgmCI/AAAAAAAAAAk/tKkZhH8gC3Q/s72-c/anon_method.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-8349066089354643090</id><published>2007-07-18T23:49:00.000-05:00</published><updated>2007-07-19T00:23:17.036-05:00</updated><title type='text'>Leveraging</title><content type='html'>I don't want to turn this blog into a place where I just dump links to smarter people's blogs, but I haven't posted in awhile and I also don't want this thing to die the death that &lt;a href="http://codebaboon.blogspot.com/2007/06/urls-are-shrinking-man-and-i-dont-wanna.html"&gt;my first post&lt;/a&gt; so accurately predicts. At least not yet.&lt;br /&gt;&lt;br /&gt;So here I am, transforming myself into a Link-Whore. I suppose there are worse things, like Assistant Link-Whore. Apparently I'm stealing jokes now too; this will not end well.&lt;br /&gt;&lt;br /&gt;Anywho, I came across a &lt;a href="http://diditwith.net/PermaLink,guid,a1a76478-03d2-428f-9db6-9cf4e300ea0f.aspx"&gt;blog post&lt;/a&gt; today which kind of blew my mind. This is probably basic stuff for a lot of people, but if I can reach even one other guy like me then its worth being called a n00b or something.&lt;br /&gt;&lt;br /&gt;The post describes the Big Three higher-order functions: Filter, Map, and Reduce. I've often written the types of methods that these functions clean up, and I've even had the foresight to understand that I was doing the same things over again, and that there had to be a better way. But until today, I've never come across it. Likely I wasn't looking hard enough, which is my bad, but better late than never, as they say.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-8349066089354643090?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/8349066089354643090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=8349066089354643090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8349066089354643090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/8349066089354643090'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/07/leveraging.html' title='Leveraging'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-2886756095466370897</id><published>2007-06-27T11:34:00.000-05:00</published><updated>2007-06-27T11:43:42.303-05:00</updated><title type='text'>Habits of Speech</title><content type='html'>Ever noticed that some people, when speaking, tend to use the same phrases or words over and over? It's like, they just keep repeating it, to the point where it becomes quite distracting while you listen.&lt;br /&gt;&lt;br /&gt;It's like, do these people even know they are doing it? It's like, should I maybe mention it in case they just don't know? And I start to wonder, it's like, do I do something like that? It's like, are people staring at me while I talk, wishing I would stop saying whatever it is that I have formed a habit of saying?&lt;br /&gt;&lt;br /&gt;I don't know the answer, but I do know that, it's like, quite distracting to be watching a webinar hosted by someone who is afflicted with this behavior. It's like, great webinar, fantastic topic, but it's like, I can't stay focused. It's like, I'm sorry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-2886756095466370897?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/2886756095466370897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=2886756095466370897' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2886756095466370897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2886756095466370897'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/06/habits-of-speech.html' title='Habits of Speech'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-7651222682417769016</id><published>2007-06-22T13:44:00.001-05:00</published><updated>2007-06-22T16:06:17.469-05:00</updated><title type='text'>Exception Handling in a State Machine Workflow</title><content type='html'>I was working with a &lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa663328.aspx"&gt;Windows Workflow Foundation&lt;/a&gt; State Machine workflow this morning and came across an &lt;a href="http://msdn2.microsoft.com/en-us/library/system.workflow.activities.eventdrivenactivity.aspx"&gt;EventDrivenActivity&lt;/a&gt; that included a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.workflow.activities.callexternalmethodactivity.aspx"&gt;CallExternalMethodActivity&lt;/a&gt;. The CallExternalMethodActivity activity allows for the workflow to call a method on an external service running within your workflow runtime.&lt;br /&gt;&lt;br /&gt;In this case, the method being called was utilizing a Try/Catch block that simply threw away all exceptions. I implemented some quick logging in the Catch section but also realized that the workflow should probably move to a different state if an exception were to actually occur. So I threw the exception up and started looking at the Workflow Designer and the VS2005 Toolbox to see how to go about catching it.&lt;br /&gt;&lt;br /&gt;Interestingly, the solution is easy, but not all that obvious. There is a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.workflow.componentmodel.faulthandleractivity.aspx"&gt;FaultHandlerActivity&lt;/a&gt;, which I quickly spotted and tried to drag onto the workflow. It wouldn't let me stick it anywhere, so I inspected the properties of the different activities already on the workflow for anything that seemed like it might relate to exceptions. Looks like I'd need some help on this one.&lt;br /&gt;&lt;br /&gt;So as usual I called my Dad. He's sort of a 51 year-old Casanova, he said "Son, come on over"...&lt;br /&gt;&lt;br /&gt;Oops sorry, slipped into &lt;a href="http://www.mp3lyrics.org/d/dj-jazzy-jeff-the-fresh-prince/im-all-that/"&gt;Fresh Prince&lt;/a&gt; mode for a sec.&lt;br /&gt;&lt;br /&gt;Anyways, I did some &lt;a href="http://msdn2.microsoft.com/en-us/default.aspx"&gt;MSDN&lt;/a&gt; reading and some &lt;a href="http://www.google.ca/"&gt;Googling&lt;/a&gt;, and discovered that if you enter the detailed view for an EventDrivenActivity (by double-clicking on it in the main workflow view), and right-click the overall EventDrivenActivity object, you get some options I did not know existed:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/__Pu93fvm4rQ/Rnw3OfhAUwI/AAAAAAAAAAU/16RresvC9Is/s1600-h/eda_viewoptions.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/__Pu93fvm4rQ/Rnw3OfhAUwI/AAAAAAAAAAU/16RresvC9Is/s320/eda_viewoptions.png" alt="" id="BLOGGER_PHOTO_ID_5078995201884705538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;By selecting the Fault Handler View you are then taken to a different view of the activity where you can drag FaultHandlerActivities and specify which Exceptions to handle and what order they should cascade (similar to how a TryCatch works). You can then drop other activities into each FaultHandlerActivity to perform the actions you want.&lt;br /&gt;&lt;br /&gt;In the picture below, I chose to terminate the workflow instance and track the error message to the tracking store.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/__Pu93fvm4rQ/Rnw3aPhAUxI/AAAAAAAAAAc/v8MxJl0nFJg/s1600-h/FaultHandlers.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/__Pu93fvm4rQ/Rnw3aPhAUxI/AAAAAAAAAAc/v8MxJl0nFJg/s320/FaultHandlers.png" alt="" id="BLOGGER_PHOTO_ID_5078995403748168466" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-7651222682417769016?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/7651222682417769016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=7651222682417769016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7651222682417769016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7651222682417769016'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/06/exception-handling-in-state-machine.html' title='Exception Handling in a State Machine Workflow'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/__Pu93fvm4rQ/Rnw3OfhAUwI/AAAAAAAAAAU/16RresvC9Is/s72-c/eda_viewoptions.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-7441890196499982645</id><published>2007-06-21T15:57:00.000-05:00</published><updated>2007-06-21T16:04:41.163-05:00</updated><title type='text'>Regrets</title><content type='html'>Did you know baboons are really ugly? Seriously, &lt;a href="http://images.google.ca/images?q=baboon&amp;gbv=2&amp;amp;ndsp=20&amp;svnum=10&amp;amp;hl=en&amp;start=0&amp;amp;sa=N"&gt;Google Image Search&lt;/a&gt; those things, not a pretty sight.&lt;br /&gt;&lt;br /&gt;Code Hound would have been so much cooler. &lt;a href="http://miscjibberish.blogspot.com/"&gt;Jeremy&lt;/a&gt; came up with it in like 3 seconds.&lt;br /&gt;&lt;br /&gt;Crap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-7441890196499982645?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/7441890196499982645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=7441890196499982645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7441890196499982645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/7441890196499982645'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/06/regrets.html' title='Regrets'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6199398143014448393.post-2816189964572114698</id><published>2007-06-21T15:02:00.001-05:00</published><updated>2007-06-21T15:03:27.900-05:00</updated><title type='text'>URL's are shrinking, man, and I don't wanna swim</title><content type='html'>In creating a blog, one of the first things you need is a URL. I think I tried about 40 URL's, some basic, and some 'witty'. Each time I received "Sorry, this blog address is not available". Ugh.&lt;br /&gt;&lt;br /&gt;I started to check out what people were doing with those URL's, and discovered that a vast majority are either completely empty, or haven't been updated in 5+ years. Just a bunch of used-up URL's, wasting away while the internet marches tirelessly onward, churning out new and even dumber URL's than the ones that came before.&lt;br /&gt;&lt;br /&gt;So with this knowledge, I'd like to apologize in advance to whoever is looking for codebaboon.blogspot.com in the year 2013. I'm no better than every other sheep before me. Baa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6199398143014448393-2816189964572114698?l=codebaboon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codebaboon.blogspot.com/feeds/2816189964572114698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6199398143014448393&amp;postID=2816189964572114698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2816189964572114698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6199398143014448393/posts/default/2816189964572114698'/><link rel='alternate' type='text/html' href='http://codebaboon.blogspot.com/2007/06/urls-are-shrinking-man-and-i-dont-wanna.html' title='URL&apos;s are shrinking, man, and I don&apos;t wanna swim'/><author><name>Dave Harris</name><uri>http://www.blogger.com/profile/04087931520296052948</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
