<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>I Am Not Myself</title>
    <link>http://www.iamnotmyself.com/</link>
    <description>Bills.Pay(Developer.Skills).ShouldBeTrue()</description>
    <language>en-us</language>
    <copyright>Robert Johnson</copyright>
    <lastBuildDate>Thu, 09 Jul 2009 17:01:00 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>bobby.johnson@gmail.com</managingEditor>
    <webMaster>bobby.johnson@gmail.com</webMaster>
    <geo:lat>47.027082</geo:lat><geo:long>-122.803595</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/IAmNotMyself" type="application/rss+xml" /><item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=ad9acc84-d3a6-4d86-9586-e0be00e592ef</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,ad9acc84-d3a6-4d86-9586-e0be00e592ef.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,ad9acc84-d3a6-4d86-9586-e0be00e592ef.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ad9acc84-d3a6-4d86-9586-e0be00e592ef</wfw:commentRss>
      
      <title>MVC Public Service Announcement Video Series</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,ad9acc84-d3a6-4d86-9586-e0be00e592ef.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/vyWPJTPEmTk/MVCPublicServiceAnnouncementVideoSeries.aspx</link>
      <pubDate>Thu, 09 Jul 2009 17:01:00 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
ASP.NET MVC is all the rage right now in the .NET space. But did you know that MVC&#xD;
is a pattern that has been around for decades? And there are other communities of&#xD;
developers that have been using it to produce websites for years. Here are a set of&#xD;
videos from the Ruby on Rails community about the common pitfalls in MVC development.&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://www.youtube.com/watch?v=91C7ax0UAAc" target="_blank"&gt;MVC Public Service&#xD;
Announcement #1 - Controller Obesity&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://www.youtube.com/watch?v=6wTeFqRnKds" target="_blank"&gt;MVC Public Service&#xD;
Announcement #2 - The Importance of Tests&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://www.youtube.com/watch?v=ku3QkWcPSEw&amp;amp;feature=related" target="_blank"&gt;MVC&#xD;
Public Service Announcement #3 - Keeping Views Stupid&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://www.youtube.com/watch?v=p30dcETXwD4&amp;amp;feature=related" target="_blank"&gt;MVC&#xD;
Public Service Announcement #4 - Staying RESTful&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://www.youtube.com/watch?v=7gNPncWFdVg&amp;amp;feature=related" target="_blank"&gt;MVC&#xD;
Public Service Announcement #5 - Outdated HTML&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://www.youtube.com/watch?v=6eR3AZ5XPcs&amp;amp;feature=related" target="_blank"&gt;MVC&#xD;
Public Service Announcement #6 – Modularity&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://www.youtube.com/watch?v=HFQk8WGK1-Q&amp;amp;feature=channel_page" target="_blank"&gt;MVC&#xD;
Public Service Announcements - Out-takes&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=ad9acc84-d3a6-4d86-9586-e0be00e592ef"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=vyWPJTPEmTk:0CUR52j_Xe0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=vyWPJTPEmTk:0CUR52j_Xe0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=vyWPJTPEmTk:0CUR52j_Xe0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/vyWPJTPEmTk" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,ad9acc84-d3a6-4d86-9586-e0be00e592ef.aspx</comments>
      <category>Fundamentals</category>
      <category>Random</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/07/09/MVCPublicServiceAnnouncementVideoSeries.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=27962b9a-aeaf-44e1-9709-39dc5abf268c</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,27962b9a-aeaf-44e1-9709-39dc5abf268c.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,27962b9a-aeaf-44e1-9709-39dc5abf268c.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=27962b9a-aeaf-44e1-9709-39dc5abf268c</wfw:commentRss>
      
      <title>Norwegian Developers Conference Videos</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,27962b9a-aeaf-44e1-9709-39dc5abf268c.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/FMkfUqYelpE/NorwegianDevelopersConferenceVideos.aspx</link>
      <pubDate>Wed, 01 Jul 2009 21:10:37 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
The &lt;a href="http://www.ndc2009.no/agenda.aspx?cat=1071&amp;amp;amp;id=1813&amp;amp;amp;day=3726"&gt;Norwegian&#xD;
Developers Conference&lt;/a&gt; was held last month on June 17-19&lt;sup&gt;th&lt;/sup&gt;. From all&#xD;
accounts this conf was bordering on epic. The videos of each session have been posted&#xD;
on the website and it might be worth taking a look at them.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Some points of interest:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Michael Feathers&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4482"&gt;Seven Blind&#xD;
Alleys in Software Design&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4483"&gt;Working Effectively&#xD;
with Legacy Code&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Scott Hanselman&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4465"&gt;Deep Tour of&#xD;
.NET 4&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Uncle Bob Martin&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4477"&gt;Clean Code:&#xD;
Functions&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4536"&gt;Clean Design:&#xD;
SOLID Principles I and II&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4537"&gt;Clean Design:&#xD;
Components Principles&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Udi Dahan&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4478"&gt;Reliability,&#xD;
Availability and Scalability&lt;/a&gt; – How to have your cake, and eat it too &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4486"&gt;Intentions&#xD;
and Interfaces&lt;/a&gt; – Making Patterns Complete &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4513"&gt;Asynchronous&#xD;
Systems Architecture for the Web&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Ted Neward&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4474"&gt;The Busy Developer’s&#xD;
Guide to ECMA (Java)Script&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Jeremy D. Miller&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4464"&gt;Presentation&#xD;
Patterns for Composite Applications&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4532"&gt;Convention&#xD;
over Configuration applied to .NET&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4528"&gt;Software Design&#xD;
and Testability&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Roy Osherove&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4526"&gt;Understanding&#xD;
Test Driven Development&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4527"&gt;Unit Testing&#xD;
Best Practices&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4529"&gt;TDD: Using&#xD;
Mock Objects&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Ayende Rahien&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4533"&gt;Building Scalable&#xD;
Systems&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4534"&gt;Inversion of&#xD;
Control &amp;amp; Dependency Injection&lt;/a&gt;: Breaking out from the Dependency Hell &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4535"&gt;Producing Production&#xD;
Quality Software&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=27962b9a-aeaf-44e1-9709-39dc5abf268c"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=FMkfUqYelpE:VNGR7CTiErk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=FMkfUqYelpE:VNGR7CTiErk:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=FMkfUqYelpE:VNGR7CTiErk:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/FMkfUqYelpE" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,27962b9a-aeaf-44e1-9709-39dc5abf268c.aspx</comments>
      <category>Development</category>
      <category>Events</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/07/01/NorwegianDevelopersConferenceVideos.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=9ef3b319-8002-4078-811b-c0ecc02d450b</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,9ef3b319-8002-4078-811b-c0ecc02d450b.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,9ef3b319-8002-4078-811b-c0ecc02d450b.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9ef3b319-8002-4078-811b-c0ecc02d450b</wfw:commentRss>
      
      <title>JQuery for Absolute Beginners Video Series</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,9ef3b319-8002-4078-811b-c0ecc02d450b.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/NmlpJkpKUco/JQueryForAbsoluteBeginnersVideoSeries.aspx</link>
      <pubDate>Thu, 11 Jun 2009 15:06:51 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I have been working a lot with &lt;a href="http://jquery.com/" target="_blank"&gt;JQuery&lt;/a&gt; recently.&#xD;
