<?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:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Brian Hartsock's Blog</title>
	
	<link>http://blog.brianhartsock.com</link>
	<description>The exciting life of a software developer and nerd</description>
	<lastBuildDate>Sat, 06 Mar 2010 21:10:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BrianHartsocksBlog" /><feedburner:info uri="brianhartsocksblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Unintended consequences – Transactions</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/UfrGxHg1UJo/</link>
		<comments>http://blog.brianhartsock.com/2010/03/03/unintended-consequences-transactions/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 01:01:36 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[NHibernate]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1308</guid>
		<description><![CDATA[What&#8217;s wrong with the following code?

using &#40;var transaction = session.BeginTransaction&#40;&#41;&#41;
&#123;
    session.Save&#40;something&#41;;
    transaction .Commit&#40;&#41;;
&#125;

Nothing if you are using MySQL connector 6.0, which has the following Dispose method on its MySqlTransaction class.

protected override void Dispose&#40;bool disposing&#41;
&#123;
    if &#40;&#40;&#40;&#40;this.conn != null&#41; &#38;&#38; &#40;this.conn.State == ConnectionState.Open&#41;&#41; &#124;&#124; this.conn.SoftClosed&#41; &#38;&#38; this.open&#41;
 [...]]]></description>
			<content:encoded><![CDATA[<p>What&#8217;s wrong with the following code?</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>var transaction <span style="color: #008000;">=</span> session.<span style="color: #0000FF;">BeginTransaction</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    session.<span style="color: #0000FF;">Save</span><span style="color: #000000;">&#40;</span>something<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    transaction .<span style="color: #0000FF;">Commit</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Nothing if you are using MySQL connector 6.0, which has the following <em>Dispose</em> method on its <em>MySqlTransaction</em> class.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> Dispose<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">bool</span> disposing<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">conn</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">conn</span>.<span style="color: #0000FF;">State</span> <span style="color: #008000;">==</span> ConnectionState.<span style="color: #0000FF;">Open</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">||</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">conn</span>.<span style="color: #0000FF;">SoftClosed</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">open</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Rollback</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">Dispose</span><span style="color: #000000;">&#40;</span>disposing<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>But if you are using 5.0.9, check out this code (which is actually from the underlying <em>DbTransaction</em> object).</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Dispose<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Dispose</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> <span style="color: #0600FF;">void</span> Dispose<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">bool</span> disposing<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Where&#8217;s the rollback?  Missing.  Just wait till your next transaction block.</p>
<p>Looks like it was <a href="http://bugs.mysql.com/bug.php?id=39817">fixed in 5.1</a>.  <a href="http://blog.everythings-beta.com/">Srijak </a>and <a href="http://mikedellanoce.blogspot.com/">Dellanoce </a>figured this out, but I sniped it from them before they could post.  I was standing over their shoulder <img src='http://blog.brianhartsock.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+Unintended+consequences+%E2%80%93+Transactions+http://bit.ly/9XX0DA" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2010/03/03/unintended-consequences-transactions/&amp;title=Unintended+consequences+%E2%80%93+Transactions" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2010/03/03/unintended-consequences-transactions/&amp;t=Unintended+consequences+%E2%80%93+Transactions" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2010/03/03/unintended-consequences-transactions/&amp;title=Unintended+consequences+%E2%80%93+Transactions" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/UfrGxHg1UJo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2010/03/03/unintended-consequences-transactions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2010/03/03/unintended-consequences-transactions/</feedburner:origLink></item>
		<item>
		<title>Another Convert – Robert Beheiter</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/jrqXti3pQCo/</link>
		<comments>http://blog.brianhartsock.com/2010/01/19/another-convert-robert-beheiter/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 15:53:43 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Blogging]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1299</guid>
		<description><![CDATA[I have convinced another employee of mine to start a blog.  Check out Robert Beheiter&#8217;s blog, first few posts on F#.  Looking forward to future posts.
   ]]></description>
			<content:encoded><![CDATA[<p>I have convinced another employee of mine to start a blog.  Check out <a href="http://www.beheiter.com/robert/blog/">Robert Beheiter&#8217;s blog</a>, first few posts on F#.  Looking forward to future posts.</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+Another+Convert+%E2%80%93+Robert+Beheiter+http://bit.ly/82bKeD" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2010/01/19/another-convert-robert-beheiter/&amp;title=Another+Convert+%E2%80%93+Robert+Beheiter" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2010/01/19/another-convert-robert-beheiter/&amp;t=Another+Convert+%E2%80%93+Robert+Beheiter" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2010/01/19/another-convert-robert-beheiter/&amp;title=Another+Convert+%E2%80%93+Robert+Beheiter" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/jrqXti3pQCo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2010/01/19/another-convert-robert-beheiter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2010/01/19/another-convert-robert-beheiter/</feedburner:origLink></item>
		<item>
		<title>Can you beat my remote work setup?</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/Vfhekwrk7nc/</link>
		<comments>http://blog.brianhartsock.com/2010/01/09/can-you-beat-my-remote-work-setup/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 21:21:53 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Hardware]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1291</guid>
		<description><![CDATA[I travel every now and again with work.  When I do, I tend to take a fairly large bookbag with way too much electronic equipment.  Check out my setup last time I was in the Jungle Disk Atlanta office.

   ]]></description>
			<content:encoded><![CDATA[<p>I travel every now and again with work.  When I do, I tend to take a fairly large bookbag with way too much electronic equipment.  Check out my setup last time I was in the <a href="http://www.jungledisk.com/">Jungle Disk</a> Atlanta office.<br />
<a href="http://blog.brianhartsock.com/wp-content/uploads/2010/01/DSC00288-1024x768.jpg"><img src="http://blog.brianhartsock.com/wp-content/uploads/2010/01/DSC00288-1024x768-300x225.jpg" alt="" title="DSC00288 (1024x768)" width="300" height="225" class="aligncenter size-medium wp-image-1293" /></a><a href="http://blog.brianhartsock.com/wp-content/uploads/2010/01/DSC00287-1024x768.jpg"><img src="http://blog.brianhartsock.com/wp-content/uploads/2010/01/DSC00287-1024x768-300x225.jpg" alt="" title="DSC00287 (1024x768)" width="300" height="225" class="aligncenter size-medium wp-image-1292" /></a></p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+Can+you+beat+my+remote+work+setup%3F+http://bit.ly/4Lhd6q" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2010/01/09/can-you-beat-my-remote-work-setup/&amp;title=Can+you+beat+my+remote+work+setup%3F" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2010/01/09/can-you-beat-my-remote-work-setup/&amp;t=Can+you+beat+my+remote+work+setup%3F" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2010/01/09/can-you-beat-my-remote-work-setup/&amp;title=Can+you+beat+my+remote+work+setup%3F" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/Vfhekwrk7nc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2010/01/09/can-you-beat-my-remote-work-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2010/01/09/can-you-beat-my-remote-work-setup/</feedburner:origLink></item>
		<item>
		<title>Three types of Defects</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/R2yqjVEXiYQ/</link>
		<comments>http://blog.brianhartsock.com/2010/01/05/three-types-of-defects/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 15:24:54 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1278</guid>
		<description><![CDATA[Since the first piece of computer software was created, there have been defects.  We have came a long way since those days, but defects are still prevalent throughout every application.  They are reported by testers or end users, and eventually make their way back to the software developers that created them.  Or [...]]]></description>
			<content:encoded><![CDATA[<p>Since the first piece of computer software was created, there have been defects.  We have came a long way since those days, but defects are still prevalent throughout every application.  They are reported by testers or end users, and eventually make their way back to the software developers that created them.  Or did they?</p>
<p>One thing I have observed over the past few years is the fact that almost all defects make their way back to software developers, but developers aren&#8217;t always the culprits.  To make sense of this, you can categorize types of defects.  I have noticed there are three different types of defects that seem quite common, <strong>Functional</strong>, <strong>Procedural</strong>, and <strong>Conceptual</strong>.</p>
<p><strong>Functional </strong>defects are traditional bugs.  <em>I do XYZ, expect A but get B</em>.  Software developers are the culprit, and the right person to be fixing the defect (and hopefully using automated testing to prevent it from ever happening again).</p>
<p><strong>Procedural </strong>defects stem from bad processes, which may look very similar to <em>I do XYZ, expect A but get B</em>.  The reason they got B instead of A is rooted in the fact that a process wasn&#8217;t followed.  For example, a new feature is introduced that changes how a user creates a widget.  The documentation is never updated however, because the sticky note fell off the task board.  Oops!  To the user, this is a defect, but in all reality, the root cause a process problem.</p>
<p><strong>Conceptual</strong> defects are the nastiest ones.  These are the defects that stem from requirements, usability, or just bad features.  Often parts of an application need to be rethought, removed, and vastly improved to resolve these issues.  What do these issues look like?</p>
<blockquote><p>
A user can&#8217;t create a new widget.  They can&#8217;t create the new widget because they haven&#8217;t met all the criteria to create new widget (but the criteria isn&#8217;t easily understood).
</p></blockquote>
<p>Why is it important to understand these categories?  Because software developers can only really solve functional defects, but they often deal with procedural or conceptual defects daily.  Being a software development manager, I see this all the time.</p>
<p><strong>Functional</strong> defacts fall on the software developers.</p>
<p><strong>Procedural</strong> defects fall on whoever is playing the role of <strong>project manage</strong>r for a team.  </p>
<p><strong>Conceptual</strong> defects fall on whoever is playing the role of <strong>product owner/manager</strong> for the team.</p>
<p>It is important to have a system in place that can handle all types of defects, not just functional.  Otherwise frustration will set in on your developers.</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+Three+types+of+Defects+http://bit.ly/8ae1S6" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2010/01/05/three-types-of-defects/&amp;title=Three+types+of+Defects" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2010/01/05/three-types-of-defects/&amp;t=Three+types+of+Defects" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2010/01/05/three-types-of-defects/&amp;title=Three+types+of+Defects" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/R2yqjVEXiYQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2010/01/05/three-types-of-defects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2010/01/05/three-types-of-defects/</feedburner:origLink></item>
		<item>
		<title>Analyzing Visual Studio Build Performance</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/bA-Y34v0160/</link>
		<comments>http://blog.brianhartsock.com/2009/12/22/analyzing-visual-studio-build-performance/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 00:59:10 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[MSBuild]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1263</guid>
		<description><![CDATA[Every now and again, your build time gets so long you have to investigate what the cause is.  Since Visual Studio uses MSBuild, it is possible to get very detailed build information.
The first step is getting into diagnostic mode.  This will print out way too much information, but it is the only mode [...]]]></description>
			<content:encoded><![CDATA[<p>Every now and again, your build time gets so long you have to investigate what the cause is.  Since Visual Studio uses MSBuild, it is possible to get very detailed build information.</p>
<p>The first step is getting into diagnostic mode.  This will print out way too much information, but it is the only mode that prints out execution summaries for each project.  To get into diagnostics mode, simply go to <em>Tools -> Options -> Projects and Solutions -> Build and Run</em>.  From there, you can change the MSBuild verbosity to diagnostic.</p>
<p><a href="http://blog.brianhartsock.com/wp-content/uploads/2009/12/12-22-2009-7-44-06-PM.png"><img src="http://blog.brianhartsock.com/wp-content/uploads/2009/12/12-22-2009-7-44-06-PM-254x300.png" alt="12-22-2009 7-44-06 PM" title="12-22-2009 7-44-06 PM" width="254" height="300" class="aligncenter size-medium wp-image-1264" /></a><br />
<a href="http://blog.brianhartsock.com/wp-content/uploads/2009/12/12-22-2009-7-45-08-PM.png"><img src="http://blog.brianhartsock.com/wp-content/uploads/2009/12/12-22-2009-7-45-08-PM-300x171.png" alt="12-22-2009 7-45-08 PM" title="12-22-2009 7-45-08 PM" width="300" height="171" class="aligncenter size-medium wp-image-1265" /></a></p>
<p>Now just build (or rebuild).  Then copy the build output to a txt file and save it somewhere.</p>
<p><a href="http://blog.brianhartsock.com/wp-content/uploads/2009/12/12-22-2009-7-50-52-PM.png"><img src="http://blog.brianhartsock.com/wp-content/uploads/2009/12/12-22-2009-7-50-52-PM-300x140.png" alt="12-22-2009 7-50-52 PM" title="12-22-2009 7-50-52 PM" width="300" height="140" class="aligncenter size-medium wp-image-1268" /></a></p>
<p>The only problem with the output is the amount of information (300K lines on a rebuild of a medium size project).  It has ton&#8217;s of valuable information, but an easy way to process it is needed.  The biggest value, in my opinion, is the section at the end of every project where the <em>Summary</em> information about projects, targets, and tasks are displayed.  To help retrieve this info, I wrote a quick little Powershell script.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">&nbsp;
param
<span style="color: #7a0874; font-weight: bold;">&#40;</span>
    <span style="color: #7a0874; font-weight: bold;">&#91;</span>string<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #007800;">$file</span> = <span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>test-path <span style="color: #007800;">$file</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
    throw <span style="color: #ff0000;">&quot;<span style="color: #007800;">$file</span> not found&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> accumulate_and_print_project_info<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
    begin<span style="color: #7a0874; font-weight: bold;">&#123;</span>
        <span style="color: #007800;">$curr_project</span> = <span style="color: #ff0000;">&quot;&quot;</span>
        <span style="color: #007800;">$should_print</span> = <span style="color: #007800;">$false</span>
    <span style="color: #7a0874; font-weight: bold;">&#125;</span>
    process<span style="color: #7a0874; font-weight: bold;">&#123;</span>
&nbsp;
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$_</span> <span style="color: #660033;">-match</span> <span style="color: #ff0000;">&quot;----- (re)?build (all )?started: project: (.*) -----&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
            <span style="color: #007800;">$curr_project</span> = <span style="color: #007800;">$matches</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
            <span style="color: #ff0000;">&quot;----- <span style="color: #007800;">$curr_project</span> -----&quot;</span>
            <span style="color: #007800;">$should_print</span> = <span style="color: #007800;">$false</span>
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>elseif<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$curr_project</span> <span style="color: #660033;">-and</span> <span style="color: #000000; font-weight: bold;">!</span><span style="color: #007800;">$should_print</span> <span style="color: #660033;">-and</span> <span style="color: #007800;">$_</span>.EndsWith<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;Summary:&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
            <span style="color: #007800;">$_</span>
            <span style="color: #007800;">$should_print</span> = <span style="color: #007800;">$true</span>
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>elseif<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$curr_project</span> <span style="color: #660033;">-and</span> <span style="color: #007800;">$should_print</span> <span style="color: #660033;">-and</span> <span style="color: #007800;">$_</span> <span style="color: #660033;">-eq</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
            <span style="color: #007800;">$should_print</span> = <span style="color: #007800;">$false</span>
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>elseif<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$should_print</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
            <span style="color: #007800;">$_</span>
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
    <span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">gc</span> <span style="color: #007800;">$file</span> <span style="color: #000000; font-weight: bold;">|</span> accumulate_and_print_project_info</pre></div></div>

<p>The output is going to look something like the following.</p>
<pre>
----- ControlPanel, Configuration: Development Any CPU -----
Project Performance Summary:
     2672 ms  C:\Users\brian.hartsock\Documents\Visual Studio 2008\Projects\Api\cp3\ControlPanel\ControlPanel.csproj   1 calls
Target Performance Summary:
        0 ms  CreateSatelliteAssemblies                  1 calls
        0 ms  _ComputeNonExistentFileProperty            1 calls
        0 ms  Clean                                      1 calls
        0 ms  _AfterCompileWinFXInternal                 1 calls
        0 ms  BeforeCompile                              1 calls
        0 ms  BeforeClean                                1 calls
        0 ms  AfterBuild                                 1 calls
        0 ms  GetTargetPath                              1 calls
        0 ms  _CheckForCompileOutputs                    1 calls
        0 ms  EntityDeploy                               1 calls
        0 ms  ResolveVCProjectReferences                 1 calls
        0 ms  _SetEmbeddedWin32ManifestProperties        1 calls
        0 ms  StyleCopForceFullAnalysis                  1 calls
        0 ms  CleanPublishFolder                         1 calls
        0 ms  BeforeBuild                                1 calls
        0 ms  CoreResGen                                 1 calls
        0 ms  BeforeRebuild                              1 calls
        0 ms  _CopySourceItemsToOutputDirectory          1 calls
        0 ms  AfterResGen                                1 calls
        0 ms  Build                                      1 calls
        0 ms  SetWin32ManifestProperties                 1 calls
        0 ms  AssignTargetPaths                          1 calls
        0 ms  CoreBuild                                  1 calls
        0 ms  AfterResolveReferences                     1 calls
        0 ms  Compile                                    1 calls
        0 ms  ResGen                                     1 calls
        0 ms  AfterClean                                 1 calls
        0 ms  Rebuild                                    1 calls
        0 ms  PrepareResourceNames                       1 calls
        0 ms  BuildOnlySettings                          1 calls
        0 ms  PrepareResources                           1 calls
        0 ms  CleanReferencedProjects                    1 calls
        0 ms  AfterMarkupCompilePass1                    1 calls
        0 ms  FileClassification                         1 calls
        0 ms  AfterCompile                               1 calls
        0 ms  CompileRdlFiles                            1 calls
        0 ms  BeforeResolveReferences                    1 calls
        0 ms  CreateCustomManifestResourceNames          1 calls
        0 ms  ResolveReferences                          1 calls
        0 ms  DesignTimeMarkupCompilation                1 calls
        0 ms  AfterRebuild                               1 calls
        0 ms  GetReferenceAssemblyPaths                  1 calls
        0 ms  PrepareForRun                              1 calls
        0 ms  AfterCompileWinFX                          1 calls
        0 ms  BeforeResGen                               1 calls
        1 ms  PrepareRdlFiles                            1 calls
        1 ms  GetCopyToOutputDirectoryItems              1 calls
        1 ms  SplitResourcesByCulture                    1 calls
        1 ms  _SplitProjectReferencesByFileExistence     1 calls
        1 ms  _GenerateCompileInputs                     1 calls
        1 ms  _GenerateSatelliteAssemblyInputs           1 calls
        1 ms  GetWinFXPath                               1 calls
        1 ms  EntityClean                                1 calls
        1 ms  _CheckForInvalidConfigurationAndPlatform   1 calls
        1 ms  ResolveProjectReferences                   1 calls
        1 ms  PrepareForBuild                            1 calls
        3 ms  GetFrameworkPaths                          1 calls
        8 ms  CoreClean                                  1 calls
       14 ms  IncrementalClean                           1 calls
       17 ms  CopyFilesToOutputDirectory                 1 calls
       17 ms  _CleanGetCurrentAndPriorFileWrites         1 calls
       66 ms  ResolveAssemblyReferences                  1 calls
      399 ms  _CopyFilesMarkedCopyLocal                  1 calls
      519 ms  StyleCop                                   1 calls
      636 ms  CoreCompile                                1 calls
      974 ms  PostBuildEvent                             1 calls
Task Performance Summary:
        0 ms  Delete                                     2 calls
        0 ms  Message                                    6 calls
        0 ms  EntityDeploy                               1 calls
        0 ms  GetFrameworkSdkPath                        1 calls
        0 ms  CreateProperty                             1 calls
        0 ms  AssignTargetPath                           5 calls
        0 ms  MakeDir                                    2 calls
        1 ms  ConvertToAbsolutePath                      1 calls
        1 ms  AssignCulture                              1 calls
        1 ms  GetWinFXPath                               1 calls
        1 ms  FindAppConfigFile                          1 calls
        1 ms  ReadLinesFromFile                          2 calls
        1 ms  EntityClean                                1 calls
        2 ms  CreateItem                                 3 calls
        2 ms  WriteLinesToFile                           2 calls
        3 ms  GetFrameworkPath                           2 calls
       13 ms  RemoveDuplicates                           3 calls
       20 ms  FindUnderPath                              7 calls
       66 ms  ResolveAssemblyReference                   1 calls
      415 ms  Copy                                       6 calls
      515 ms  StyleCopTask                               1 calls
      635 ms  Csc                                        1 calls
      973 ms  Exec                                       1 calls
</pre>
<p>Now you should have all the data you need to figure out what is taking so long to build your project.</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+Analyzing+Visual+Studio+Build+Performance+http://bit.ly/5Zr9Ha" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2009/12/22/analyzing-visual-studio-build-performance/&amp;title=Analyzing+Visual+Studio+Build+Performance" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2009/12/22/analyzing-visual-studio-build-performance/&amp;t=Analyzing+Visual+Studio+Build+Performance" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2009/12/22/analyzing-visual-studio-build-performance/&amp;title=Analyzing+Visual+Studio+Build+Performance" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/bA-Y34v0160" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2009/12/22/analyzing-visual-studio-build-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2009/12/22/analyzing-visual-studio-build-performance/</feedburner:origLink></item>
		<item>
		<title>NHibernate Connection Release Modes</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/9Ym7l4IfVsg/</link>
		<comments>http://blog.brianhartsock.com/2009/12/17/nhibernate-connection-release-modes/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 15:10:15 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[NHibernate]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1252</guid>
		<description><![CDATA[Some team members and I spent the better part of a few hours today researching a really weird bug we were seeing with our data access code built on NHibernate.
The basic symptoms were a duplicate key violation on a unique column in a table.  This only happened under decent load, so reproducing in dev [...]]]></description>
			<content:encoded><![CDATA[<p>Some team members and I spent the better part of a few hours today researching a really weird bug we were seeing with our data access code built on NHibernate.</p>
<p>The basic symptoms were a duplicate key violation on a unique column in a table.  This only happened under decent load, so reproducing in dev was pretty hard.  To make matters more interested, it only happened with NHibernate 2.0.  We started looking at MySQL logs and saw the following.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #66cc66;">&#40;</span>value<span style="color: #66cc66;">,</span> unique_value<span style="color: #66cc66;">&#41;</span> some_table <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'some_value'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'some_unique_value'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">-- Auto-increment ID column gets set to 10</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> LAST_INSERT_ID<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">-- Returns 9</span>
<span style="color: #993333; font-weight: bold;">UPDATE</span> unique_value<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'some_unique_value'</span> <span style="color: #993333; font-weight: bold;">AND</span> value<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'other_value'</span> <span style="color: #993333; font-weight: bold;">WHERE</span> id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">9</span>
<span style="color: #808080; font-style: italic;">-- Duplicate key exception because unique constraint is violated</span></pre></div></div>

<p>Yes, <em>SELECT LAST_INSERT_ID()</em> was returning the wrong value.  After digging through the NHibernate source code, it became pretty apparent what was happening.  We weren&#8217;t using transactions (because the DB is MyISAM) and we found the following code.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// (Some ConnectionManager code)</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> AfterTransaction<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>IsAfterTransactionRelease<span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		AggressiveRelease<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
	<span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>IsAggressiveRelease <span style="color: #008000;">&amp;&amp;</span> batcher.<span style="color: #0000FF;">HasOpenResources</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		log.<span style="color: #0000FF;">Info</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;forcing batcher resource cleanup on transaction completion; forgot to close ScrollableResults/Enumerable?&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		batcher.<span style="color: #0000FF;">CloseCommands</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		AggressiveRelease<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
	<span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>IsOnCloseRelease<span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #008080; font-style: italic;">// log a message about potential connection leaks</span>
		log.<span style="color: #0000FF;">Debug</span><span style="color: #000000;">&#40;</span>
			<span style="color: #666666;">&quot;transaction completed on session with on_close connection release mode; be sure to close the session to release ADO.Net resources!&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
	transaction <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">private</span> <span style="color: #FF0000;">bool</span> IsAggressiveRelease
<span style="color: #000000;">&#123;</span>
	get
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>connectionReleaseMode <span style="color: #008000;">==</span> ConnectionReleaseMode.<span style="color: #0000FF;">AfterTransaction</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0600FF;">return</span> <span style="color: #008000;">!</span>IsInActiveTransaction<span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
		<span style="color: #0600FF;">return</span> false<span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//Some AbstractSessionImpl code</span>
&nbsp;
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">void</span> AfterOperation<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">bool</span> success<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> SessionIdLoggingContext<span style="color: #000000;">&#40;</span>SessionId<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>ConnectionManager.<span style="color: #0000FF;">IsInActiveTransaction</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			ConnectionManager.<span style="color: #0000FF;">AfterNonTransactionalQuery</span><span style="color: #000000;">&#40;</span>success<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//And finally the AdoTransaction code</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> IsActive
<span style="color: #000000;">&#123;</span>
	get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> begun <span style="color: #008000;">&amp;&amp;</span> <span style="color: #008000;">!</span>rolledBack <span style="color: #008000;">&amp;&amp;</span> <span style="color: #008000;">!</span>committed<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Basically, NHibernate will quasi-create an implicit transaction if it isn&#8217;t explicitly created.  What&#8217;s weird is the scope of the transaction is just a single query.  As you can see in the above code, I never called <em>BeginTransaction()</em> so <em>tx.IsActive</em> returns false, which indirectly makes the <em>AbstractSessionImpl</em> class think the transaction is over, which in turn indirectly triggers the <em>ConnectionManager</em> code to release the connection if the <em>ConnectionReleaseMode</em> is set to after transaction (which it is by default).</p>
<p>Whew!</p>
<p>Some outstanding questions though are why did this start happening with 2.0 and not 1.2?  My guess is some code was refactored with how the last insert ID is retrieved, and in 1.2 it was impossible for it to have different connections.  With 2.0, it is pretty easy to have different connection objects if concurrent operations are occurring.</p>
<p>Read more on <em>ConnectionReleaseMode</em>&#8217;s <a                                      href="http://nhforge.org/doc/nh/en/index.html#transactions-connection-release">here</a>.  </p>
<p>(I hope this post made sense as I am super tired and have been learning NHibernate source code rapidly for the past few hours)</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+NHibernate+Connection+Release+Modes+http://bit.ly/8F4MUe" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2009/12/17/nhibernate-connection-release-modes/&amp;title=NHibernate+Connection+Release+Modes" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2009/12/17/nhibernate-connection-release-modes/&amp;t=NHibernate+Connection+Release+Modes" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2009/12/17/nhibernate-connection-release-modes/&amp;title=NHibernate+Connection+Release+Modes" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/9Ym7l4IfVsg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2009/12/17/nhibernate-connection-release-modes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2009/12/17/nhibernate-connection-release-modes/</feedburner:origLink></item>
		<item>
		<title>Find Orphaned Solution Files</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/Qujx0nTshQI/</link>
		<comments>http://blog.brianhartsock.com/2009/12/07/find-orphaned-solution-files/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 15:38:42 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1248</guid>
		<description><![CDATA[Each day, I am becoming more and more OCD.  Tonight I wrote a script that will analyze a Visual Studio csproj file and compare it to the files in the directory.  The main goal being an easy way to find orphaned files that might still be in version control.  It probably only [...]]]></description>
			<content:encoded><![CDATA[<p>Each day, I am becoming more and more OCD.  Tonight I wrote a script that will analyze a Visual Studio <em>csproj</em> file and compare it to the files in the directory.  The main goal being an easy way to find orphaned files that might still be in version control.  It probably only works on very vanilla projects, but I figured I would share anyways.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># find-orphanedFiles.ps1</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Compare files in a Visual Studio project file to the actual files in the directory</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Usage:</span>
<span style="color: #666666; font-style: italic;"># .\find-orphanedFiles.ps1 Project\FooBar.csproj</span>
<span style="color: #666666; font-style: italic;"># .\find-orphanedFiles.ps1 Project\FooBar.csproj -exclude &quot;*.csproj&quot;,&quot;*.csproj.user&quot;,&quot;svn.ignore&quot;</span>
&nbsp;
param
<span style="color: #7a0874; font-weight: bold;">&#40;</span>
    <span style="color: #007800;">$csProjFile</span>,
    <span style="color: #007800;">$exclude</span> = <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;*.csproj*&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> custom-gci<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$path</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span>get-location<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
    gci <span style="color: #007800;">$path</span> <span style="color: #660033;">-exclude</span> <span style="color: #007800;">$exclude</span> <span style="color: #000000; font-weight: bold;">|</span> 
    <span style="color: #000000; font-weight: bold;">%</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$_</span>.PSIsContainer <span style="color: #660033;">-and</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$_</span>.name <span style="color: #660033;">-ne</span> <span style="color: #ff0000;">&quot;bin&quot;</span> <span style="color: #660033;">-and</span> <span style="color: #007800;">$_</span>.name <span style="color: #660033;">-ne</span> <span style="color: #ff0000;">&quot;obj&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
            custom-gci <span style="color: #007800;">$_</span>
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>elseif<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$_</span>.PSIsContainer<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
            <span style="color: #007800;">$_</span>
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
    <span style="color: #7a0874; font-weight: bold;">&#125;</span> 
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>test-path <span style="color: #007800;">$csProjFile</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
    throw <span style="color: #ff0000;">&quot;File <span style="color: #007800;">$csprojFile</span> does not exist&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #007800;">$dir</span> = split-path <span style="color: #007800;">$csProjFile</span>
<span style="color: #007800;">$csProjfile</span> = split-path <span style="color: #007800;">$csProjFile</span> <span style="color: #660033;">-leaf</span>
&nbsp;
push-location <span style="color: #007800;">$dir</span>
&nbsp;
<span style="color: #007800;">$x</span> = <span style="color: #7a0874; font-weight: bold;">&#91;</span>xml<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gc</span> <span style="color: #007800;">$csProjFile</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #007800;">$filesInProject</span> = <span style="color: #007800;">$x</span>.Project.ItemGroup <span style="color: #000000; font-weight: bold;">|</span> 
    foreach <span style="color: #7a0874; font-weight: bold;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$_</span>.Compile<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span> 
            <span style="color: #007800;">$_</span>.Compile
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>elseif<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$_</span>.None<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
            <span style="color: #007800;">$_</span>.None
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>elseif<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$_</span>.Content<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
            <span style="color: #007800;">$_</span>.Content
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>elseif<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$_</span>.EmbeddedResource<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
            <span style="color: #007800;">$_</span>.EmbeddedResource
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
    <span style="color: #7a0874; font-weight: bold;">&#125;</span> <span style="color: #000000; font-weight: bold;">|</span> 
    <span style="color: #000000; font-weight: bold;">select</span> <span style="color: #660033;">-expand</span> include <span style="color: #000000; font-weight: bold;">|</span> 
    resolve-path <span style="color: #000000; font-weight: bold;">|</span> 
    gi <span style="color: #000000; font-weight: bold;">|</span> 
    <span style="color: #000000; font-weight: bold;">select</span> <span style="color: #660033;">-expand</span> fullname
&nbsp;
<span style="color: #007800;">$filesInDir</span> = custom-gci <span style="color: #000000; font-weight: bold;">|</span>
    <span style="color: #000000; font-weight: bold;">select</span> <span style="color: #660033;">-expand</span> fullname
&nbsp;
compare-object <span style="color: #007800;">$filesInProject</span> <span style="color: #007800;">$filesInDir</span>
&nbsp;
pop-location</pre></div></div>

<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+Find+Orphaned+Solution+Files+http://bit.ly/5qDdPL" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2009/12/07/find-orphaned-solution-files/&amp;title=Find+Orphaned+Solution+Files" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2009/12/07/find-orphaned-solution-files/&amp;t=Find+Orphaned+Solution+Files" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2009/12/07/find-orphaned-solution-files/&amp;title=Find+Orphaned+Solution+Files" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/Qujx0nTshQI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2009/12/07/find-orphaned-solution-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2009/12/07/find-orphaned-solution-files/</feedburner:origLink></item>
		<item>
		<title>Are you in the Cloud yet?</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/-rPJ7Wde048/</link>
		<comments>http://blog.brianhartsock.com/2009/12/03/are-you-in-the-cloud-yet/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 04:15:08 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cloud Computing]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1237</guid>
		<description><![CDATA[Sometimes I forget that cloud computing is still fairly new.  There are still thousands of companies runnings their own servers and software.  A couple weeks ago, in San Francisco, I saw something that caught my eye.

Seeing a SalesForce ad didn&#8217;t surprise me.  What amazed me was it was on a bus stop. [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes I forget that cloud computing is still fairly new.  There are still thousands of companies runnings their own servers and software.  A couple weeks ago, in San Francisco, I saw something that caught my eye.</p>
<p><a href="http://blog.brianhartsock.com/wp-content/uploads/2009/12/DSC00489-600x800.jpg"><img src="http://blog.brianhartsock.com/wp-content/uploads/2009/12/DSC00489-600x800-225x300.jpg" alt="DSC00489 (600x800)" title="DSC00489 (600x800)" width="225" height="300" class="aligncenter size-medium wp-image-1238" /></a></p>
<p>Seeing a <a href="http://www.salesforce.com/">SalesForce</a> ad didn&#8217;t surprise me.  What amazed me was it was on a bus stop.  Not a big billboard (although I am sure they have those too), but a dingy little bus stop.  The audience SalesForce is targeting is the masses, not a niche group of early adopters.  This speaks volumes for the potential they see in software as a service.</p>
<p>Are you in the cloud yet?</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+Are+you+in+the+Cloud+yet%3F+http://bit.ly/54Q375" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2009/12/03/are-you-in-the-cloud-yet/&amp;title=Are+you+in+the+Cloud+yet%3F" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2009/12/03/are-you-in-the-cloud-yet/&amp;t=Are+you+in+the+Cloud+yet%3F" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2009/12/03/are-you-in-the-cloud-yet/&amp;title=Are+you+in+the+Cloud+yet%3F" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/-rPJ7Wde048" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2009/12/03/are-you-in-the-cloud-yet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2009/12/03/are-you-in-the-cloud-yet/</feedburner:origLink></item>
		<item>
		<title>Don Norman – Ten Rules for Successful Products</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/j6OwbRXy-yg/</link>
		<comments>http://blog.brianhartsock.com/2009/12/02/don-norman-ten-rules-for-successful-products/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 15:19:50 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Business of Software]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1080</guid>
		<description><![CDATA[Don is #2 on my list of speakers from Business of Software 2009.  Don forces you to understand how people are using your product.  It sounds simple, but most companies have a different outlook on their product than their customers.  Here are his 10 rules for successful products.
Everything is a product.  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.brianhartsock.com/wp-content/uploads/2009/11/DSC00309-800x600.jpg"><img src="http://blog.brianhartsock.com/wp-content/uploads/2009/11/DSC00309-800x600-300x225.jpg" alt="DSC00309 (800x600)" title="DSC00309 (800x600)" width="300" height="225" class="alignright size-medium wp-image-1226" /></a>Don is #2 on my list of speakers from <a href="http://www.businessofsoftware.org/">Business of Software</a> 2009.  Don forces you to understand how people are using your product.  It sounds simple, but most companies have a different outlook on their product than their customers.  Here are his 10 rules for successful products.</p>
<p><strong>Everything is a product.  Everything is a service</strong>.  You can&#8217;t have one without the other.  The software you create is a product, but the experience you provide is your service.  Don&#8217;t forget about one of these principles while focusing on the other.</p>
<p><strong>Don&#8217;t be too logical</strong>.  This might be the downfall of 99% of all developers.  We are wired to think about the logical steps to perform an action, but users have emotion which plays the major role in their decisions.  Usability testing is the best way to truly see how someone will use your product.</p>
<p><strong>Design systems</strong>.  Think about the iPod + iTunes + Add-ons or Kindle + Amazon + Verizon.  This goes back to the above.  Think about the entire service your product is providing, not just the functionality the product contains.  A complete system solves the entirety of a customers problem.  If you only solve a small portion of their problem, the experience is going to be lacking.</p>
<p></a>The other main points, which I think are fairly self explanatory.</p>
<ul>
<li>It&#8217;s all about the experience</li>
<li>Memory is more important than actuality &#8211; Make the beginning and ending memorable</li>
<li>Complexity is good, Complicated is bad</li>
<li>Design for the real world.</li>
<li>Design for the people.</li>
<li>It&#8217;s all about the experience</li>
</ul>
<p>Check out <a href="http://www.amazon.com/s/ref=ntt_athr_dp_sr_1?_encoding=UTF8&#038;sort=relevancerank&#038;search-alias=books&#038;field-author=Donald%20Norman">Don&#8217;s books</a> if you want to hear more.</p>
<p><a href="http://blog.brianhartsock.com/wp-content/uploads/2009/11/DSC00310-800x600.jpg"><img src="http://blog.brianhartsock.com/wp-content/uploads/2009/11/DSC00310-800x600-300x225.jpg" alt="DSC00310 (800x600)" title="DSC00310 (800x600)" width="300" height="225" class="alignleft size-medium wp-image-1227" /></p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+Don+Norman+%E2%80%93+Ten+Rules+for+Successful+Products+http://bit.ly/7bXqzQ" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2009/12/02/don-norman-ten-rules-for-successful-products/&amp;title=Don+Norman+%E2%80%93+Ten+Rules+for+Successful+Products" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2009/12/02/don-norman-ten-rules-for-successful-products/&amp;t=Don+Norman+%E2%80%93+Ten+Rules+for+Successful+Products" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2009/12/02/don-norman-ten-rules-for-successful-products/&amp;title=Don+Norman+%E2%80%93+Ten+Rules+for+Successful+Products" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/j6OwbRXy-yg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2009/12/02/don-norman-ten-rules-for-successful-products/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2009/12/02/don-norman-ten-rules-for-successful-products/</feedburner:origLink></item>
		<item>
		<title>iDoes Droid Review</title>
		<link>http://feedproxy.google.com/~r/BrianHartsocksBlog/~3/206hD37fn-g/</link>
		<comments>http://blog.brianhartsock.com/2009/12/01/idoes-droid-review/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 17:43:08 +0000</pubDate>
		<dc:creator>bhartsock</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Droid]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://blog.brianhartsock.com/?p=1189</guid>
		<description><![CDATA[I spent the Thanksgiving holiday watching my dad play around with his new Droid.  To my surprise, he was kind enough to let my try it out while he slept off Thanksgiving goodness.  In short, it is Way Ugly, Blazing Fast, and  Surprisingly Fun.  It won&#8217;t dethrone the iPhone, but I [...]]]></description>
			<content:encoded><![CDATA[<p>I spent the Thanksgiving holiday watching my dad play around with his new <a href="http://phones.verizonwireless.com/motorola/droid/#/home">Droid</a>.  To my surprise, he was kind enough to let my try it out while he slept off Thanksgiving goodness.  In short, it is <strong>Way Ugly</strong>, <strong>Blazing Fast</strong>, and <strong> Surprisingly Fun</strong>.  It won&#8217;t dethrone the iPhone, but I think Google is onto something if they can fix a few shortcomings.</p>
<h4>Way Ugly</h4>
<p><img src="http://blog.brianhartsock.com/wp-content/uploads/2009/11/motorola-droid-verizon_01-300x217.jpg" alt="motorola-droid-verizon_01" title="motorola-droid-verizon_01" width="300" height="217" class="alignleft size-medium wp-image-1197" />The aesthetics of the physical device and the OS itself was quite disappointing.  It is a big rectangle, and rectangles went out with Zach Morris.  It is on the large side, heavy, and gets fairly hot.  Even though it brags about a QWERTY keyboard, I bet you won&#8217;t use it, I didn&#8217;t.  The buttons are in cumbersome locations, and it is easy to accidentally hit one while doing other tasks (like swinging a Schwartz Saber).  These are all minor, but compared to the iPhone they are big differences.</p>
<p>As for the software, there seems to be very little unifying UI traits, unlike the iPhone.  Every app looks, feels, and behaves differently.  And since it is open to everyone to build on, I don&#8217;t see this changing.  It is definitely a step backward in UI design, whereas Apple is the opposite.</p>
<h4>Blazing fast</h4>
<p>My dad told me the Droid was faster than his laptop at browsing the internet.  I laughed.  Then I actually played with the Droid and realized he wasn&#8217;t that far off (his laptop is pretty old anyways).  Verizon&#8217;s 3G is fast and ubiquitous (unlike AT&#038;T).  Not to mention the Droid hardware performs very well.  After a few hours of perusing, I realized slowness wasn&#8217;t an issue, especially compared to my BlackBerry.  Even though the iPhone <a href="http://www.youtube.com/watch?v=ZXufjYsYErk&#038;feature=player_embedded">slightly out performs it</a>, I have no doubt Android phones will continue to push the envelop on speed.</p>
<h4>Surprisingly Fun</h4>
<p>The overall experience was good with the Droid, even though the aesthetics were lacking.  It had all the functionality I would need, plus a lot more.  The device is easy to use, which is a big plus (my dad hasn&#8217;t asked me once how to do something). </p>
<p>Let&#8217;s not forget the Android platform.  I didn&#8217;t have to pay a dime <a href="http://developer.apple.com/iphone/program/">(unlike iPhone)</a> to create an app that I could sell on the Android market, without the pain of going through the iPhone Apps process.  This is an awesome plus for the techie world.</p>
<p>Would I buy the Droid if I needed a phone?  Absolutely.  I have a BlackBerry which works great for email, but lacks <em>fun</em>.  Also, I am not an Apple fanboy (I have a Zune HD), so I would get it over the iPhone too.</p>
<h4>The bottom line?</h4>
<p>Microsoft should be scared.  They need something huge with <a href="http://en.wikipedia.org/wiki/Windows_Mobile#Windows_Mobile_7">Windows Mobile 7</a>, otherwise they will end up being last in the <a href="http://en.wikipedia.org/wiki/Smartphone#Operating_systems">mobile device market</a>.  The Droid could easily surpass any Windows Mobile device I have ever seen.</p>
<p>BlackBerry&#8217;s still meets the business users needs best, but I think this will slowly erode unless they improve the web experience and build a better/easier platform to develop on.</p>
<p>iPhone has nothing to worry about for now.  If they just keep innovating, the Android won&#8217;t pass them unless Google gets serious about its mobile involvement.  Their only concern should be AT&#038;T and will their network support future innovation.</p>
<p align="left"><a target="_blank" class="tt" href="http://twitter.com/home/?status=@brianhartsock+iDoes+Droid+Review+http://bit.ly/7Jjz7p" title="Post to Twitter"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro3.png" alt="Post to Twitter" /></a> <a target="_blank" class="tt" href="http://digg.com/submit?url=http://blog.brianhartsock.com/2009/12/01/idoes-droid-review/&amp;title=iDoes+Droid+Review" title="Post to Digg"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-digg-micro3.png" alt="Post to Digg" /></a> <a target="_blank" class="tt" href="http://www.facebook.com/share.php?u=http://blog.brianhartsock.com/2009/12/01/idoes-droid-review/&amp;t=iDoes+Droid+Review" title="Post to Facebook"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-facebook-micro3.png" alt="Post to Facebook" /></a> <a target="_blank" class="tt" href="http://reddit.com/submit?url=http://blog.brianhartsock.com/2009/12/01/idoes-droid-review/&amp;title=iDoes+Droid+Review" title="Post to Reddit"><img class="nothumb" src="http://blog.brianhartsock.com/wp-content/plugins/tweet-this/icons/tt-reddit-micro3.png" alt="Post to Reddit" /></a></p><img src="http://feeds.feedburner.com/~r/BrianHartsocksBlog/~4/206hD37fn-g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.brianhartsock.com/2009/12/01/idoes-droid-review/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.brianhartsock.com/2009/12/01/idoes-droid-review/</feedburner:origLink></item>
	</channel>
</rss>