It is rapidly becoming a core library for doing client side scripting in our primary&#xD;
application.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I discovered a great video series last night intended to introduce you to JQuery from&#xD;
the ground up. The first one is &lt;a href="http://blog.themeforest.net/tutorials/jquery-for-absolute-beginners-video-series/"&gt;located&#xD;
here&lt;/a&gt;. They are a great way to learn the basics.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=9ef3b319-8002-4078-811b-c0ecc02d450b"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=NmlpJkpKUco:HHEDMdYIcpA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=NmlpJkpKUco:HHEDMdYIcpA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=NmlpJkpKUco:HHEDMdYIcpA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/NmlpJkpKUco" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,9ef3b319-8002-4078-811b-c0ecc02d450b.aspx</comments>
      <category>Development</category>
      <category>JQuery</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/06/11/JQueryForAbsoluteBeginnersVideoSeries.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=3f448d75-faa4-4ab5-86d5-5ee72c4f15d5</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,3f448d75-faa4-4ab5-86d5-5ee72c4f15d5.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,3f448d75-faa4-4ab5-86d5-5ee72c4f15d5.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3f448d75-faa4-4ab5-86d5-5ee72c4f15d5</wfw:commentRss>
      
      <title>The Vendor Client Relationship (In Real World Situations)</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,3f448d75-faa4-4ab5-86d5-5ee72c4f15d5.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/PO93h8Q2tKs/TheVendorClientRelationshipInRealWorldSituations.aspx</link>
      <pubDate>Wed, 10 Jun 2009 15:41:10 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
This one is for all my contractor buddies out there.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;embed src="http://www.youtube.com/v/R2a8TRSgzZY&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1" width="425" height="344" type="application/x-shockwave-flash" allowfullscreen="true"&gt;&#xD;
          &lt;/embed&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Stolen from &lt;a href="http://www.codesqueeze.com/the-vendor-client-relationship-in-real-world-situations/" target="_blank"&gt;{CodeSqueeze}&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=3f448d75-faa4-4ab5-86d5-5ee72c4f15d5"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=PO93h8Q2tKs:HWNA9-JMnpw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=PO93h8Q2tKs:HWNA9-JMnpw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=PO93h8Q2tKs:HWNA9-JMnpw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/PO93h8Q2tKs" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,3f448d75-faa4-4ab5-86d5-5ee72c4f15d5.aspx</comments>
      <category>Commentary</category>
      <category>Random</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/06/10/TheVendorClientRelationshipInRealWorldSituations.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=a5c358ee-2dc1-4940-9867-9b21b05c76b5</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,a5c358ee-2dc1-4940-9867-9b21b05c76b5.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,a5c358ee-2dc1-4940-9867-9b21b05c76b5.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a5c358ee-2dc1-4940-9867-9b21b05c76b5</wfw:commentRss>
      
      <title>Getting Started With Selenium For ASP.NET Developers</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,a5c358ee-2dc1-4940-9867-9b21b05c76b5.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/5EBjOXlWer0/GettingStartedWithSeleniumForASPNETDevelopers.aspx</link>
      <pubDate>Wed, 10 Jun 2009 03:54:04 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
During the &lt;a href="http://www.olympiasoftwarecraftsmanship.org/" target="_blank"&gt;Olympia&#xD;
Software Craftsmanship Workshop&lt;/a&gt; last weekend, Jeff Olsen (&lt;a href="http://twitter.com/olsonjeffery" target="_blank"&gt;@olsonjeffery&lt;/a&gt;)&#xD;
demonstrated the use of the web testing framework &lt;a href="http://seleniumhq.org/" target="_blank"&gt;Selenium&lt;/a&gt;.&#xD;
I was really impressed with the &lt;a href="http://seleniumhq.org/" target="_blank"&gt;Selenium&#xD;
IDE&lt;/a&gt; and how easy it was to use in &lt;a href="http://www.mozilla.com/en-US/firefox/firefox.html?from=getfirefox" target="_blank"&gt;Firefox&lt;/a&gt;.&#xD;
One of the menu items of the IDE is to export a test as C#.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/Export_2.png"&gt;&#xD;
            &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="542" alt="Export" src="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/Export_thumb.png" width="430" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
This piqued my curiosity and I wanted to find out exactly what it takes for a .NET&#xD;
developer to get started using Selenium. This post is intended to help others get&#xD;
started.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
First, a list of the stuff you will want to download:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://java.com/en/" target="_blank"&gt;Java Runtime Environment&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://seleniumhq.org/download/" target="_blank"&gt;Selenium Remote Control&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://nunit.org/index.php?p=download" target="_blank"&gt;NUnit&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://www.mozilla.com/en-US/firefox/firefox.html?from=getfirefox" target="_blank"&gt;Firefox&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://seleniumhq.org/projects/ide/" target="_blank"&gt;Selenium IDE&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;a href="http://xpath.alephzarro.com/" target="_blank"&gt;XPather&lt;/a&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
You can get started right away by simply downloading the Selenium IDE for Firefox.&#xD;
There is a &lt;a href="http://seleniumhq.org/docs/03_selenium_ide.html#introduction" target="_blank"&gt;great&#xD;
tutorial here&lt;/a&gt; that will guide you through getting started. The other downloads&#xD;
are not required to use the IDE. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If you want to integrate your tests into your build process or write tests as if they&#xD;
were unit tests, you will need the two asterisked items at a minimum. The Selenium&#xD;
Remote Control comes in two parts. There is a server that runs under the Java Runtime&#xD;
Environment and several Client libraries for just about any flavor of programming&#xD;
you may prefer.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/SeleniumRC_2.png"&gt;&#xD;
            &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="381" alt="SeleniumRC" src="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/SeleniumRC_thumb.png" width="501" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As, you can see I have added a batch script to launch the server on my local machine.&#xD;
The file contains a single command:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
"C:\Program Files (x86)\Java\jre6\bin\java.exe" -jar selenium-server-1.0\selenium-server.jar&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
If you run the batch script, this is what you will see.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/SeleniumRunning_2.png"&gt;&#xD;
            &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="338" alt="SeleniumRunning" src="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/SeleniumRunning_thumb.png" width="669" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Selenium is now listening on its default port of 4444 for commands from the client&#xD;
library. The server portion of Selenium can run anywhere. It would be fairly easy&#xD;
to set it up to run on a VM or on your build server with minimal effort. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So now let's write some tests. This blog has a built in administrative system. After&#xD;
you authenticate, a link bar is displayed with the various administrative tasks. A&#xD;
simple set of specifications, might look like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
When authenticating with valid credentials, the configuration menu link should be&#xD;
present. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
When authenticating with invalid credentials, the configuration menu link should not&#xD;
be present.&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
Let's start by creating a new test assembly. I called mine NotMyself.Blog.Specifications.&#xD;
Simply create a new Class Library and call it what ever you want. Next add references&#xD;
to nmock, nunit.core, nunit.framework and ThoughtWorks.Selenium.Core located in the&#xD;
selenium-dotnet-client-driver-1.0 folder in the Selenium Remote Control distribution.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/References_2.png"&gt;&#xD;
            &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="390" alt="References" src="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/References_thumb.png" width="467" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I am not sure if there is a direct dependency on nmock or nunit for that mater. ThoughtWorks.Selenium.Core.dll&#xD;
is the meat &amp;amp; potatoes here. In a future post, I'll try getting up and running&#xD;
with MSTest or MBUnit. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To execute against the Selenium Server, we need to do some set up. The following base&#xD;
class demonstrates what is needed.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c#" name="code"&gt;using System;&lt;br&gt;&#xD;
using System.Text;&lt;br&gt;&#xD;
using NUnit.Framework;&lt;br&gt;&#xD;
using Selenium;&lt;br&gt;&lt;br&gt;&#xD;
namespace NotMyself.Blog.Specifications&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
public class SeleniumTestContext&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
protected ISelenium browser;&lt;br&gt;&#xD;
protected StringBuilder verificationErrors;&lt;br&gt;&lt;br&gt;&#xD;
[SetUp]&lt;br&gt;&#xD;
public void SetupTest()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
browser = new DefaultSelenium("localhost", 4444, "*iexplore", "http://iamnotmyself.com/");&lt;br&gt;&#xD;
browser.Start();&lt;br&gt;&#xD;
verificationErrors = new StringBuilder();&lt;br&gt;&lt;br&gt;&#xD;
Context();&lt;br&gt;&#xD;
BecauseOf();&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&#xD;
public virtual void Context() { }&lt;br&gt;&#xD;
public virtual void BecauseOf() { }&lt;br&gt;&#xD;
[TearDown]&lt;br&gt;&#xD;
public void TeardownTest()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
try&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
browser.Stop();&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
catch (Exception)&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
// Ignore errors if unable to close the browser&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
Assert.AreEqual("", verificationErrors.ToString());&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The above class sets up a couple fields and then news up a DefaultSelenium object.&#xD;
This object takes four constructor parameters; the URL hosting the Selenium Server,&#xD;
the port the server is running on, a string that represents the browser we want the&#xD;
tests run in (in this case IE, but we could use "*chrome" to use FireFox) and finally&#xD;
the root URL of the site we are testing.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Next up let's create a context for our authentication tests.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c#" name="code"&gt;namespace NotMyself.Blog.Specifications&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
internal class AuthenticationContext : SeleniumTestContext&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
protected string authenticationUrl = "/notreallythe/pathtomy/page.aspx";&lt;br&gt;&#xD;
protected string badPassword = "reallynotmypassword";&lt;br&gt;&#xD;
protected string goodPassword = "notreallymypassword";&lt;br&gt;&#xD;
protected string userName = "notreallymyusername";&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
This class simply allow me to share some information across multiple test classes.&#xD;
Finally we are ready to write our tests.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c#" name="code"&gt;using NUnit.Framework;&lt;br&gt;&lt;br&gt;&#xD;
namespace NotMyself.Blog.Specifications&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
[TestFixture]&lt;br&gt;&#xD;
public class When_Authenticating_With_Valid_Credentials : AuthenticationContext&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
public override void BecauseOf()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
browser.Open(authenticationUrl);&lt;br&gt;&#xD;
browser.Type("LoginBox_username", userName);&lt;br&gt;&#xD;
browser.Type("LoginBox_password", goodPassword);&lt;br&gt;&#xD;
browser.Click("LoginBox_doSignIn");&lt;br&gt;&#xD;
browser.WaitForPageToLoad("30000");&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&#xD;
[Test]&lt;br&gt;&#xD;
public void The_Configuration_Menu_Link_Should_Be_Present()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
Assert.IsTrue(browser.IsElementPresent("_ctl6_hyperLinkEditConfig"));&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&#xD;
[TestFixture]&lt;br&gt;&#xD;
public class When_Authenticating_With_Invalid_Credentials : AuthenticationContext&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
public override void BecauseOf()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
browser.Open(authenticationUrl);&lt;br&gt;&#xD;
browser.Type("LoginBox_username", userName);&lt;br&gt;&#xD;
browser.Type("LoginBox_password", badPassword);&lt;br&gt;&#xD;
browser.Click("LoginBox_doSignIn");&lt;br&gt;&#xD;
browser.WaitForPageToLoad("30000");&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&#xD;
[Test]&lt;br&gt;&#xD;
public void The_Configuration_Menu_Link_Should_Not_Be_Present()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
Assert.IsFalse(browser.IsElementPresent("_ctl6_hyperLinkEditConfig"));&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
These tests simply issue commands as if it were interacting directly with the browser&#xD;
telling it to open a URL, type some text into form fields, click a button. Validation&#xD;
works the same way, I interrogate the browser to see if specific elements exist.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Finally, all we have to do is fire up the Selenium Server by running the batch script,&#xD;
load up our test assembly into our favorite test runner and watch the tests execute.&#xD;
If you are running the Selenium Server locally you can sit back and watch the browser&#xD;
fire up and the tests execute right before your eyes. Very cool.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/TestResults_2.png"&gt;&#xD;
            &lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="274" alt="TestResults" src="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/GettingStartedWithSelenium.NETDevelopers_D9C2/TestResults_thumb.png" width="497" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=a5c358ee-2dc1-4940-9867-9b21b05c76b5"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=5EBjOXlWer0:CoDWKwpDyp0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=5EBjOXlWer0:CoDWKwpDyp0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=5EBjOXlWer0:CoDWKwpDyp0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/5EBjOXlWer0" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,a5c358ee-2dc1-4940-9867-9b21b05c76b5.aspx</comments>
      <category>Development</category>
      <category>Tools</category>
      <category>Unit Testing</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/06/10/GettingStartedWithSeleniumForASPNETDevelopers.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=988f763f-3b2b-4c7d-bd13-fdae55a19cc8</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,988f763f-3b2b-4c7d-bd13-fdae55a19cc8.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,988f763f-3b2b-4c7d-bd13-fdae55a19cc8.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=988f763f-3b2b-4c7d-bd13-fdae55a19cc8</wfw:commentRss>
      
      <title>Model-First Development with Entity Framework 4.0 (?)</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,988f763f-3b2b-4c7d-bd13-fdae55a19cc8.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/lvs5DNGA9Zk/ModelFirstDevelopmentWithEntityFramework40.aspx</link>
      <pubDate>Thu, 21 May 2009 15:18:42 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
How did they go from version 1.0 of Entity Framework directly to 4.0? &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Anyway, &lt;a href="http://channel9.msdn.com/shows/10-4/10-4-Episode-15-Model-First-Development-with-the-Entity-Framework-40/" target="_blank"&gt;here&#xD;
is a nice overview&lt;/a&gt; of the new model first story that Microsoft has baked into&#xD;
the new EF in Visual Studio 2010. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
After having watched this I have upgraded my impression of EF from “Complete Garbage”&#xD;
to “Not Entirely Horrifying”. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The RAD editor gives me pause as that is a sure sign of generating garbage behind&#xD;
the scenes. Is it human readable/modifiable? &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The original EDMX format was incredibly brittle and very anti-source control system&#xD;
friendly. Have they made improvements to that? &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I’ll have to play with it this weekend and see what it is like to actually build a&#xD;
simple app with it. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
It is nice to see that MS is listening and at least attempting to play catch up with&#xD;
nHibernate. Would be interesting to do a feature by feature comparison between the&#xD;
two.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=988f763f-3b2b-4c7d-bd13-fdae55a19cc8"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=lvs5DNGA9Zk:PlgidtWBklo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=lvs5DNGA9Zk:PlgidtWBklo:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=lvs5DNGA9Zk:PlgidtWBklo:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/lvs5DNGA9Zk" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,988f763f-3b2b-4c7d-bd13-fdae55a19cc8.aspx</comments>
      <category>Random</category>
      <category>Tools</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/05/21/ModelFirstDevelopmentWithEntityFramework40.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=ed4ba726-1f39-4fb3-8df4-a4a27ba1f380</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,ed4ba726-1f39-4fb3-8df4-a4a27ba1f380.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,ed4ba726-1f39-4fb3-8df4-a4a27ba1f380.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ed4ba726-1f39-4fb3-8df4-a4a27ba1f380</wfw:commentRss>
      
      <title>Introducing Able Probe, Inc, SUFORS &amp;amp; The Team</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,ed4ba726-1f39-4fb3-8df4-a4a27ba1f380.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/MCbg5XXW7Rs/IntroducingAbleProbeIncSUFORSAmpTheTeam.aspx</link>
      <pubDate>Wed, 13 May 2009 15:29:38 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Work on the &lt;a href="http://www.olympiasoftwarecraftsmanship.org/" target="_blank"&gt;Olympia&#xD;
Software Craftsmanship Workshop&lt;/a&gt; is coming along nicely. We announced the workshop&#xD;
on May 5th and have 20 people signed up already. If you are interested in attending,&#xD;
secure your seat ASAP. Only 15 seats left.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So what progress has been made on the materials? The amazing &lt;a href="http://twitter.com/trevorrotzien" target="_blank"&gt;Trevor&lt;/a&gt; has&#xD;
been working hard on our customer personae. Not only has he created a great set of &lt;a href="http://github.com/altnetseattle/olympia_software_craftsmanship_workshop/tree/master" target="_blank"&gt;user&#xD;
stories&lt;/a&gt;, for our fake customer but he has also gone off and created a &lt;a href="http://www.ableprobe.com" target="_blank"&gt;whole&#xD;
online presence&lt;/a&gt; as well. If you are planning to attend, be sure to get familiar&#xD;
with our customer, the more we understand their business the better crafted our solution&#xD;
will be.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Our workshop is focused on taking an existing application and applying principals&#xD;
and techniques of quality software development to make the application more maintainable&#xD;
and easier to add new functionality to. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
This requires that we have an existing application. So this last weekend I began working&#xD;
on &lt;a href="http://github.com/altnetseattle/olympia_software_craftsmanship_workshop/tree/056933767c4237afd1957d9692b8c6db4eae74de/SUFORS%20V.1" target="_blank"&gt;version&#xD;
1 of SUFORS&lt;/a&gt;, the State UFO Reporting System. Version 1 of SUFORS is intended to&#xD;
be built using the MSDN recommended style of development. So I have attempted to lean&#xD;
on Visual Studio to do most of the heavy lifting for me.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For example, lets examine the &lt;a href="http://github.com/altnetseattle/olympia_software_craftsmanship_workshop/blob/056933767c4237afd1957d9692b8c6db4eae74de/SUFORS%20V.1/Src/Web/CitizenDetail.aspx" target="_blank"&gt;Citizen&#xD;
Detail&lt;/a&gt; page. In this page I have used the Visual Studio designer to create and&#xD;
configure three SqlDataSources that feed data to a GridView, DataList and DetailsView.&#xD;
The SqlDataSources use a set of &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank"&gt;CRUD&lt;/a&gt; stored&#xD;
procedures to interact with the database. Combined this gives us a nicely crafted&#xD;
page consisting of the Citizen's personal information, a list of any internal "Concern"&#xD;
flags and a tabular view of all the Reports submitted by that Citizen.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The page also has some preconfigured actions. The table of reports obviously links&#xD;
off to a Report Detail page. The menu content area is populated with options to Edit&#xD;
the current Citizen, Add a new Report or simply Cancel out of this page and return&#xD;
form where ever you came from.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So as you can see SUFORS is not your average, sample application. It will be fully&#xD;
functional. It would be awesome of all the attendees would download the current version&#xD;
and become familiar with it. Also keep your eyes on the source control repository&#xD;
for updates as we add new features over the next couple weeks.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The other members of the team (&lt;a href="http://twitter.com/cbilson" target="_blank"&gt;Chris&lt;/a&gt;, &lt;a href="http://twitter.com/darkxanthos" target="_blank"&gt;Justin&lt;/a&gt;, &lt;a href="http://www.twitter.com/olsonjeffery" target="_blank"&gt;Jeff,&lt;/a&gt;&lt;a href="http://twitter.com/RobinClowers" target="_blank"&gt;Robin&lt;/a&gt;, &lt;a href="http://twitter.com/qrose57" target="_blank"&gt;Anne&lt;/a&gt; &amp;amp; &lt;a href="http://twitter.com/ShoshanahB" target="_blank"&gt;Shanah&lt;/a&gt;)&#xD;
are planning to meet at this weekends &lt;a href="http://altdotnetseattle.groupieguide.com/" target="_blank"&gt;ALT.NET&#xD;
Seattl&lt;/a&gt;e meeting to work out some more details. I'll post again afterwards to keep&#xD;
you up to date on any new material or changes.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Looking forward to seeing you all there and having a great time at the workshop.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=ed4ba726-1f39-4fb3-8df4-a4a27ba1f380"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=MCbg5XXW7Rs:AgMfHG5p8P4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=MCbg5XXW7Rs:AgMfHG5p8P4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=MCbg5XXW7Rs:AgMfHG5p8P4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/MCbg5XXW7Rs" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,ed4ba726-1f39-4fb3-8df4-a4a27ba1f380.aspx</comments>
      <category>Events</category>
      <category>Local</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/05/13/IntroducingAbleProbeIncSUFORSAmpTheTeam.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=8a66f205-56ba-4be5-971c-70d2c41e7afe</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,8a66f205-56ba-4be5-971c-70d2c41e7afe.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,8a66f205-56ba-4be5-971c-70d2c41e7afe.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=8a66f205-56ba-4be5-971c-70d2c41e7afe</wfw:commentRss>
      
      <title>Announcing The Olympia Software Craftsmanship Workshop</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,8a66f205-56ba-4be5-971c-70d2c41e7afe.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/LodAZ9tYMZw/AnnouncingTheOlympiaSoftwareCraftsmanshipWorkshop.aspx</link>
      <pubDate>Tue, 05 May 2009 16:58:28 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
A few friends and I from ALT.NET Seattle are putting on a software workshop right&#xD;
here in Olympia. Chris did a great job of describing it, so I will quote him:&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
Some of us folks from ALT.NET Seattle have been working on putting together a workshop&#xD;
for developers in Olympia, WA, focusing on Software Craftsmanship – which, to us,&#xD;
means caring about our craft and applying the principles we know work to what we are&#xD;
doing. The workshop is inspired by some of the discussions started in the much despised,&#xD;
“&lt;a href="http://altnetseattle.pbworks.com/Why-So-Mean"&gt;Why So Mean&lt;/a&gt;” session at&#xD;
the &lt;a href="http://altnetseattle.pbworks.com/"&gt;recent Seattle ALT.NET conference&lt;/a&gt;,&#xD;
as well as discussions in the follow up (and less controversial) “&lt;a href="http://altnetseattle.pbworks.com/ALTNET-Pedagogy"&gt;ALT.NET&#xD;
Pedagogy&lt;/a&gt;” session, as well as what &lt;a href="http://twitter.com/briandonahue"&gt;@briandonahue&lt;/a&gt; has&#xD;
been doing in Philadelphia with the “&lt;a href="http://persistall.com/archive/2009/01/14/introducing-the-quotfoundation-seriesquot.aspx"&gt;Foundation&#xD;
Series&lt;/a&gt;.” &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
I am hoping this will raise the bar a little bit and get more people walking the walk.&#xD;
My view has always been that we all have to work together, so better to get everyone&#xD;
up to speed on what’s working and what’s not, and for as many people to be passionate&#xD;
and excited about the work they are doing as possible.&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
And here is the official announcement: &#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
You’re at work and you catch yourself writing another 100 line method that you can’t&#xD;
test and really can’t even understand. You scour the Internet for ideas but there&#xD;
are so many ideas. Some say don’t test, others says don’t test anything, still others&#xD;
say test every keystroke! You just let your head drop to your desk with a solid thud.&#xD;
You think to yourself, “Is this really the best I can do?” &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
The Olympia Software Craftsmanship Workshop is one day workshop, developed with the&#xD;
intention of increasing the level of awareness of practices and skills that can improve&#xD;
our software. &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
Any developer interested in improving and learning new skills is welcome. If you can&#xD;
bring a laptop, please do. We will provide the software you need. If you can’t bring&#xD;
a laptop, don’t worry, you can pair up with someone who has one. &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
  &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;strong&gt;What:&lt;/strong&gt; Olympia Software Craftsmanship Workshop &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;strong&gt;Where:&lt;/strong&gt; Olympia Center, 222 Columbia St NW, Olympia, WA 98501 &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;strong&gt;When:&lt;/strong&gt; Saturday June 6, 2009.  10 am to 4 pm &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
            &lt;strong&gt;How much does it cost?&lt;/strong&gt; $25.00 to cover the cost of the facility and&#xD;
lunch. Seating is limited to the first 35 people to both register and submit a payment. &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
How do I sign up? Go to &lt;a href="http://www.olympiasoftwarecraftsmanship.org"&gt;www.olympiasoftwarecraftsmanship.org&lt;/a&gt;&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
The workshop is hosted by members of the &lt;a href="http://www.ssdotnet.org/" target="_blank"&gt;South&#xD;
Sound.NET users group&lt;/a&gt; and &lt;a href="http://altdotnetseattle.groupieguide.com/" target="_blank"&gt;Alt.Net&#xD;
Seattle&lt;/a&gt; who want to help others build better software. &#xD;
&lt;/p&gt;&#xD;
          &lt;p&gt;&#xD;
For more information: &lt;a href="http://github.com/altnetseattle/olympia_software_craftsmanship_workshop/tree/master"&gt;http://github.com/altnetseattle/olympia_software_craftsmanship_workshop/tree/master&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=8a66f205-56ba-4be5-971c-70d2c41e7afe"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=LodAZ9tYMZw:C6z7s295zVg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=LodAZ9tYMZw:C6z7s295zVg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=LodAZ9tYMZw:C6z7s295zVg:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/LodAZ9tYMZw" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,8a66f205-56ba-4be5-971c-70d2c41e7afe.aspx</comments>
      <category>Development</category>
      <category>Events</category>
      <category>Local</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/05/05/AnnouncingTheOlympiaSoftwareCraftsmanshipWorkshop.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=651cf0ba-c622-4bb0-9b5b-8f4285fcf948</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,651cf0ba-c622-4bb0-9b5b-8f4285fcf948.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,651cf0ba-c622-4bb0-9b5b-8f4285fcf948.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=651cf0ba-c622-4bb0-9b5b-8f4285fcf948</wfw:commentRss>
      
      <title>First Draft Outline for Portland Code Camp Presentation on nHibernate</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,651cf0ba-c622-4bb0-9b5b-8f4285fcf948.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/RGmnC3TLF98/FirstDraftOutlineForPortlandCodeCampPresentationOnNHibernate.aspx</link>
      <pubDate>Sat, 25 Apr 2009 19:53:32 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For whatever sadistic reason, I signed up to give not one, but two, presentations&#xD;
at the upcoming &lt;a href="http://portlandcodecamp.org" target="_blank"&gt;Portland Code&#xD;
Camp&lt;/a&gt;. I have also made a commitment to &lt;a href="http://twitter.com/cbilson" target="_blank"&gt;Chris&#xD;
Bilson&lt;/a&gt; to come up to Tacoma to present on &lt;a href="http://nhforge.org/" target="_blank"&gt;nHibernate&lt;/a&gt; in&#xD;
support of the &lt;a href="http://groups.google.com/group/lunchtime-speakers?hl=en" target="_blank"&gt;Lunch&#xD;
Time Speakers Group&lt;/a&gt;. So in an effort to kill two birds with one stone, I sat down&#xD;
today and whipped up a outline of what I intend to present. Your thoughts, comments,&#xD;
suggestions &amp;amp; ridicule are welcome.&#xD;
&lt;/p&gt;&#xD;
        &lt;h1&gt;Introduction to ORM with nHibernate&#xD;
&lt;/h1&gt;&#xD;
        &lt;h2&gt;What is ORM?&#xD;
&lt;/h2&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Object/Relational Impedance Mismatch &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Pros &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Cons &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;h2&gt;The Basics&#xD;
&lt;/h2&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
What Do I Need To Get Started? &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Mapping Part I: Class Map XML &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Conﬁguration Part I: How Do I Connect to My Database? &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
nHibernate Conﬁg ﬁle &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
web.conﬁg or app.conﬁg &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
ISession &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
ISessionFactory &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Conﬁguration &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
ITransaction &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Unit of Work Pattern &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;h2&gt;A Better Way &#xD;
&lt;/h2&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Mapping Part II: ClassMap&amp;lt;T&amp;gt; For the Win! &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Mapping Part III: AutoMapping Using Conventions &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Overriding for Special Cases &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Conﬁguration Part II: The Fluent Conﬁguration API &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;h2&gt;Querying&#xD;
&lt;/h2&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Hibernate Query Language (HQL): Just Say No &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Criteria API &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
The New Hotness: Linq to nHibernate &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;h2&gt;Tricks of the Trade&#xD;
&lt;/h2&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Generating Schema  From The Object Model &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Updating Schema When The Objects Change &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Integration Tests That Validate Your Mappings &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Using SQLLite To Make BDD Style Tests Lightening Fast &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;h2&gt;Resources &#xD;
&lt;/h2&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
nhforge.org &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
ﬂuentnhibernate.org &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
summerofnhibernate.com &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
nhibernate in action from Manning &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=651cf0ba-c622-4bb0-9b5b-8f4285fcf948"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=RGmnC3TLF98:2kN7lNQv3rg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=RGmnC3TLF98:2kN7lNQv3rg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=RGmnC3TLF98:2kN7lNQv3rg:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/RGmnC3TLF98" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,651cf0ba-c622-4bb0-9b5b-8f4285fcf948.aspx</comments>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/04/25/FirstDraftOutlineForPortlandCodeCampPresentationOnNHibernate.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=3292bac0-945f-466b-aa2d-609a539a3a70</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,3292bac0-945f-466b-aa2d-609a539a3a70.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,3292bac0-945f-466b-aa2d-609a539a3a70.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3292bac0-945f-466b-aa2d-609a539a3a70</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>How To Be Awesome: Enforcing ToDos with Specification Tests</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,3292bac0-945f-466b-aa2d-609a539a3a70.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/CZ9bc3fpgwE/HowToBeAwesomeEnforcingToDosWithSpecificationTests.aspx</link>
      <pubDate>Fri, 24 Apr 2009 23:20:01 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.IAmNotMyself.com/2009/04/24/PracticalExampleOfYAGNIGoodIntentionsGoneHorriblyWrong.aspx" target="_blank"&gt;Earlier&#xD;
today, I blogged&lt;/a&gt; about a &lt;a href="http://en.wikipedia.org/wiki/Kobayashi_Maru" target="_blank"&gt;Kobayashi&#xD;
Maru&lt;/a&gt; situation I found myself in with the code base which must not be named. I&#xD;
was stuck making the choice between completely destabilizing our code base at the&#xD;
end of a sprint while trying to track down all the possible side effects of fixing&#xD;
the root cause of my problem or putting yet another little hack into our code.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Over lunch, I was describing the situation to &lt;a href="http://tnthughes.net/blog/post/2009/04/24/When-to-remove-hacks.aspx" target="_blank"&gt;Terry,&#xD;
one of our other developers&lt;/a&gt;. We came to the conclusion that we needed to go with&#xD;
the hack method to meet our obligations to the Scrum Master, but we should get the&#xD;
root cause of the issue in the backlog so we could resolve it later. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
But this means that our hack would be in place in a fairly unobvious place and in&#xD;
6 months when we get the item into the sprint backlog, we might fix the issue but&#xD;
forget to remove the hack.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Typically this is solved by adding a "TODO:" in the comments right by your hack to&#xD;
remind you to remove it in the future. Our code base is littered with them.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/HowToBeAwesomeEnforcingToDoswithSpecific_E5AF/ToDoWTF_2.png"&gt;&#xD;
            &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="169" alt="ToDoWTF" src="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/HowToBeAwesomeEnforcingToDoswithSpecific_E5AF/ToDoWTF_thumb.png" width="640" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Notice the one from 2005. :-( And these are only the comments that happen to have&#xD;
"TODO:" in them. Obviously, we need a better way to remind ourselves to go back and&#xD;
take care of housekeeping tasks when we change the system.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Then Terry said, "Wouldn't it be awesome if we had a test that would fail if this&#xD;
condition changes?" and the light went off. We talked about it some more and as soon&#xD;
as I got back to the office, I created a new utility project called TestTools.HackToDos.&#xD;
I then wrote two specification style tests.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The first test demonstrates the low level call that causes the issue:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c#" name="code"&gt;[TestClass]&lt;br&gt;&#xD;
public class When_Cleaning_A_DataTable_With_Null_Dates : GridViewHacksContext&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
protected override void BecauseOf()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
Tools.Instance().CleanData(dataWithNulls);&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&#xD;
[TestMethod]&lt;br&gt;&#xD;
public void The_Nulls_Will_Be_Converted_To_Invalid_Dates()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
dataWithNulls.Rows[0].Field&lt;datetime&gt;&#xD;
(0).ShouldEqual(DateTime.MinValue);&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&#xD;
&lt;/datetime&gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The second test demonstrates what I would like to happen:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c#" name="code"&gt;[TestClass]&lt;br&gt;&#xD;
public class When_Binding_GridView_To_DataView_With_Invalid_Dates : GridViewHacksContext&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
protected override void BecauseOf()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
Tools.Instance().CleanData(dataWithNulls);&lt;br&gt;&#xD;
grid.BindData(dataWithNulls.DefaultView, layoutManager.Columns);&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&#xD;
[TestMethod]&lt;br&gt;&#xD;
public void The_Invaid_Date_Should_Be_Hacked_Out()&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
Assert.IsTrue(String.IsNullOrEmpty(grid.Rows[0].Cells[0].Text));&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Running these tests resulted in the first test passing and the second failing. I then&#xD;
introduced my "hack fix" as a part of my extension methods to GridView:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c#" name="code"&gt;private static void hackOutBadDates(GridView grid)&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
foreach (var row in grid.GridDataRows())&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
foreach (TableCell cell in row.Cells)&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
if (cell.Text.Contains(@"01/01/0001"))&lt;br&gt;&#xD;
cell.Text = null;&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Now both tests pass. And my lovely jQuery awesome grid now displays null dates correctly.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/HowToBeAwesomeEnforcingToDoswithSpecific_E5AF/yagniYAY_2.png"&gt;&#xD;
            &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="162" alt="yagniYAY" src="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/HowToBeAwesomeEnforcingToDoswithSpecific_E5AF/yagniYAY_thumb.png" width="521" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Now I can safely check this code in and feel like I performed &lt;a href="http://blog.objectmentor.com/articles/2009/01/09/the-big-redesign-in-the-sky" target="_blank"&gt;my&#xD;
boy scout duty today&lt;/a&gt; without feeling dirty. In 6 months when someone on the team&#xD;
gets the sprint item to fix our goofy handling of null values in data tables, my first&#xD;
test is either going to fail or even fail to compile. That dev will go look at the&#xD;
test and find himself staring at this comment block:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c#" name="code"&gt;/// &#xD;
&lt;summary&gt;&lt;br&gt;&#xD;
/// TODO: this spec demonstrates a low level flaw in our dataaccess layer where&lt;br&gt;&#xD;
/// DateTime columns in a DataTable are set to a value of DateTime.MinValue&lt;br&gt;&#xD;
/// after every read. When we attempt to bind a Grid View to the resulting DataTable&lt;br&gt;&#xD;
/// null dates are displayed as "01/01/0001" which DateTime.Parse throws as invalid.&lt;br&gt;&#xD;
/// I have added a hack to our grid view extension methods that fixes this problem.&lt;br&gt;&#xD;
/// If these tests fails, it might be because we fixed the low level issue and&lt;br&gt;&#xD;
/// the hack should be removed along with these tests.&lt;br&gt;&#xD;
/// &#xD;
&lt;/summary&gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
And there you have ToDos that are enforced by unit tests.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=3292bac0-945f-466b-aa2d-609a539a3a70"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=CZ9bc3fpgwE:G6_uM6D5u4I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=CZ9bc3fpgwE:G6_uM6D5u4I:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=CZ9bc3fpgwE:G6_uM6D5u4I:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/CZ9bc3fpgwE" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,3292bac0-945f-466b-aa2d-609a539a3a70.aspx</comments>
      <category>Development</category>
      <category>Unit Testing</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/04/24/HowToBeAwesomeEnforcingToDosWithSpecificationTests.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=1edfc44e-0c6d-4ba4-861a-4ae26ad1a571</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,1edfc44e-0c6d-4ba4-861a-4ae26ad1a571.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,1edfc44e-0c6d-4ba4-861a-4ae26ad1a571.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1edfc44e-0c6d-4ba4-861a-4ae26ad1a571</wfw:commentRss>
      
      <title>Practical Example of YAGNI: Good Intentions Gone Horribly Wrong</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,1edfc44e-0c6d-4ba4-861a-4ae26ad1a571.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/6SGKkLvAl4w/PracticalExampleOfYAGNIGoodIntentionsGoneHorriblyWrong.aspx</link>
      <pubDate>Fri, 24 Apr 2009 17:43:25 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://c2.com/xp/YouArentGonnaNeedIt.html" target="_blank"&gt;YAGNI&lt;/a&gt;, "you&#xD;
aren't gonna need it" (should maybe have a sub-principal of "will prolly come back&#xD;
around to bite you in the ass later"), is a principal that gets tossed around a lot&#xD;
to keep gold plating developers like me in check. I just love traveling down bunny&#xD;
trails adding "wouldn't it be cool if..." features to the code I am working on. I&#xD;
recognize this this fault in myself and routinely stop to ask myself, "why am I doing&#xD;
this?" or "how does this relate to the task at hand?" maybe even a "what effects could&#xD;
this have in other areas of the system?" on occasions where I am feeling extra saucy.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I wish someone had asked those questions of the person who wrote this code that I&#xD;
discovered deep in the bowls of "the code base that must not be named".&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c#" name="code"&gt;public void CleanData(DataRow row, int upperLimit)&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
if ((row == null))&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
return;&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&#xD;
//Look at each field in this row &#xD;
&lt;br&gt;&#xD;
for (int i = 0; i &amp;lt;= upperLimit; i++)&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
//If this field is null, change the value of the field to some type of empty value &#xD;
&lt;br&gt;&#xD;
if ((row.ItemArray.GetValue(i)) == DBNull.Value)&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
// Handle all possible types of data in a datatable &#xD;
&lt;br&gt;&#xD;
switch (row.Table.Columns[i].DataType.Name)&lt;br&gt;&#xD;
{&lt;br&gt;&#xD;
case "Boolean":&lt;br&gt;&#xD;
row[i] = false;&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "Byte":&lt;br&gt;&#xD;
row[i] = (byte) 0;&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "Byte[]":&lt;br&gt;&#xD;
row[i] = 0;&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "DateTime":&lt;br&gt;&#xD;
row[i] = DateTime.MinValue;&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "Decimal":&lt;br&gt;&#xD;
row[i] = (decimal) 0;&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "Double":&lt;br&gt;&#xD;
row[i] = (double) 0;&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "Int16":&lt;br&gt;&#xD;
case "Int32":&lt;br&gt;&#xD;
case "Int64":&lt;br&gt;&#xD;
row[i] = Conversions.ToInteger(0);&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "Long":&lt;br&gt;&#xD;
row[i] = Conversions.ToLong(0);&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "Short":&lt;br&gt;&#xD;
row[i] = (short) 0;&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "Single":&lt;br&gt;&#xD;
row[i] = (float) 0;&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
case "String":&lt;br&gt;&#xD;
row[i] = "";&lt;br&gt;&#xD;
break;&lt;br&gt;&lt;br&gt;&#xD;
//If a type shows up that is not handled, throw a meaningful exception &#xD;
&lt;br&gt;&#xD;
default:&lt;br&gt;&#xD;
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture,&lt;br&gt;&#xD;
Resources.InvalidConversionDataType,&lt;br&gt;&#xD;
row.Table.Columns[i].DataType.Name));&lt;br&gt;&#xD;
}&lt;br&gt;&#xD;
}&lt;/pre&gt;&#xD;
        &lt;pre class="c#" name="code"&gt; &lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Now at first glance, this doesn't seem that bad. A very nice example of gold plating.&#xD;
I can hear the developer now saying to him or herself, "wouldn't it be cool if we&#xD;
never had to check for DBNull? Seriously that would be jalapeno hot!" &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I wonder if the developer was thinking about this possible unintended consequence&#xD;
that I am currently working to resolve.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/PracticalExampleofYAGNIGoodIntentionsGon_96CA/yagnidoh_2.png"&gt;&#xD;
            &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="162" alt="yagnidoh" src="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/PracticalExampleofYAGNIGoodIntentionsGon_96CA/yagnidoh_thumb.png" width="521" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So, now I have nonsense dates being rendered out to my page. Trying to address this&#xD;
issue at the source, I commented out the line that sets dates to a min value in the&#xD;
clean data method to see what happens.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/PracticalExampleofYAGNIGoodIntentionsGon_96CA/yagniuberdoh_2.png"&gt;&#xD;
            &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="263" alt="yagniuberdoh" src="http://www.iamnotmyself.com/content/binary/WindowsLiveWriter/PracticalExampleofYAGNIGoodIntentionsGon_96CA/yagniuberdoh_thumb.png" width="628" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Well that is interesting. To make it perfectly obvious _StaffMember is a hashtable.&#xD;
And the value of it's Staff_Lockout_Datetime key is and empty string. And this error&#xD;
is being caused by me switching a low level data clean up method to not change a null&#xD;
value to a invalid date. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So how is this hashtable created? Once again, deep in the bowls of the code base is&#xD;
a method called ToHashtable that takes a datarow and returns a hashtable. The interesting&#xD;
block of code is below.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="vb" name="code"&gt;For i As Integer = 0 To tableRow.Table.Columns.Count - 1&lt;br&gt;&lt;br&gt;&#xD;
If tableRow.IsNull(i) Then&lt;br&gt;&lt;br&gt;&#xD;
'Convert nulls to 0 or "" before putting in hashtable&lt;br&gt;&#xD;
Select Case tableRow.Table.Columns(i).DataType.Name&lt;br&gt;&lt;br&gt;&#xD;
Case "Int64", "Int32", "Int16", "Decimal", "Double", "Single"&lt;br&gt;&lt;br&gt;&#xD;
'Numeric data types&lt;br&gt;&#xD;
If convertDBNullIntToZero Then&lt;br&gt;&#xD;
ht.Add(tableRow.Table.Columns(i).ColumnName, 0)&lt;br&gt;&#xD;
Else&lt;br&gt;&#xD;
ht.Add(tableRow.Table.Columns(i).ColumnName, "")&lt;br&gt;&#xD;
End If&lt;br&gt;&lt;br&gt;&#xD;
Case Else&lt;br&gt;&lt;br&gt;&#xD;
'String, DateTime data types&lt;br&gt;&#xD;
ht.Add(tableRow.Table.Columns(i).ColumnName, "")&lt;br&gt;&lt;br&gt;&#xD;
End Select&lt;br&gt;&lt;br&gt;&#xD;
Else&lt;br&gt;&#xD;
'blah blah blah&lt;br&gt;&#xD;
End If&lt;br&gt;&#xD;
Next&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So once again we have some gold plating here attempting to prevent other developers&#xD;
from having to check for null values. The interesting thing is why are we checking&#xD;
for nulls on a row that has already been though the clean process when the dataset&#xD;
was retrieved from the database? It seems to me this block of code has never been&#xD;
hit before today. Maybe our gold plate-ers are not comparing notes on all the filigree&#xD;
they are adorning our objects with.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The icing to this cake is the line of code where it all blows up. Look at it. What&#xD;
are they really trying to do?&#xD;
&lt;/p&gt;&#xD;
        &lt;blockquote&gt;&#xD;
          &lt;p&gt;&#xD;
If CDate(&lt;strong&gt;_StaffMember("Staff_Lockout_Datetime")&lt;/strong&gt;) &amp;lt;&amp;gt; CDate(&lt;strong&gt;Nothing&lt;/strong&gt;)&#xD;
Then&#xD;
&lt;/p&gt;&#xD;
        &lt;/blockquote&gt;&#xD;
        &lt;p&gt;&#xD;
All they really want to know is if the hash table value is null. Exactly what our&#xD;
gold plate-ers have so desperately been trying to hide from us.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So I am left with two choices:&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
Attempt to locate all the areas in the entire application where this gold plating&#xD;
has caused assumptions and correct them to let null dates make their way out the UI&#xD;
and hope like hell I don't introduce more bizarre side effects.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Come up with some goofy databinding or prerender hack to work around the invalid dates.&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
Both options leave a bad taste in my mouth and a strong desire to drown my sorrows&#xD;
with a nice Irish whiskey.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=1edfc44e-0c6d-4ba4-861a-4ae26ad1a571"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=6SGKkLvAl4w:MVXe_liX-zo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=6SGKkLvAl4w:MVXe_liX-zo:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=6SGKkLvAl4w:MVXe_liX-zo:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/6SGKkLvAl4w" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,1edfc44e-0c6d-4ba4-861a-4ae26ad1a571.aspx</comments>
      <category>Development</category>
      <category>Fundamentals</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/04/24/PracticalExampleOfYAGNIGoodIntentionsGoneHorriblyWrong.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.iamnotmyself.com/Trackback.aspx?guid=2e765031-de22-4974-8689-ec74c56c27fc</trackback:ping>
      <pingback:server>http://www.iamnotmyself.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.iamnotmyself.com/PermaLink,guid,2e765031-de22-4974-8689-ec74c56c27fc.aspx</pingback:target>
      <dc:creator>Bobby Johnson</dc:creator>
      <wfw:comment>http://www.iamnotmyself.com/CommentView,guid,2e765031-de22-4974-8689-ec74c56c27fc.aspx</wfw:comment>
      <wfw:commentRss>http://www.iamnotmyself.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2e765031-de22-4974-8689-ec74c56c27fc</wfw:commentRss>
      
      <title>I am Officially a jQuery Convert</title>
      <guid isPermaLink="false">http://www.iamnotmyself.com/PermaLink,guid,2e765031-de22-4974-8689-ec74c56c27fc.aspx</guid>
      <link>http://feedproxy.google.com/~r/IAmNotMyself/~3/oUEXmAhnBAE/IAmOfficiallyAJQueryConvert.aspx</link>
      <pubDate>Wed, 22 Apr 2009 21:53:17 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
This just might be the most awesome JavaScript I have written in the better part of&#xD;
a decade.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="js" name="code"&gt;function sortEnd() {&lt;br&gt;&#xD;
$('thead th', this).each(function() {&lt;br&gt;&lt;br&gt;&#xD;
var $className = $(this).attr('class');&lt;br&gt;&#xD;
var $anchor = $('a', this);&lt;br&gt;&#xD;
var titleText;&lt;br&gt;&lt;br&gt;&#xD;
switch ($className) {&lt;br&gt;&#xD;
case "headerSortUp":&lt;br&gt;&#xD;
titleText = $anchor.text() + ', sorted acending';&lt;br&gt;&#xD;
break;&lt;br&gt;&#xD;
case "headerSortDown":&lt;br&gt;&#xD;
titleText = $anchor.text() + ', sorted decending';&lt;br&gt;&#xD;
break;&lt;br&gt;&#xD;
default:&lt;br&gt;&#xD;
titleText = $anchor.text() + ', sort by';&lt;br&gt;&#xD;
}&lt;br&gt;&lt;br&gt;&#xD;
$anchor.attr('title', titleText);&lt;br&gt;&#xD;
$anchor.attr('alt', titleText);&lt;br&gt;&lt;br&gt;&#xD;
});&lt;br&gt;&#xD;
};&lt;/pre&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.iamnotmyself.com/aggbug.ashx?id=2e765031-de22-4974-8689-ec74c56c27fc"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=oUEXmAhnBAE:AbQFC0vTvQg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=oUEXmAhnBAE:AbQFC0vTvQg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/IAmNotMyself?a=oUEXmAhnBAE:AbQFC0vTvQg:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/IAmNotMyself?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/IAmNotMyself/~4/oUEXmAhnBAE" height="1" width="1"/&gt;</description>
      <comments>http://www.iamnotmyself.com/CommentView,guid,2e765031-de22-4974-8689-ec74c56c27fc.aspx</comments>
      <category>Development</category>
    <feedburner:origLink>http://www.IAmNotMyself.com/2009/04/22/IAmOfficiallyAJQueryConvert.aspx</feedburner:origLink></item>
  </channel>
</rss>
