<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>JohnnyCoder</title>
	
	<link>http://johnnycoder.com/blog</link>
	<description />
	<pubDate>Thu, 20 Nov 2008 00:54:09 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/johnnycoder" type="application/rss+xml" /><item>
		<title>Guarding Against Multiple Empty Strings</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/451489340/</link>
		<comments>http://johnnycoder.com/blog/2008/11/12/guarding-against-multiple-empty-strings/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 06:08:42 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Best Practices]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Samples]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/11/12/guarding-against-multiple-empty-strings/</guid>
		<description><![CDATA[Many of my C# methods include what is referred to as a guard clause.&#160; It isn&#8217;t a complicated concept.&#160; Simply the first few statements of a routine validates passed-in parameters and/or state of the object and immediately returns an error or gracefully exits to the function is constraints aren&#8217;t met.&#160; If I&#8217;m not mistaken, this [...]]]></description>
			<content:encoded><![CDATA[<p>Many of my C# methods include what is referred to as a <a href="http://c2.com/cgi/wiki?GuardClause">guard clause</a>.&nbsp; It isn&#8217;t a complicated concept.&nbsp; Simply the first few statements of a routine validates passed-in parameters and/or state of the object and immediately returns an error or gracefully exits to the function is constraints aren&#8217;t met.&nbsp; If I&#8217;m not mistaken, this plays nicely with the <a href="http://en.wikipedia.org/wiki/Design_by_contract">Design by Contract</a> approach to software design, but I no expect on the subject.&nbsp; The bottom line is, a guard clause can really tighten and clean up your code because it will undoubtedly eliminate any number of nested conditional statements.</p>
<p>Consider the following sample taken directly from <a href="http://c2.com/cgi/wiki?GuardClause">c2.com</a>:</p>
<pre class="code"><span style="color: blue">public </span>Foo merge(Foo a, Foo b)
{
    Foo result;
    <span style="color: blue">if </span>(a != <span style="color: blue">null</span>)
    {
        <span style="color: blue">if </span>(b != <span style="color: blue">null</span>)
        {
            <span style="color: green">// complicated merge code goes here.
        </span>}
        <span style="color: blue">else
        </span>{
            result = a;
        }
    }
    <span style="color: blue">else
    </span>{
        result = b;
    }
    <span style="color: blue">return </span>result;
}
</pre>
<p>Now with the guard clause&#8230;</p>
<pre class="code"><span style="color: blue">public </span>Foo merge(Foo a, Foo b)
{
    <span style="color: blue">if </span>(a == <span style="color: blue">null</span>) <span style="color: blue">return </span>b;
    <span style="color: blue">if </span>(b == <span style="color: blue">null</span>) <span style="color: blue">return </span>a;
    <span style="color: green">// complicated merge code goes here.
</span>}</pre>
<p>Much cleaner, eh? And that&#8217;s only two conditionals! Back to my point.&nbsp; Many of my method include guard clauses.&nbsp; Today I needed to validate that all three string parameters had a value.&nbsp; In other words, each string&#8217;s length was greater than 0. </p>
<p>I started with my faithful Is-Not-Null-Or-Empty check:</p>
<pre class="code"><span style="color: blue">string </span>a = <span style="color: #a31515">"a"</span>;
<span style="color: blue">string </span>b = <span style="color: #a31515">"b"</span>;
<span style="color: blue">string </span>c = <span style="color: #a31515">""</span>;

<span style="color: blue">if </span>(<span style="color: blue">string</span>.IsNullOrEmpty(a) ||
    <span style="color: blue">string</span>.IsNullOrEmpty(b) ||
    <span style="color: blue">string</span>.IsNullOrEmpty(c))
    <span style="color: blue">return</span>;</pre>
<p>But then I settled on this:</p>
<pre class="code"><span style="color: blue">string </span>a = <span style="color: #a31515">"a"</span>;
<span style="color: blue">string </span>b = <span style="color: #a31515">"b"</span>;
<span style="color: blue">string </span>c = <span style="color: #a31515">""</span>;

<span style="color: blue">if </span>(a.Length * b.Length * c.Length == 0) <span style="color: blue">return</span>;</pre>
<p><font color="#000000">What do you think?&nbsp; Pretty hokey, right?</font></p>
<p>&nbsp;</p>
<div class="wlWriterSmartContent" id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:3f97a782-1b95-4fd7-a838-6c2c1c8ca986" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/11/12/guarding-against-multiple-empty-strings/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/11/12/guarding-against-multiple-empty-strings/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=yMOBn"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=yMOBn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=9QaHN"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=9QaHN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=uqkMn"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=uqkMn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=fgGiN"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=fgGiN" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/11/12/guarding-against-multiple-empty-strings/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/11/12/guarding-against-multiple-empty-strings/</feedburner:origLink></item>
		<item>
		<title>Run CMD.exe as Local System Account</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/451489341/</link>
		<comments>http://johnnycoder.com/blog/2008/11/10/run-cmdexe-as-local-system-account/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 05:23:45 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Security]]></category>

		<category><![CDATA[Services]]></category>

		<category><![CDATA[Tools]]></category>

		<category><![CDATA[Vista]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/11/10/run-cmdexe-as-local-system-account/</guid>
		<description><![CDATA[I&#8217;m currently running Vista and I would like to manually complete the same operations as my Windows Service. Since the Windows Service is running under the Local System Account, I would like to emulate this same behavior. Basically, I would like to run CMD.EXE under the Local System Account.&#160; (By the way, it&#8217;s fair to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently running Vista and I would like to manually complete the same operations as my Windows Service. Since the Windows Service is running under the Local System Account, I would like to emulate this same behavior. Basically, I would like to run CMD.EXE under the Local System Account.&nbsp; (By the way, it&#8217;s fair to question why my Windows Service is running with elevated permissions.&nbsp; Generally, it&#8217;s not a good practice, but anyway&#8230;<br />
<h2>Strike 1:</h2>
<p>I found <a href="http://alieneyes.wordpress.com/2006/10/23/how-to-gain-access-to-system-account-the-most-powerful-account-in-windows/">information online</a> which suggests lauching the CMD.exe using the DOS Task Scheduler AT command.&nbsp; Here&#8217;s a sample command:</p>
<p><code>AT 12:00 /interactive cmd.exe</code></p>
<p>I gave it a shot but I received a Vista warning that &#8220;due to security enhancements, this task will run at the time excepted but not interactively.&#8221; </p>
<p>It turns out that this approach will work for XP, 2000 and Server 2003 but due to <a href="http://www.microsoft.com/whdc/system/vista/services.mspx">session 0 isolation</a> Interactive services no longer work on Windows Vista and Windows Server 2008.<code><br /></code><u><br /></u></p>
<h2>Strike 2:</h2>
<p><a href="http://blogs.msdn.com/adioltean/articles/271063.aspx">Another solution</a> suggested creating a secondary Windows Service via the Service Control (sc.exe) which merely launches CMD.exe. </p>
<pre><code>C:\sc create RunCMDAsLSA binpath= "cmd" type=own type=interactC:\sc start RunCMDAsLSA</code></pre>
<p>In this case the service fails to start and results it the following error message: </p>
<p><code>FAILED 1053: The service did not respond to the start or control request in a timely fashion.</p>
<p></code></p>
<h2>Strike 3:</h2>
<p>The third suggestion was to launch CMD.exe via a Scheduled Task. Though you may run scheduled tasks under various accounts, I don&#8217;t believe the Local System Account is one of them. I&#8217;ve tried using the Runas as well, but think I&#8217;m running into the same restriction as found when running a scheduled task.</p>
<h2>Not Out Yet: </h2>
<p>Fortunately, I came across this <a href="http://verbalprocessor.com/2007/12/05/running-a-cmd-prompt-as-local-system">article</a> which demonstrates the use of <a href="http://download.sysinternals.com/Files/PsTools.zip">PSTools</a> from <a href="http://sysinternals.com/">SysInternals</a> which was acquired by Microsoft in July, 2006. I launched the command line and issued the following statement and suddenly I was running under the Local Admin Account like magic:
<pre><code>psexec -i -s cmd.exe</code></pre>
<p>PSTools worked great. It&#8217;s a lightweight, well-documented set of tools which provided an appropriate solution to my problem. </p>
<div class="wlWriterSmartContent" id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:68b51f45-9bd7-4417-9794-541c11f8a8d0" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/11/10/run-cmdexe-as-local-system-account/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/11/10/run-cmdexe-as-local-system-account/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=HoPAn"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=HoPAn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=EvHXN"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=EvHXN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=8hyon"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=8hyon" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=KgosN"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=KgosN" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/11/10/run-cmdexe-as-local-system-account/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/11/10/run-cmdexe-as-local-system-account/</feedburner:origLink></item>
		<item>
		<title>The Thirsty Developer Podcast</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/428715001/</link>
		<comments>http://johnnycoder.com/blog/2008/10/22/the-thirsty-developer/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 16:28:40 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Podcasts]]></category>

		<category><![CDATA[Recommended]]></category>

		<category><![CDATA[Tester]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/10/22/the-thirsty-developer/</guid>
		<description><![CDATA[
I&#8217;ve recommended .NET podcasts before and it&#8217;s time to add a new show to the mix.  This past weekend, I started consuming the backlog of The Thirsty Developer podcast in large quantities and I like it.  I found the majority of the shows to be well-structured, high production quality, informative and entertaining.  But I&#8217;ll let [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://thirstydeveloper.com/images/ThirstyDeveloper_small.png" border="0" alt="" align="right" /></p>
<p>I&#8217;ve <a href="http://johnnycoder.com/blog/2008/08/06/net-podcast-recommendations/">recommended .NET podcasts</a> before and it&#8217;s time to add a new show to the mix.  This past weekend, I started consuming the backlog of <a href="http://thirstydeveloper.com/">The Thirsty Developer</a> podcast in large quantities and I like it.  I found the majority of the shows to be well-structured, high production quality, informative and entertaining.  But I&#8217;ll let you be the judge. </p>
<p>The show is hosted by MS Developer Evangelist, <a href="http://www.davebost.com/blog">Dave Bost</a>, and MS Architect Evangelist, <a href="http://eraserandcrowbar.com/">Larry Clarkin</a>, but don&#8217;t let those Blue Badges scare you away as conversations/interviews aren&#8217;t solely Microsoft-centric.  Topics vary but generally stay within the interests of the typical .NET developer.  Case in point, my two favorite episodes, thus far, are related to SCRUM.  If you are at all interested in this <span style="text-decoration: line-through;">methodology</span> process, you should give them a listen: </p>
<ul>
<li><a href="http://thirstydeveloper.com/2008/03/01/TheThirstyDeveloper14SCRUM.aspx">The Thirsty Developer 14: SCRUM</a></li>
<li><a href="http://thirstydeveloper.com/2008/07/26/TheThirstyDeveloper28SCRUMAndAgileInTheEnterprise.aspx">The Thirsty Developer 28: SCRUM and Agile in the Enterprise</a></li>
</ul>
<p>Again, I find the podcast informative and entertaining. I bet if you like <a href="http://deepfriedbytes.com/ ">Deep Fried Bytes</a>, you&#8217;ll like <a href="http://thirstydeveloper.com/">The Thirsty Developer</a> as well.</p>
<p>Let me know what you think.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=MMudm"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=MMudm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=meQGM"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=meQGM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=kY1Vm"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=kY1Vm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=SeRgM"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=SeRgM" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/10/22/the-thirsty-developer/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/10/22/the-thirsty-developer/</feedburner:origLink></item>
		<item>
		<title>Open VS2008 WebSite Macro</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/426643111/</link>
		<comments>http://johnnycoder.com/blog/2008/10/20/open-vs2008-website-from-windows-explorer/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 17:56:20 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Tip and Tricks]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/10/20/open-vs2008-website-from-windows-explorer/</guid>
		<description><![CDATA[Visual Studio 2008 allows one to open an existing website by navigating File &#62; Open &#62; WebSite.&#160; Alternatively, one may also use the following shortcut: Shift + ALT + O.&#160; 
But let&#8217;s say you would like to open a website by a right-click folder option. Here&#8217;s how to do it using a VS Macro and [...]]]></description>
			<content:encoded><![CDATA[<p>Visual Studio 2008 allows one to open an existing website by navigating File &gt; Open &gt; WebSite.&nbsp; Alternatively, one may also use the following shortcut: Shift + ALT + O.&nbsp; <a href="http://johnnycoder.com/blog/wp-content/uploads/2008/10/image.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 10px 5px; border-right-width: 0px" height="93" alt="image" src="http://johnnycoder.com/blog/wp-content/uploads/2008/10/image-thumb.png" width="244" align="right" border="0"></a></p>
<p>But let&#8217;s say you would like to open a website by a right-click folder option. <a href="http://weblogs.asp.net/bradleyb/archive/2005/12/09/432802.aspx">Here&#8217;s how to do it using a VS Macro and a Registry Entry:</a>&nbsp; </p>
<p>Open Visual Studio.&nbsp; Select Tools &gt; Macros &gt; Macros IDE.&nbsp; Right-click &#8220;MyMacros&#8221; and select &#8220;New module&#8230;&#8221; At the prompt, name the module &#8220;Website&#8221;. Add the VsWebSite.Interop.dll reference(Projects &gt; Add Reference) and copy/paste the follow code over the generated Public &#8220;Website&#8221; module.</p>
<p><span style="color: blue">Imports </span>System <br /><span style="color: blue">Imports </span>EnvDTE <br /><span style="color: blue">Imports </span>EnvDTE80<span style="color: blue">Imports </span>EnvDTE90 <br /><span style="color: blue">Imports </span>System.Diagnostics </p>
<p><span style="color: blue">Public Module </span>Website </p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: blue">Sub </span>OpenWebsite(<span style="color: blue">Optional ByVal </span>path <span style="color: blue">As String </span>= <span style="color: #a31515">&#8220;&#8221;</span>) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">If </span>(<span style="color: blue">String</span>.Compare(path, <span style="color: blue">String</span>.Empty) = 0) <span style="color: blue">Then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MsgBox(<span style="color: #a31515">&#8220;Must supply a folder path to the OpenWebsite macro&#8221;</span>, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBoxStyle.OkOnly) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">Else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim </span>webPkg <span style="color: blue">As </span>VsWebSite.VSWebPackage <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; webPkg = DTE.GetObject(<span style="color: #a31515">&#8220;WebPackage&#8221;</span>) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; webPkg.OpenWebSite(path, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VsWebSite.OpenWebsiteOptions.OpenWebsiteOption_None, <span style="color: blue">False</span>) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">End If </p>
<p>&nbsp;&nbsp;&nbsp; End Sub </p>
<p>End Module <br /></span></p>
<p>Now register a shell command enabling an &#8220;Open as VS2008 Website&#8221; option on any folder in Windows Explorer.&nbsp; Simply, copy/paste the following script into a new &#8220;OpenWebsiteVS2008.reg&#8221; file. </p>
<p><em>Windows Registry Editor Version 5.00 </em>
<p><em>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\OpenVS2008Web]<br />@=&#8221;Open as VS2008 Website&#8221; </em>
<p><em>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\OpenVS2008Web\command]<br />@=&#8221;\&#8221;C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\IDE\\devenv.exe\&#8221;<br />/command \\\&#8221;Macros.MyMacros.Website.OpenWebsite %1\\\&#8221;"</em></p>
<p><a href="http://11011.net/software/vspaste"></a>
<p>Execute (double-click) the file to update the Registry accordingly.&nbsp; The &#8220;Open as VS2008 Website&#8221; option will now be available in Windows Explorer.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=tOSrm"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=tOSrm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=JBU5M"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=JBU5M" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=2sHpm"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=2sHpm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=pv7dM"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=pv7dM" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/10/20/open-vs2008-website-from-windows-explorer/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/10/20/open-vs2008-website-from-windows-explorer/</feedburner:origLink></item>
		<item>
		<title>I Am Not A Control Developer</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/421213184/</link>
		<comments>http://johnnycoder.com/blog/2008/10/14/i-am-not-a-control-developer/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 04:50:20 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Best Practices]]></category>

		<category><![CDATA[Controls]]></category>

		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/10/14/i-am-not-a-control-developer/</guid>
		<description><![CDATA[I&#8217;ve created a number of user and server controls for my C# web applications.  Recently, however, I&#8217;ve found myself working in Silverlight and, if you are of the same opinion as me, you believe Silverlight was missing a few core controls.  Specifically, Silverlight was missing a TextBox with password masking and a CombBox until Monday&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve created a number of user and server controls for my C# web applications.  Recently, however, I&#8217;ve found myself working in Silverlight and, if you are of the same opinion as me, you believe Silverlight was missing a few core controls.  Specifically, Silverlight was missing a TextBox with password masking and a CombBox until Monday&#8217;s <a href="http://www.microsoft.com/presspass/press/2008/oct08/10-13Silverlight2PR.mspx.">Silverlight 2 Release Announcement</a>. Prior to the <a href="http://weblogs.asp.net/scottgu/archive/2008/09/25/silverlight-2-release-candidate-now-available.aspx">release candidate becoming available</a> a couple of weeks ago, you had 3 options if you needed one of these controls in your Silverlight application; you could purchase a commercial control, find an open source implementation or hack your own control together. </p>
<p>I really didn&#8217;t know enough to put together my own solution so I downloaded a lot of code and clicked through numerous demos in an attempt to find something that already worked.  Luckily, I found <a href="http://pietschsoft.com/post/2008/03/PasswordTextBox-for-Silverlight-2-Beta-1.aspx">sample code available for a PasswordTextbox which needed little fine tuning on Chris Pietshcmann&#8217;s blog</a>.  Though I literally searched for hours and sampled many implementations, I didn&#8217;t find a satisfactory commercial or open source ComboBox control.  Ultimately, I settled on a AutoComplete TextBox / ComboBox hybrid which I pieced together with the help of <a href="http://weblogs.manas.com.ar/ary/2008/09/26/autocomplete-in-silverlight/">a couple of posts made by Ary Borenszweig</a>.  I was really encouraged but how much I learned through the process and even though my controls will have an exceptionally short life expectancy, I am pleased with how they turned out. </p>
<p>I found it interesting to discover that only a few of the controls I researched/tested really, really worked.  Yes, primary functionality was in place the majority of the time, but shortcomings became obvious once I dropped the controls into a &#8220;real&#8221; application.  So, here are a few thoughts I collected for those (including myself) interested in pursuing control development: </p>
<p><strong>Code for both the mouse and the keyboard user</strong>.  Think big strokes like navigation, data entry and value selection.  Whatever action is available via the mouse should be available via the keyboard and vice versa.  For example, don&#8217;t make users click on the ComboBox in order to have the dropdown list appear.  Instead, get familiar with standard ComboBox operations by playing with ComboBoxes found in other frameworks.  Comboboxes have been around for a long time.  Unless you mimic de facto standard functionality, your control will be full of holes. </p>
<p><strong>Don&#8217;t forget to test the edge cases.</strong>  Sure. Most of the time a user is going to simply enter a password from left to right, one character at a time, but what if the user copy and pastes in an entire password or, better yet, what if a password is entered and then the user selects and replaces the middle three characters without ever touching the mouse.  Here&#8217;s a good one: what happens if the PasswordTextBox mask, perhaps an asterisks, is entered as part of the password string?  Will your control break?  I am pretty sure mine will&#8230; Edge cases are tricky and endless.  The main point here is test, test, test anything a user might do.</p>
<p><strong>Test controls in a real world scenario. </strong>There&#8217;s a lot you can immediately learn about a control once you start using it with purpose.  Is your control easily populated?  Can you easily extract the value?  Can the control be validated?  If necessary, how does the invalid state present itself?   When it comes to look and feel, can your control use existing themes/styles?  Finally, does your control play nicely with others?  Can you tab in and out of your control smoothly?  Can you programmatically give focus to your control?  What happens when your control loses focus?  Until you drop your control into an application, some of those questions may not be considered or answerable.</p>
<p>Again, I am not a control developer, but I will keep the thoughts above in mind the next time I create a control.  Happy coding.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=T4BEm"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=T4BEm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=6S6lM"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=6S6lM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=SpSwm"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=SpSwm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=PC9RM"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=PC9RM" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/10/14/i-am-not-a-control-developer/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/10/14/i-am-not-a-control-developer/</feedburner:origLink></item>
		<item>
		<title>Shh! I’ve Got My MCPD…</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/419737136/</link>
		<comments>http://johnnycoder.com/blog/2008/10/13/shh-ive-got-my-mcpd/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 18:08:24 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Career]]></category>

		<category><![CDATA[Certification]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/10/13/shh-ive-got-my-mcpd/</guid>
		<description><![CDATA[I previously wrote about upgrading my Microsoft MCSD Certification to a Microsoft Certified Technology Specialist (MCTS) and Microsoft Certified Professional Developer (MCPD):
I am a Microsoft Certified Solution Developer (MCSD.) Seeing as some of the folks at work are looking to get their certifications, I spent some time today reviewing possible tracks to upgrade my credential [...]]]></description>
			<content:encoded><![CDATA[<p>I previously wrote about <a href="http://johnnycoder.com/blog/2008/08/11/upgrading-microsoft-certifications/">upgrading my Microsoft MCSD Certification to a Microsoft Certified Technology Specialist (MCTS) and Microsoft Certified Professional Developer (MCPD)</a>:</p>
<blockquote><p>I am a Microsoft Certified Solution Developer (MCSD.) Seeing as some of the folks at work are looking to get their certifications, I spent some time today reviewing possible tracks to upgrade my credential to Microsoft Certified Technology Specialist (MCTS) or Microsoft Certified Professional Developer (MCPD.)  I was happy to discover that I am eligible to <a href="http://www.microsoft.com/learning/mcp/upgrade/vs2005/default.mspx">upgrade my MCSD credential with the option of one or two exams</a>.</p></blockquote>
<p>After further review, I opted down a different path.  Rather than working towards a non-specialized <a href="http://www.microsoft.com/learning/mcp/mcpd/entapp/">MCPD: Enterprise Applications Developer on Visual Studio 2005</a>, this month, I took the Web Developer track and became a Microsoft Certified Technology Specialist (MCTS) by passing Exam 70-536 and 70-528 and then a Microsoft Certified Professional Developer (MCPD) by passing Exam 70-547. I took the Web Developer track since it provided some level of specialization and it was basically the path of least resistance for me. </p>
<p>Though I am proud of my recent accomplishment, I have mixed feelings as I recognize &#8220;being certified&#8221; comes with some negative connotations.</p>
<p>Primarily, there&#8217;s talk about the value of the exams.  Simply put, is it really possible to determine a developer&#8217;s competency/worth via their ability to pass a multiple-choice exam?  After all, in a field where problems can be solved dozens and dozens of ways, it seems likely that any real-world problem can have only one correct answer.  So, doesn&#8217;t that mean the exams would be limited to only the most trivial or obscure questions?</p>
<p>I think basic opinions have already been formed already.  Some feel (due to the point above) that the certification exams are worthless and thus only an unreasonable developer would waste their time and money pursuing certification.  For some, it is not too big of a stretch to think, &#8220;If you are certified, you are a developer who makes bad decisions.&#8221;</p>
<p>Finally, as you know, the &#8220;M&#8221; in MCTS and MCPD stands for Microsoft.  Though I work with a good deal of Microsoft products and technologies, I am not Microsoft-Only.  However, I think my certifications could be interpreted as such. I also think the mere mention of &#8220;Microsoft&#8221; puts a bad taste in the mouths of some&#8230;</p>
<p>At this point, you may be asking, &#8220;So, why did you pursue your certification then?&#8221;  Three reasons:</p>
<ul>
<li>The company I work for is pursuing membership in the <a href="https://partner.microsoft.com/US/partner">Microsoft Partner Program</a>.  To become a partner, a company needs to demonstrate competency through such things as customer references and employment of Certified Professionals.  Since my company picked up the cost of the exams/study materials, allotted time to study and was very encouraging, I had to jump at the opportunity as offers like that don&#8217;t come up very often.  As I see it, both the company and I won.</li>
<li>I made a shift from development manager to full-time developer about a year ago.  As manager, I simply was unable to keep up with the ins and outs of .NET.  Over the last year, I have played a lot of catch up and I merely wanted to formally prove to myself that I am back on track. Of course, the tests focused on .NET 2.0 whereas I had been working with .NET 3* for the past 6 months, but I still feel validated.</li>
<li>I&#8217;ve been sitting on a MCSD in VB/SQL since 2001.  As you can imagine, the dated certification was starting to smell really bad.</li>
</ul>
<p>Again, I am proud of my accomplishment.  If I could do it all again, I would without hesitation, but we&#8217;ll just have to see if the certifications do me more harm than good in the future. </p>
<p>I&#8217;m happy to hear your thoughts.  And if you have any questions, feel free to ping me.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=cmjIm"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=cmjIm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=aeEgM"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=aeEgM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=nkYPm"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=nkYPm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=AwSCM"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=AwSCM" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/10/13/shh-ive-got-my-mcpd/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/10/13/shh-ive-got-my-mcpd/</feedburner:origLink></item>
		<item>
		<title>Check Your User Account Control Settings</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/389837988/</link>
		<comments>http://johnnycoder.com/blog/2008/09/11/check-your-user-account-control-settings/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 17:24:20 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Vista]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/09/11/check-your-user-account-control-settings/</guid>
		<description><![CDATA[If you are running Vista and you have intentionally disabled the UAC, you might find the never-ending &#8220;Check Your User Account Control Settings&#8221; Windows Security Alert a bit annoying. Well, it is not very difficult to disable this alert, but it takes a little digging.

Here&#8217;s how you disable the popup:
1. Right-click on the Windows Security [...]]]></description>
			<content:encoded><![CDATA[<p>If you are running Vista and you have intentionally disabled the UAC, you might find the never-ending &#8220;Check Your User Account Control Settings&#8221; Windows Security Alert a bit annoying. Well, it is not very difficult to disable this alert, but it takes a little digging.</p>
<p><a href="http://johnnycoder.com/blog/wp-content/uploads/2008/09/image.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px 0px 10px 10px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/09/image-thumb.png" border="0" alt="image" width="371" height="74" align="right" /></a></p>
<p>Here&#8217;s how you disable the popup:</p>
<p>1. Right-click on the Windows Security Alerts (red shield) icon in your task tray.</p>
<p>2. Choose &#8220;Open Security Center.&#8221;  Alternatively, you could also open Security Center from the start menu.</p>
<p>3. Select &#8220;Change the way Security Center alerts me.&#8221;</p>
<p>4. When prompted, choose either &#8220;Don&#8217;t notify me, but display the icon&#8221; or &#8220;Don&#8217;t notify me and don&#8217;t display the icon (not recommended.)&#8221;  I personally went with the former since I really like a cluttered task tray.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=0yuHl"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=0yuHl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=xyVKL"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=xyVKL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=uGBml"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=uGBml" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=eGU9L"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=eGU9L" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/09/11/check-your-user-account-control-settings/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/09/11/check-your-user-account-control-settings/</feedburner:origLink></item>
		<item>
		<title>Upgrading Microsoft Certifications</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/362306732/</link>
		<comments>http://johnnycoder.com/blog/2008/08/11/upgrading-microsoft-certifications/#comments</comments>
		<pubDate>Mon, 11 Aug 2008 21:17:45 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Career]]></category>

		<category><![CDATA[Certification]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/08/11/upgrading-microsoft-certifications/</guid>
		<description><![CDATA[I am a Microsoft Certified Solution Developer (MCSD.) Seeing as some of the folks at work are looking to get their certifications, I spent some time today reviewing possible tracks to upgrade my credential to Microsoft Certified Technology Specialist (MCTS) or Microsoft Certified Professional Developer (MCPD.)  I was happy to discover that I am eligible [...]]]></description>
			<content:encoded><![CDATA[<p>I am a Microsoft Certified Solution Developer (MCSD.) Seeing as some of the folks at work are looking to get their certifications, I spent some time today reviewing possible tracks to upgrade my credential to Microsoft Certified Technology Specialist (MCTS) or Microsoft Certified Professional Developer (MCPD.)  I was happy to discover that I am eligible to <a href="http://www.microsoft.com/learning/mcp/upgrade/vs2005/default.mspx">upgrade my MCSD credential with the option of one or two exams</a>.</p>
<p>If you (like me) are an MCSD, you can earn certifications in <a href="http://www.microsoft.com/learning/mcp/mcts/webapps/">MCTS: .NET Framework 2.0 Web Applications</a>, <a href="http://www.microsoft.com/learning/mcp/mcts/winapps/">MCTS: .NET Framework 2.0 Windows Applications</a>, <a href="http://www.microsoft.com/learning/mcp/mcts/distapps/">MCTS: .NET Framework 2.0 Distributed Applications</a>,<em> and </em><a href="http://www.microsoft.com/learning/mcp/mcpd/entapp/">MCPD: Enterprise Applications Developer on Visual Studio 2005</a> by passing <a href="http://www.microsoft.com/learning/exams/70-554.mspx">Exam 70–554</a> and <a href="http://www.microsoft.com/learning/exams/70-553.mspx">Exam 70–553</a>. </p>
<p>Alternatively, you can receive your <a href="http://www.microsoft.com/learning/mcp/mcpd/entapp/">MCPD: Enterprise Applications Developer</a> by passing a single exam, <a href="http://www.microsoft.com/learning/exams/70-554.mspx">Exam 70–554</a>, but you will need to earn your <a href="http://www.microsoft.com/learning/mcp/mcpd/webdev/default.mspx">MCPD: Web Developer</a> and <a href="http://www.microsoft.com/learning/mcp/mcpd/windev/default.mspx">MCPD: Windows Developer</a> certifications first. This option is certainly the faster track if you have already satisfied the two prerequisite certifications (which I have not.) </p>
<p><img src="http://img.microsoft.com/learning/images/certification/mcp-hero-developer.jpg" border="0" alt="MCPD: Database Administrator" width="590" height="229" /></p>
<p>You will note the exams called out above are geared around Visual Studio 2005 and the .NET Framework 2.0.  There are also equivalent <a href="http://www.microsoft.com/learning/mcp/mcts/default.mspx">MCTS</a> and <a href="http://www.microsoft.com/learning/mcp/mcpd/default.mspx">MCPD</a> certifications for Visual Studio 2008 and the .NET Framework 3.5.  I&#8217;ve been inside of VS 2008 and .NET Framework 3.5 for some time now so I may just test my skills against the latest and greatest.  It seemed to make sense but you never know.</p>
<p>It&#8217;s been over 4 years since I last tested.  If anyone has advice or feedback, I would love to hear it &#8212; even if it&#8217;s merely &#8220;good luck.&#8221;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=xxNH5k"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=xxNH5k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=FaqiyK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=FaqiyK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=qBEBbk"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=qBEBbk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=SByjxK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=SByjxK" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/08/11/upgrading-microsoft-certifications/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/08/11/upgrading-microsoft-certifications/</feedburner:origLink></item>
		<item>
		<title>Assembla - Quick Review</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/358614238/</link>
		<comments>http://johnnycoder.com/blog/2008/08/07/assembla-accelerating-software-development/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 13:00:07 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Hosting]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Tools]]></category>

		<category><![CDATA[Version Control]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/08/07/assembla-accelerating-software-development/</guid>
		<description><![CDATA[&#160;
UPDATE: Assembla.com has changed their ways.&#160; The bottom line is their free, private spaces hosting option is no longer available.&#160; In my opinion, they still have a valuable service, it&#8217;s simply not as great now that I have to pay for it. :)
&#160;
A good while back, I commented about SVN Hosting through SVNRepository.com.&#160; Well, I [...]]]></description>
			<content:encoded><![CDATA[<p><strong></strong>&nbsp;</p>
<p><strong>UPDATE</strong>: Assembla.com has changed their ways.&nbsp; The bottom line is their <a href="http://blog.assembla.com/assemblablog/tabid/12618/bid/6986/Release-2-0-restricting-free-plans-giving-back-with-features-and-pric">free, private spaces hosting option is no longer available</a>.&nbsp; In my opinion, they still have a valuable service, it&#8217;s simply not as great now that I have to pay for it. :)</p>
<p>&nbsp;</p>
<p>A good while back, <a href="http://johnnycoder.com/blog/2007/02/03/svn-hosting/">I commented about SVN Hosting</a> through SVNRepository.com.&nbsp; Well, I am still using SVN Repository but I came across another option, <a href="http://www.assembla.com">Assembla</a>, last week and it deserves some attention.</p>
<p>Though many SVN repositories provide an accompanying Trac instance, that&#8217;s about all they do.&nbsp; Frankly, that&#8217;s because that&#8217;s all they need to do. Assembla is the exception.&nbsp; It takes hosting one step further.</p>
<p>Assembla is a complete software development tools package offering workspaces to thousands of teams for FREE.&nbsp; The screenshot below gives you an idea of what is provided.&nbsp; There&#8217;s everything from a SVN, Git or Mercurial repository to a project-specific Wiki and Chatroom.&nbsp; If you look around, you will even find a Time Tracking application.</p>
<p><a href="http://johnnycoder.com/blog/wp-content/uploads/2008/08/image2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="36" alt="image" src="http://johnnycoder.com/blog/wp-content/uploads/2008/08/image-thumb2.png" width="554" border="0"></a></p>
<p>You may add team members to your Workspace with different privileges as well as establish security settings for non-member access.</p>
<p><a href="http://johnnycoder.com/blog/wp-content/uploads/2008/08/image3.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="255" alt="image" src="http://johnnycoder.com/blog/wp-content/uploads/2008/08/image-thumb3.png" width="440" border="0"></a></p>
<p>Creating a space is low friction&#8230;just visit the home page, click &#8220;Create a new space&#8221; and follow the instructions.&nbsp; The free account includes all of the core functionality and is limited to 200MB of storage.&nbsp; If the free account doesn&#8217;t meet your needs, Assembla does also provide commercial and branded options which include further functionality and support in exchange for cash money.&nbsp; You can find out more about Assembla plans on their <a href="http://www.assembla.com/tour">tour page</a>.</p>
<p>I recommend creating a free account and clicking through the tools as Assembla may be a good option for you.</p>
<p class="wlWriterSmartContent" id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:8dfaa49e-0e8f-4003-b5d1-3efad0dc34be" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/08/07/assembla-accelerating-software-development/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/08/07/assembla-accelerating-software-development/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=2rNw6k"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=2rNw6k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=MQxrGK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=MQxrGK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=N0B2zk"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=N0B2zk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=S7HDeK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=S7HDeK" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/08/07/assembla-accelerating-software-development/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/08/07/assembla-accelerating-software-development/</feedburner:origLink></item>
		<item>
		<title>.NET Podcast Recommendations</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/357383364/</link>
		<comments>http://johnnycoder.com/blog/2008/08/06/net-podcast-recommendations/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 13:00:51 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Podcasts]]></category>

		<category><![CDATA[Recommended]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/08/06/net-podcast-recommendations/</guid>
		<description><![CDATA[Last Friday, a fellow coder asked the team for podcast recommendations.  Since I listen to anywhere from 6-10 podcasts a week, I was happy to share what is currently in my top podcast rotation. 
It is worth noting that those of us in the .NET community are rather fortunate as there are a number of recent [...]]]></description>
			<content:encoded><![CDATA[<p>Last Friday, a fellow coder asked the team for podcast recommendations.  Since I listen to anywhere from 6-10 podcasts a week, I was happy to share what is currently in my top podcast rotation. </p>
<p>It is worth noting that those of us in the .NET community are rather fortunate as there are a number of recent newcomers in this space.  In fact, four of my top six podcasts have been around for less than 4 months.  I personally think they&#8217;ve all done a standup job and it has been enjoyable listening to the podcasts as they mature.  Maybe some day, years from now, young developers will gather around as I tell tales of the very first Herding Code podcast. You never know&#8230;</p>
<p>Enough with the intro already.  Here&#8217;s my .NET Podcast Recommendation List in no particular order (other than alphabetical):</p>
<p><strong>Alt.NET Podcast<br />
</strong><a title="http://altnetpodcast.com/" href="http://altnetpodcast.com/">http://altnetpodcast.com/</a><br />
Hosted by <a href="http://blowmage.com/">Mike Moore</a><br />
Currently on Episode 8 </p>
<p><strong>Deep Fried Bytes<br />
</strong><a title="http://deepfriedbytes.com/" href="http://deepfriedbytes.com/">http://deepfriedbytes.com/</a><br />
Hosted by <a href="http://keithelder.net/blog/">Keith Elder</a> and <a href="http://blog.cloudsocket.com/">Chris Woodruff</a><br />
Currently on Episode 8</p>
<p><strong>Hanselminutes <br />
</strong><a title="http://www.hanselminutes.com/" href="http://www.hanselminutes.com/">http://www.hanselminutes.com/</a><br />
Hosted by <a href="http://www.hanselman.com/blog/">Scott Hanselman</a><br />
Currently on Show #124 </p>
<p><strong>Herding Code<br />
</strong><a title="http://herdingcode.com/" href="http://herdingcode.com/">http://herdingcode.com/</a><br />
Hosted by <a href="http://weblogs.asp.net/jgalloway/">Jon Galloway</a>, <a href="http://odetocode.com/">K. Scott Allen</a>, <a href="http://weblogs.asp.net/kdente/">Kevin Dente</a> and <a href="http://www.lazycoder.com/weblog/">Scott Koon</a><br />
Currently on Episode 11</p>
<p><strong>.NET Rocks!<br />
</strong><a title="http://www.dotnetrocks.com/" href="http://www.dotnetrocks.com/">http://www.dotnetrocks.com/</a><br />
Hosted by <a href="http://www.intellectualhedonism.com/">Carl Franklin</a> and <a href="http://www.campbellassociates.ca/blog/default.aspx">Richard Campbell</a><br />
Currently on Show #365</p>
<p><strong>Stackoverflow<br />
</strong><a title="http://blog.stackoverflow.com/" href="http://blog.stackoverflow.com/">http://blog.stackoverflow.com/</a><br />
Hosted by <a href="http://www.codinghorror.com/blog/">Jeff Atwood</a> and <a href="http://joelonsoftware.com/">Joel Spolsky</a><br />
Currently on Podcast #16</p>
<div id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:2d969a8d-ed51-4a12-b4cc-7d10bf85d7e5" class="wlWriterSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/08/06/net-podcast-recommendations/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/08/06/net-podcast-recommendations/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=14oQbk"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=14oQbk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=aQ5t9K"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=aQ5t9K" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=TarVjk"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=TarVjk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=GFoYJK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=GFoYJK" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/08/06/net-podcast-recommendations/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/08/06/net-podcast-recommendations/</feedburner:origLink></item>
		<item>
		<title>iPhone Firmware Update</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/357383369/</link>
		<comments>http://johnnycoder.com/blog/2008/08/06/iphone-firmware-update/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 13:00:31 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/08/06/iphone-firmware-update/</guid>
		<description><![CDATA[For my birthday, back in early July, I received an Apple gift certificate for the exact purchase price of a shiny new version 2.0 iPhone. Since I already own the first generation iPhone and I have a tendency to avoid ridiculously long, seemingly endless lines, I haven&#8217;t picked up my present yet.  Actually, the last [...]]]></description>
			<content:encoded><![CDATA[<p>For my birthday, back in early July, I received an Apple gift certificate for the exact purchase price of a shiny new version 2.0 iPhone. Since I already <a href="http://johnnycoder.com/blog/2008/06/10/somewhat-timely-iphone-review/">own the first generation iPhone</a> and I have a tendency to<img style="margin: 10px" src="http://i.cmpnet.com/infoweek/graphics_library/110x110/IW_iphone_sign2.jpg" border="0" alt="" align="right" /> avoid ridiculously long, seemingly endless lines, I haven&#8217;t picked up my present yet.  Actually, the last time I even thought about cashing in my certificate was one week after the iPhone 2.0 launch.  At the time, the nearest Apple Store had multiple rows of chairs lined up outside of the front door.  These chairs, I discovered, were reserved for folks who had previously waited in line but didn&#8217;t get to the cashier prior to the product selling out.  I guess the customers were lucky enough to receive a ticket or voucher along with the privilege to wait in line again once the next shipment arrived.  So, I wasn&#8217;t even close to getting a new phone a week after launch and I haven&#8217;t made it back to the store yet.</p>
<p>What I have done, however, is upgrade my firmware which took roughly as long as some of those poor folks had to wait in line outside the store.  Perhaps I am jumping ahead, but don&#8217;t attempt to upgrade unless you have time.  I&#8217;m told some upgraded are completed within 30 minutes, but I, unfortunately, have 16GB of storage space on my iPhone and I am using over 90% of it so the backup and restore of my data alone took close to an hour.  That on top of a 218MB download and the upgrade itself makes for a long firmware upgrade.</p>
<p>All things told, I completed the firmware upgrade because I was very interested in playing around with the AppStore and, well, I had nothing to lose.  I will say I have found the upgrade to be of little value at this point.  Yes, I now have Pandora running on my phone which is cool although the app is clunky.   I have experienced the keyboard delays and more crashes (supposedly fixed with the 2.0.1 release which I haven&#8217;t installed yet) and sadly my email pulling is far, far, far less reliable now than ever.  In fact, I find myself often times rebooting my iPhone just to resolve issues. </p>
<p>When I do get around to picking up my new phone, let&#8217;s hope everything works a little more smoothly.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=t8crJk"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=t8crJk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=XqeQwK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=XqeQwK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=XlkQXk"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=XlkQXk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=ji8ZEK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=ji8ZEK" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/08/06/iphone-firmware-update/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/08/06/iphone-firmware-update/</feedburner:origLink></item>
		<item>
		<title>Help Docs Using Sandcastle</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/356333785/</link>
		<comments>http://johnnycoder.com/blog/2008/08/05/compile-help-file-documentation-using-sandcastle/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 13:00:59 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Documentation]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/08/05/compile-help-file-documentation-using-sandcastle/</guid>
		<description><![CDATA[I am currently on the bench at work waiting for my next assignment to start up in a few days.&#160; Rather than sit around, read blogs and listen to podcasts, I&#8217;m keeping myself busy by putting together the beginnings of a code library to be shared across our development team.&#160; Yesterday I started the foundation.&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>I am currently on the bench at work waiting for my next assignment to start up in a few days.&nbsp; Rather than sit<img style="margin: 10px" alt="Sandcastle Logo" src="http://www.sandcastledocs.com/Images1/_t/sandcastlelogo_jpg.jpg" align="right"> around, read blogs and listen to podcasts, I&#8217;m keeping myself busy by putting together the beginnings of a code library to be shared across our development team.&nbsp; Yesterday I started the foundation.&nbsp; I defined the framework, file system layout and basic namespace conventions.&nbsp; I also created two class libraries and associated test projects to get the ball rolling.&nbsp; I&#8217;m pleased with the way the common library is turning out.</p>
<p>Today, I refactored a bit and then focused on documentation.&nbsp; Specifically, I generated help file documentation via the XMLSummary comments. I searched around and played with various utilities and ultimately decided on <a href="http://www.codeplex.com/Sandcastle">Sandcastle</a> and <a href="http://www.codeplex.com/SHFB">Sandcastle Help File Builder</a>.</p>
<p><img style="margin: 10px 10px 10px 0px" alt="Sandcastle.jpg" src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=SHFB&amp;DownloadId=2696" align="left">Sandcastle - Documentation Compiler for Managed Class Libraries, created by Microsoft, produces accurate, MSDN style, comprehensive documentation by reflecting over the source assemblies and optionally integrating XML Documentation Comments. Sandcastle works with or without authored comments and supports .NET Framework 1.1, 2.0, 3.0 and 3.5.&nbsp; Sandcastle is, however, a command line based tool which has no GUI front-end.&nbsp; That&#8217;s where <a href="http://www.codeplex.com/SHFB">Sandcastle Help File Builder (SCHB)</a> comes in.&nbsp; SCHB provides a user interface (as well as command line based tools) to facilitate the building of help files in an automated fashion. Both applications may be found on <a href="http://codeplex.com">Codeplex</a>.</p>
<p>Sandcastle (really Sandcastle Help File Builder wrapped around Sandcastle) is easy to install and navigate and I was able to quickly integrate into the common libraries&#8217; best practices.&nbsp; Now when additional code (new library, class, method, etc) is appended to our common code repository, team members simply need to follow the overall folder structure, code library templates/namespaces and update the Help File Builder project which is now in place.</p>
<p>Below are the instructions on how to extend the existing Help File Builder project.&nbsp; These instructions will be share with my team members though they can easily be altered to create a help file from the ground up:</p>
<ol>
<li>Download and install <a href="http://www.codeplex.com/Sandcastle">Sandcastle</a> and <a href="http://www.codeplex.com/SHFB">Sandcastle Help File Builder</a> from Codeplex.
<li>Apply XML comments to your code base.&nbsp;
<li>Navigate to the Build Tab of your project&#8217;s properties and do the following:
<ul>
<li>Check XML documentation file
<li>Set file name to bin\[mode]\assembly name.xml where [mode] is debug or release. Example: bin\release\MyCompany.Common.Serialization.xml </li>
</ul>
<li>Compile your assemblies in release mode.&nbsp;&nbsp; Note: I&#8217;m opting to only generate documentation per the assemblies/xml generated in release mode although it doesn&#8217;t have to be this way.
<li>Run Sandcastle Help File Builder. The existing Sandcastle Help File Builder project can be found in the following location: MyCompany\Common\MyCompany.Common.shfb
<li>Add your compiled assembly to the SCHB project:
<ul>
<li>Click Add &gt; Browse to the libraries&#8217; bin\Release &gt; Select dll
<li>After the assembly is added, the dll and xml files will be listed in the &#8216;Assemblies to Document&#8217; list box.&nbsp; </li>
</ul>
<li>Document the assembly&#8217;s namespace by clicking on the &#8216;Namespaces&#8217; button and editing the summary.
<li>The MyCompany.Common.shfb project is already configured so there&#8217;s no need to change any of the project properties. For future reference, all non-default values are highlighted in bold font within the property list. This information is most obvious if you toggle the project properties to display Alphabetically rather than Categorized.Here&#8217;s a list of the settings which have been updated:
<ul>
<li>Help Title=MyCompany.Common Class Library
<li>HtmlHelpName=MyCompany.Common
<li>KeepLogFile=False
<li>OutputPath=./
<li>PresentationStyle=vs2005
<li>SdkLinkType=Index </li>
</ul>
<li>Generate the help file by clicking the Generate button in the toolbar.
<li>View the help file by double-clicking the MyCompany/common/MyCompany.Common.chm or by opening the file via the SCHB Documentation/View help file menu option. </li>
</ol>
<p>Again, I found the tools easy to use though I did encounter one gotcha. My file path included a folder named &#8220;.NET 3.5&#8243;.&nbsp; I found that Help File Builder didn&#8217;t like the naming convention.&nbsp; Apparently the preceding &#8220;.&#8221; caused the issue.&nbsp; Once I renamed the folder to &#8220;NET 3.5&#8243; everything worked like a charm.</p>
<div class="wlWriterSmartContent" id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:b78f7102-1fa6-451d-8e4d-bf1e4113f894" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/08/05/compile-help-file-documentation-using-sandcastle/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/08/05/compile-help-file-documentation-using-sandcastle/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<p>References:</p>
<ul>
<li><a href="http://bloggingabout.net/blogs/jschreuder/archive/2007/03/20/using-sandcastle-is-increasingly-mature.aspx">http://bloggingabout.net/blogs/jschreuder/archive/2007/03/20/using-sandcastle-is-increasingly-mature.aspx</a> </li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=h2Ihkk"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=h2Ihkk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=8TJduK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=8TJduK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=2pL9ck"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=2pL9ck" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=cFZ4XK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=cFZ4XK" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/08/05/compile-help-file-documentation-using-sandcastle/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/08/05/compile-help-file-documentation-using-sandcastle/</feedburner:origLink></item>
		<item>
		<title>VS2008 Test Project Tips</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/355306862/</link>
		<comments>http://johnnycoder.com/blog/2008/08/04/vs2008-test-project-tips/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 13:00:00 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Best Practices]]></category>

		<category><![CDATA[TDD]]></category>

		<category><![CDATA[Tip and Tricks]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/08/04/vs2008-test-project-tips/</guid>
		<description><![CDATA[As I mentioned last week, I am new to TDD.  For better or worse, all of my tests (and spikes) have been generated via Visual Studio Test Projects.  Working with VS Test Projects hasn&#8217;t been all that bad although I noticed a couple of annoyances right away. 
Is anyone else bothered by the fact that, by [...]]]></description>
			<content:encoded><![CDATA[<p>As <a href="http://johnnycoder.com/blog/2008/08/01/learning-test-driven-development/">I mentioned last week, I am new to TDD</a>.  For better or worse, all of my tests (and spikes) have been generated via Visual Studio Test Projects.  Working with VS Test Projects hasn&#8217;t been all that bad although I noticed a couple of annoyances right away. </p>
<p>Is anyone else bothered by the fact that, by default, an unlimited number of test results and binaries are &#8220;deployed?&#8221;  If you are testing first, this arguably makes for a lot of useless activity and waste disk space.  Since the default TestResults folder location is set to be side-by-side with your solution files, the extra folders, trx files and binaries can also really interfere with your otherwise easy source control check-ins. </p>
<p>Fortunately, there are ways to work around the excessive TestResults problem if you are running VS2008.  Some options are available through the IDE and other require an update to the .testrunconfig file directly:</p>
<p><span style="text-decoration: underline;">Limit the number of deployed tests:</span></p>
<p>Tools &gt; Options &gt; Test Tools &gt; Test Execution &gt; Test Results Management &gt; Limit number of old Test Results to the value of your choosing. </p>
<p>The screen shot below sets the number of tests to one.  Therefore all previous tests are purged and only the latest test is maintained.</p>
<p><a href="http://johnnycoder.com/blog/wp-content/uploads/2008/08/image.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/08/image-thumb.png" border="0" alt="image" width="244" height="119" /></a></p>
<p><span style="text-decoration: underline;">Disable Test Result deployment:</span></p>
<p>If you wish to disable the Test Result generation completely, double-click on your solution&#8217;s .testrunconfig file and uncheck the &#8220;Enable deployment&#8221; option.  No results will be generated thereafter.</p>
<p><a href="http://johnnycoder.com/blog/wp-content/uploads/2008/08/image1.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/08/image-thumb1.png" border="0" alt="image" width="244" height="155" /></a> </p>
<p><span style="text-decoration: underline;">Change the Test Result folder location:</span></p>
<p>This option is hidden.  I don&#8217;t believe it is exposed in any of the VS 2008 dialogues and you have to edit the .testrunconfig file directly. </p>
<p>Right-click on the .testrunconfig file &gt; Open With&#8230; &gt; XML Editor &gt; Include the following within the <span style="color: #a31515;">TestRunConfiguration </span>node:</p>
<pre class="code"><span style="color: #0000ff;">&lt;</span><span style="color: #a31515;">Deployment </span><span style="color: #ff0000;">useDefaultDeploymentRoot</span><span style="color: #0000ff;">=</span>"<span style="color: #0000ff;">false</span>" <span style="color: #ff0000;">userDeploymentRoot</span><span style="color: #0000ff;">=</span>"<span style="color: #0000ff;">C:\TestResults</span>" <span style="color: #0000ff;">/&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>I hope it helps.</p>
<div id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:9c6072a3-aa11-4796-9283-24a670b37930" class="wlWriterSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/08/04/vs2008-test-project-tips/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/08/04/vs2008-test-project-tips/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<p>References:</p>
<ul>
<li><a title="http://arcware.net/archive/2007/12/09/Limit-the-Number-of-Old-Test-Results-with-VS2008.aspx" href="http://arcware.net/archive/2007/12/09/Limit-the-Number-of-Old-Test-Results-with-VS2008.aspx">http://arcware.net/archive/2007/12/09/Limit-the-Number-of-Old-Test-Results-with-VS2008.aspx</a></li>
<li><a title="http://blogs.msdn.com/nnaderi/archive/2007/05/11/new-unit-testing-features-in-orcas-part-1.aspx" href="http://blogs.msdn.com/nnaderi/archive/2007/05/11/new-unit-testing-features-in-orcas-part-1.aspx">http://blogs.msdn.com/nnaderi/archive/2007/05/11/new-unit-testing-features-in-orcas-part-1.aspx</a></li>
<li><a title="http://weblogs.asp.net/stephenwalther/archive/2008/03/19/tdd-test-driven-development-with-visual-studio-2008-unit-tests.aspx" href="http://weblogs.asp.net/stephenwalther/archive/2008/03/19/tdd-test-driven-development-with-visual-studio-2008-unit-tests.aspx">http://weblogs.asp.net/stephenwalther/archive/2008/03/19/tdd-test-driven-development-with-visual-studio-2008-unit-tests.aspx</a></li>
<li><a title="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3026907&amp;SiteID=1" href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3026907&amp;SiteID=1">http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3026907&amp;SiteID=1</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=u0Txrk"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=u0Txrk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=M5xD1K"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=M5xD1K" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=Wn8a1k"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=Wn8a1k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=roRsNK"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=roRsNK" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/08/04/vs2008-test-project-tips/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/08/04/vs2008-test-project-tips/</feedburner:origLink></item>
		<item>
		<title>Learning Test Driven Development</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/352507875/</link>
		<comments>http://johnnycoder.com/blog/2008/08/01/learning-test-driven-development/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 11:00:53 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Books]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/08/01/learning-test-driven-development/</guid>
		<description><![CDATA[I am relatively new to the Test Driven Development (TDD) scene.  Though I have read up on the subject (specifically Test Driven: TDD and Acceptance TDD for Java Developers by Lasse Koskela), my only hands-on experience is limited to a single, 3-month project where I was the lone developer.  All other information gathered on the [...]]]></description>
			<content:encoded><![CDATA[<p>I am relatively new to the Test Driven Development (TDD) scene.  Though I have read up on the subject (specifically <em><a href="http://search.barnesandnoble.com/Test-Driven/Lasse-Koskela/e/9781932394856/?itm=2">Test Driven: TDD and Acceptance TDD for Java Developers</a></em> by Lasse Koskela), my only hands-on experience is limited to a single, 3-month project where I was the lone developer.  All other information gathered on the subject has been through blog entries, podcasts, ramblings and the occasional de<a href="http://search.barnesandnoble.com/Test-Driven/Lasse-Koskela/e/9781932394856/?itm=2"><img style="margin: 10px" title="Cover Image" src="http://images.barnesandnoble.com/images/17600000/17602683.JPG" border="0" alt="Cover Image" align="right" /></a>mo in the office.  Though I believe I have a good understanding of TDD methodologies, I am far from putting this, dare I say, knowledge to practice.  Good practice, that is&#8230;</p>
<p>A spike is a term associated with TDD.  A spike is nothing more than quick coding exercise which validates or invalidates an assumption.  Lasse Koskela says it more eloquently:</p>
<blockquote><p>A spike is a short experiment with the purpose of familiarizing ourselves with the technology, tools, algorithms, and so forth, that we need for solving the problem at hand.  A spike is  a way to make an unknown known &#8212; at least to a point where we know whether it&#8217;s worth continuing to dig that way or whether we should start looking for another way.</p></blockquote>
<p>If you are familiar with TDD concepts, you know that spikes offer no value with it comes to testability, maintainability, etc.  They are merely quick prototypes which I find immensely helpful but should not be considered the focal point of TDD.  Well, my first crack at TDD resulted in roughly 70% spikes and 30% actual tests.  Not too good.</p>
<p>There is no doubt in my mind that I always had the best intension to test-code-refactor, but I wasn&#8217;t yet familiar enough with TDD to know I was way off course. There was also no one around to put me on the right track (or keep me honest.) Putting my ego aside, I know I could have used some hand-holding when I was starting off with TDD.</p>
<p>Test Driven Development is a discipline.  Like many other disciplines, TDD requires a teacher, student and practice.  The teacher offers instruction and ensures the discipline is practiced correctly.  The good student gathers knowledge and implements under watchful guidance.  In my opinion, TDD is therefore a seemingly good fit for a team which embraces an Agile approach, collaboration, rapid development and testability.   I&#8217;m not saying the lone developer with no prior experience with TDD is not capable of learning TDD on their own. I know some are.  I know guys who have done it.  Simply, I am stating that TDD seems most accessible to the mentored developer working with team members who previously adopted the methodology.  To put it another way, I bet Test Driven Development concepts are best learned through practical, hands-on example.</p>
<p>I haven&#8217;t given up on TDD yet.  Who wants to hold my hand?</p>
<div id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:a60e33ac-6aa5-4869-b83c-92aab3c746f1" class="wlWriterSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/08/01/learning-test-driven-development/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/08/01/learning-test-driven-development/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=XTrz4k"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=XTrz4k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=qMsG4K"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=qMsG4K" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=Vxl8fk"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=Vxl8fk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=7NfF3K"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=7NfF3K" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/08/01/learning-test-driven-development/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/08/01/learning-test-driven-development/</feedburner:origLink></item>
		<item>
		<title>TortoiseSVN - Change User After Save Authentication</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/351518543/</link>
		<comments>http://johnnycoder.com/blog/2008/07/31/tortoisesvn-change-user-after-save-authentication/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 13:01:53 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Tools]]></category>

		<category><![CDATA[Version Control]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/07/31/tortoisesvn-change-user-after-save-authentication/</guid>
		<description><![CDATA[When you first access your SVN repository you are given the option to save your authentication information.   Nice feature, right?   Well, what if you need to access the repository via different credentials?  
Here&#8217;s the trick:

Right-click on the root folder
Select TortoiseSVN
Select Settings
Navigated to Saved Data
Clear the stored Authentication Data

The next time you need to access the [...]]]></description>
			<content:encoded><![CDATA[<p>When you first access your SVN repository you are given the option to save your authentication information.   Nice feature, right?   Well, what if you need to access the repository via different credentials?  <a href="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image31.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image-thumb16.png" border="0" alt="image" width="244" height="165" align="right" /></a></p>
<p>Here&#8217;s the trick:</p>
<ol>
<li>Right-click on the root folder</li>
<li>Select TortoiseSVN</li>
<li>Select Settings</li>
<li>Navigated to Saved Data</li>
<li>Clear the stored Authentication Data</li>
</ol>
<p>The next time you need to access the repository, you will be prompted for your new credentials.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=8xNsPj"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=8xNsPj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=vlIV0J"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=vlIV0J" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=1u77Jj"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=1u77Jj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=3iV7wJ"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=3iV7wJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/07/31/tortoisesvn-change-user-after-save-authentication/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/07/31/tortoisesvn-change-user-after-save-authentication/</feedburner:origLink></item>
		<item>
		<title>Analyzing Your .NET Code with NDepend</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/350679834/</link>
		<comments>http://johnnycoder.com/blog/2008/07/30/analyzing-your-net-code-with-ndepend/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 17:11:59 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Tools]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/07/30/analyzing-your-net-code-with-ndepend/</guid>
		<description><![CDATA[NDepend is a static analyzer that simplifies the management of a complex .NET code base. Architects and developers can analyze code structure, specify design rules, plan massive refactoring, do effective code reviews and compare different versions of the code. The result is better communication, improved quality, easier maintenance and faster development.  Sounds good, eh?
Full disclosure: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ndepend.com/">NDepend</a> is a static analyzer that simplifies the management of a complex .NET code base. Architects and developers can analyze code structure, specify design rules, plan massive refactoring, do effective code reviews and compare different versions of the code. The result is better communication, improved quality, easier maintenance and faster development.  Sounds good, eh?</p>
<p>Full disclosure: I received a free pro version of the NDepend from <a href="http://codebetter.com/blogs/patricksmacchia/">Patrick Smacchia</a> last week along with little encouragement to use the tool and buzz about it if I find it useful.  Patrick&#8217;s timing, in fact, could not have been better as just the evening before a colleague of mine was asking for code metric tool recommendations.  Hopefully the review represents me well, but I am thrilled with NDepend and recommend it highly to anyone wanting to get &#8220;more familiar&#8221; with their code.</p>
<p>As published by <a href="http://codebetter.com/blogs/patricksmacchia/">Patrick Smacchia</a></p>
<blockquote><p>&#8230;something difficult in promoting a tool such as NDepend is to educate about what it can bring to your development shop in terms of agility. NDepend comes with a <a href="http://www.ndepend.com/Features.aspx">set of innovative features</a> currently not supported by any other .NET tool. I like to think that what tools such as <a href="http://www.jetbrains.com/resharper/">ReSharper</a> or <a href="http://www.devexpress.com/Products/NET/IDETools/CodeRush/training.xml">CodeRush</a> are doing to your code at <em>micro </em>level (i.e methods&#8217; body structuring), NDepend does it at <em>macro </em>level (i.e class, namespace, assembly structuring). Hence, as a developer I personally use both kind of tools to automatically control every aspects of the code base I am working on&#8230;</p></blockquote>
<p>Being a big fan of <a href="http://johnnycoder.com/blog/2008/05/31/resharper-40-beta-makes-me-giggle/">ReSharper</a>, I had high hopes for NDepend.  Knowing my co-worker could use some help finding a good code analyzer and having a free copy of the software dropped in my lap, I had the immediate incentive to dig into the NDepend tool kit&#8230;</p>
<h3>How to Get Started</h3>
<p>Since I wasn&#8217;t all too familiar with NDepend, I opted to first gather basic information about the tool and capabilities.  Here&#8217;s what I did:</p>
<p>1. I watched two online demos: <a href="http://s3.amazonaws.com/NDependOnlineDemos/GettingStarted_viewlet_swf.html">Getting started</a> and <a href="http://S3.amazonaws.com/NDependOnlineDemos/VisualNDependBasics_viewlet_swf.html">VisualNDepend basics</a>. </p>
<p>2. I reviewed three online tutorials: <a href="http://www.ndepend.com/#Part1">How do I analyze my .NET applications using NDepend?</a>, <a href="http://www.ndepend.com/#Part2">What does the NDepend report tell me about my code?</a> and <a href="http://www.ndepend.com/#Part3">I want to go further to have a better control over my code</a>. </p>
<p>3. I read a recent <a href="http://blog.andreloker.de/post/2008/07/08/NDepend-code-metrics-at-your-service.aspx">NDepend review posted by Andre Loker</a> and previewed <a href="http://codebetter.com/blogs/patricksmacchia/">Patrick Smacchia&#8217;s Blog</a> for his latest comments.</p>
<h3>First Impressions</h3>
<p>Before even opening the software it was very clear that NDepend was super powerful and, as another colleague of mine recently said, &#8220;it can be a mind blower.&#8221;  As I am very sensitive to informati<a href="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image28.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image-thumb13.png" border="0" alt="image" width="244" height="137" align="left" /></a>on overload, I proceeded simply and cautiously by basically following the steps found in the online demos.  The Visual NDepend 2.9.0 IDE is friendly and somewhat familiar as the start page could be compared to that of Visual Studio.  Here you may create/open projects or analyze/compare assemblies using the provided shortcuts.  Additionally, you are presented with quick links to the online demos and the installers for NDepend Visual Studio and <a href="http://www.aisto.com/roeder/dotnet/">Reflector</a> add-ins. </p>
<p><a href="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image29.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image-thumb14.png" border="0" alt="image" width="244" height="183" align="right" /></a>I opted to analyze a set of assemblies.  After selecting a half dozen assemblies managed within my current application, the assembly analysis is run and then, after a few moments, the results are presented within the VisualNDepend UI. </p>
<p>Remember my earlier comment about being sensitive to information overload?  Well, if I wasn&#8217;t ready for it, the tool&#8217;s default display may have knocked me off my seat.  As you can see in the accompanying screen shot, there are many views and the UI is quite busy.  For the experienced user this is great as the numerous windows actually work nicely together.  For a new user, in my opinion, the elaborate UI may be inappropriate &#8212; possibly intimidating &#8212; especially if the new user really only wants to gather a simple metric like how many lines of code (LOC) make up a specific component.</p>
<p>With this said, the UI can be customized and all the information is very useful once you understand it.  Don&#8217;t be intimidated by NDepend even though the first impression can be a &#8220;mind blower.&#8221;</p>
<p>I clicked around the UI for about 30 minutes and I quickly got a good sense of its power.  Certainly the demos, tutorials and blogs noted above helped lessen my learning curve so I encourage you to follow my footsteps.</p>
<h3>Code Query Language (CQL)</h3>
<p>What impressed me most about the NDepend is its <a href="http://www.ndepend.com/CQL.htm">Code Query Language (CQL)</a>.  Per the <a href="http://www.ndepend.com/">NDepend site</a>:</p>
<blockquote><p>NDepend considers your code as a database and you can write some CQL statements to query and check some assertions on this database.</p></blockquote>
<p>Out-of-the-box, NDepend comes with dozens of queries which fall into varying categories from Code Quality to Test Coverage .NET Framework Usage. </p>
<p>And NDepend provides the same 82 code metrics to support you in building your own queries!   Here are a few simple examples of what you can do with the CQL:<a href="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image30.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image-thumb15.png" border="0" alt="image" width="244" height="104" align="right" /></a></p>
<p><em>1. Which public methods have more than 30 lines of code?</em><br />
SELECT METHODS WHERE NbLinesOfCode &gt; 30 AND IsPublic</p>
<p><em>2. Which classes implement System.IDisposable?</em><br />
SELECT TYPES WHERE IsClass AND Implements &#8220;System.IDisposable&#8221;</p>
<p><em>3. Which methods have been refactored recently and is not thoroughly covered by tests?</em><br />
SELECT METHODS WHERE CodeWasChanged AND PercentageCoverage &lt; 100</p>
<p>On top of that you can enable/disable or even edit the out-of-the-box queries.  For example, if you don&#8217;t agree that all static fields should be prefixed with an &#8217;s_&#8217; change the query to validate your standard or remove the check all together.</p>
<p>With the Code Query Language, the sky is the limit.  Did I mention the editor comes with Intellisense?</p>
<h3>Reports</h3>
<p>Go ahead and generate a report.  <a href="http://www.ndepend.com/SampleReports/OnNUnit/NDependReport.html">Check out this example</a> which gives you a run down of the application and assembly metrics, an assembly dependency diagram, CQL Queries and Constraints and much more.  Whereas the VisualNDepend UI is geared toward the architect or lead developer type who is wanting to really dig into an application, the report seems to be more suitable for a less technical audience.  Perhaps the report could be used as part of an executive summary or could complement a developer&#8217;s code review.  Simply, it is a professional output (HTML only, I think) consisting of endless information and even pictures. </p>
<h3>Integration</h3>
<p>Very quickly I wanted to call out that NDepend integrates not only with <a href="http://msdn2.microsoft.com/vstudio/default.aspx">VisualStudio</a> and <a href="http://www.aisto.com/roeder/dotnet/">Reflector</a> but also <a href="http://www.codeproject.com/books/msbuild.asp">MSBuild</a>, <a href="http://nant.sourceforge.net/">NAnt</a>, and <a href="http://confluence.public.thoughtworks.org/display/CCNET">CruiseControl.NET</a>.  I personally think it is great that NDepend was implemented in a manner in which its frequent (read: continuous) and easy (read: automated) use is promoted.  Well done.</p>
<h3>Final Thoughts</h3>
<p>NDepend is darn impressive. It is a &#8220;mind blower&#8221; if you will.  NDepend provides more than ample metrics, a flexible (albeit busy) UI, a customizable query language, professional reports and hooks into applications like Visual Studio and Reflector along with support for processes like automated builds and continuous integration.  If you really want to know your code and you are looking for a tool which provides more than simple application metrics, NDepend may be the right product for you.  I highly suggest you check it out.</p>
<div id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:0921b317-35ab-44a8-8695-9fa6e0a27833" class="wlWriterSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/07/30/analyzing-your-net-code-with-ndepend/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/07/30/analyzing-your-net-code-with-ndepend/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=LtGlej"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=LtGlej" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=JMcl4J"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=JMcl4J" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=MPxWgj"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=MPxWgj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=7K39RJ"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=7K39RJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/07/30/analyzing-your-net-code-with-ndepend/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/07/30/analyzing-your-net-code-with-ndepend/</feedburner:origLink></item>
		<item>
		<title>Introducing Lightning Talks</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/349656853/</link>
		<comments>http://johnnycoder.com/blog/2008/07/29/introducing-lightning-talks/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 17:54:56 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Management]]></category>

		<category><![CDATA[Team]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/07/29/introducing-lightning-talks/</guid>
		<description><![CDATA[The folks I work with are wicked smart.  Go back and read that first sentence again.  This time read it like you are Ben Affleck in Good Will Hunting or one of the guys I used to play summer ball with outside of Boston. Fun right?  Anyway, the point is I work with really smart [...]]]></description>
			<content:encoded><![CDATA[<p>The folks I work with are wicked smart.  Go back and read that first sentence again.  This time read it like you are Ben Affleck in <em>Good Will Hunting</em> or one of the guys I used to play summer ball with outside of Boston. Fun right?  Anyway, the point is I work with really smart people and I like to push random characters voices into the heads of my readers. </p>
<p><img style="margin: 10px" src="http://images.ctv.ca/archives/CTVNews/img2/20070925/465_goodwillinghunting.jpg" alt="" width="240" height="129" align="right" /></p>
<p>Tip Number 1: If you have the means, I suggest you plant yourself in a similar environment.  There&#8217;s nothing you can do to better for your career than surround yourself with talented, smart people who are passionate about their work.  It doesn&#8217;t matter if you are a junior coder, manager-type or CTO.  It&#8217;s just good sense.</p>
<p>The problem with my current environment is we are scattered amongst many projects, across many clients and the opportunity to collaborate doesn&#8217;t knock very often. We do have a weekly team meeting, but it generally focuses on business/management stuff.  I do find that software development talk often surfaces at lunch but arousing conversation around grass fed vs grain fed cattle is equally as likely.  There really was no venue to really talk shop and harness the collective software development knowledge of my coworkers. </p>
<p>So, I suggested we start hosting <a href="http://en.wikipedia.org/wiki/Lightning_Talk">Lightning Talks</a>&#8230; The immediate response was very favorable (everybody likes to hear themselves talk, right?) and this week we held a very quick business/management team meeting and then the development staff started our first round of *modified* Lightning Talks.  I emphasis the word &#8220;modified&#8221; because we broke a rules.  Read on.  We kept things very informal and, in the spirit of lightning talks, intended to host a number of very quick quick 3-10 minute presentations.  Unfortunately, we kind of blew it with the time allotment as my two talks, one on <a href="http://johnnycoder.com/blog/2008/07/22/getting-started-with-ankhsvn/">AnkhSVN</a> and the other on <a href="http://johnnycoder.com/blog/2008/07/28/getting-started-with-inno-setup/">Inno Setup</a>, took 5 minutes and then 45 minutes respectively.  All the same, everyone seemed genuinely interested in presentations and the pseudo-lightning talk concept (although you never know because I work not only with really smart people they are also very kind.)  Perhaps the best evidence of the Lightning Talk success was at least one coworker volunteered to do a presentation next week and our internal Wiki already has a section dedicated to presentation notes. </p>
<p>Tip Number 2: Introduce a similar practice to your workplace.  No matter what you call the meeting, getting coworkers talking about technology is one of the best ways to get introduced to new ideas and sharpen your existing skills. </p>
<p>Wish us luck on future talks.  Let&#8217;s hope my brain doesn&#8217;t get too big.</p>
<div id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:56cfd97f-bfb7-4101-b92a-35d0b764e8e4" class="wlWriterSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/07/29/introducing-lightning-talks/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/07/29/introducing-lightning-talks/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=stSkZj"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=stSkZj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=s88TEJ"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=s88TEJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=CZzs8j"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=CZzs8j" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=j2SxbJ"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=j2SxbJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/07/29/introducing-lightning-talks/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/07/29/introducing-lightning-talks/</feedburner:origLink></item>
		<item>
		<title>Getting Started with Inno Setup</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/348293060/</link>
		<comments>http://johnnycoder.com/blog/2008/07/28/getting-started-with-inno-setup/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 11:18:05 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Deployment]]></category>

		<category><![CDATA[Installers]]></category>

		<category><![CDATA[Recommended]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/07/28/getting-started-with-inno-setup/</guid>
		<description><![CDATA[For the first time in years, I needed to distribute my application to the end user&#8217;s machine via an online download.  To do this effectively and professionally, I, of course, needed an install package.  Over the year, I have used both Wise and InstallShield but they both cost money and I don&#8217;t recall them being [...]]]></description>
			<content:encoded><![CDATA[<p>For the first time in years, I needed to distribute my application to the end user&#8217;s machine via an online download.  To do this effectively and professionally, I, of course, needed an install package.  Over the year, I have used both <a href="http://www.wisesolutions.com/Products/Installations.aspx">Wise</a> and <a href="http://www.acresso.com/products/installation/installshield.htm">InstallShield</a> but they both cost money and I don&#8217;t recall them being all that easy to manage.  This was, however, years ago.  More recently I have, like many developers, used <a href="http://msdn.microsoft.com/en-us/library/aa372866.aspx">Windows Installer</a> to <a href="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image25.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image-thumb10.png" border="0" alt="image" width="339" height="265" align="right" /></a>generate MSIs for very simple (read: file copy) deployments. There&#8217;s nothing flexible or particularly pleasing about MSIs, but one can typically get them created with a few button clicks.  For the installation of internal applications, MSIs are more than tolerable, in my opinion.  Other than those options, I was quite ignorant on the subject of installers so I briefly evaluated three free candidates:</p>
<ul>
<li><a href="http://wix.sourceforge.net/">Windows Installer XML (WiX) Toolset</a> is a Microsoft open source project used to create the Office 2007 installer. WiX includes some advanced capabilities, but it has a steep learning curve even though the scripting language is XML-based.</li>
<li><a href="http://nsis.sourceforge.net/Main_Page">NSIS (Nullsoft Scriptable Install System)</a> is a professional open source system to create Windows installers. It is designed to be as small and flexible as possible and is therefore very suitable for Internet distribution. It has a rich feature list, a good set of online samples and a good community following.</li>
<li><a href="http://www.jrsoftware.org/isinfo.php">Inno Setup</a> is another free, open source installer for Windows programs. First introduced in 1997, Inno Setup today rivals and even surpasses many commercial installers in feature set and stability.</li>
</ul>
<h3>Decision</h3>
<p>After a quick review of each product, I opted to run with Inno Setup primarily because it had the ugliest website, all of their product award links are broken and it isn&#8217;t known by any acronym&#8230;yet.  Joking aside, I chose Jordan Russell&#8217;s Inno Setup because it met all of my requirements almost effortlessly.  Here&#8217;s the rundown of what I needed:</p>
<ul>
<li>Check for the .NET Framework and install if not found</li>
<li>Check if Remote Registry is running and start if stopped.</li>
<li>Check is UAC is enabled and provide user dialogue.</li>
<li>Open website(s).</li>
<li>Create quick launch, desktop, start icons.</li>
<li>Read, update registry.</li>
<li>Ask custom questions and manage response.</li>
<li>Launch applications.</li>
<li>Install silently.</li>
<li>Create associated uninstaller.</li>
<li>Show/acknowledge terms of service.</li>
<li>Display readme.</li>
<li>Customizable/skinnable display.  </li>
<li>Etc</li>
</ul>
<p>Additionally, Inno Setup it is such an easy tool to use and test and it has been around for a long while and has a great <a href="http://www.jrsoftware.org/isinfo.php#features">feature list:</a></p>
<ul>
<li>Support for <strong>all versions of Windows</strong> in use today: Vista, XP, 2008, 2003, 2000, Me, 98, 95, and NT 4.0. (No service packs are required.)</li>
<li>Extensive support for installation of 64-bit applications on the 64-bit editions of Windows. Both the x64 and Itanium architectures are supported. (On the Itanium architecture, Service Pack 1 or later is required on Windows Server 2003 to install in 64-bit mode.)</li>
<li>Supports creation of a <strong>single EXE</strong> to install your program for easy online distribution. Disk spanning is also supported.</li>
<li>Standard Windows 2000/XP-style wizard interface.</li>
<li><strong>Customizable setup types</strong>, e.g. Full, Minimal, Custom.</li>
<li>Complete <strong>uninstall</strong> capabilities.</li>
<li>Installation of files:<br />
Includes integrated support for &#8220;deflate&#8221;, bzip2, and <strong>7-Zip LZMA file compression</strong>. The installer has the ability to compare file version info, replace in-use files, use shared file counting, register DLL/OCX&#8217;s and type libraries, and install fonts.</li>
<li>Creation of shortcuts anywhere, including in the Start Menu and on the desktop.</li>
<li>Creation of registry and .INI entries.</li>
<li>Integrated Pascal scripting engine.</li>
<li>Support for multilingual installs.</li>
<li>Support for passworded and encrypted installs.</li>
<li>Silent install and uninstall.</li>
<li>Full <strong>source code</strong> is available (Borland Delphi 2.0-5.0).</li>
</ul>
<p>Oh, and have I mentioned that it is free? </p>
<h3>Getting Started</h3>
<p>The basic installer includes the Inno Setup Compiler, documentation and numerous samples.  If you want to get started quickly just <a href="http://www.jrsoftware.org/isdl.php">download</a> Inno Setup and review the sample scripts.  You&#8217;ll be creating your own installers in no time.  Alternatively, you could download/install the <a href="http://www.jrsoftware.org/isdl.php#qsp">QuickStart Pack</a>, but I honestly do not think it is necessary.<a href="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image26.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image-thumb11.png" border="0" alt="image" width="221" height="291" align="right" /></a></p>
<p>As I mentioned, a review/compilation of the samples can provide a quick, easy introduction into the impressive tool. All the examples are worth a look, but I feel it is necessary to give a few special mention:</p>
<ul>
<li><strong>Example1.iss, Example2.iss and Example3.iss</strong> provide a great foundation as they demonstrate how to access the registry, add a desktop icon, include a readme file, etc, etc, etc.  </li>
<li>If you are planning to do anything non-standard, play around with the<strong> CodeExample1.iss</strong> sample.  It essentially builds a basic setup, captures every installer event, includes custom functions, and demonstrates how to extract/expand files, display dialogues and issue before and after installer actions. </li>
<li>Finally, if you want to build custom pages, check out <strong>CodeDlg.iss</strong> which demonstrates how to build installer pages with custom questions and user input options.</li>
</ul>
<p>My suggestion is to review the samples from within the Compiler.  The Compiler doesn&#8217;t have intellisense or anything, but it will obviously validate your script and call out where <a href="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image27.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px 10px 5px; border-right-width: 0px" src="http://johnnycoder.com/blog/wp-content/uploads/2008/07/image-thumb12.png" border="0" alt="image" width="342" height="109" align="left" /></a>invalid syntax exists.  The Compiler also allows you to immediately &#8220;run&#8221; your installer script (by clicking on the green arrow button) or compile the script (by clicking on the fourth button from the left.) What the heck is that anyway?  The Compile IDE is a fancy notepad with options and actions.  It&#8217;s simple and I dig it.</p>
<p>Speaking of simple, here&#8217;s an example script.  You would have to build on its foundation if you wanted to do anything fancy, like read from the registry, but these few lines practically do it all.  They copy three files into the Program Files sub directory, displays a read me file and add an icon to the Start Menu.  And all the standard installer pages (splash, location, completion, etc) comes along for free &#8212; free meaning no effort and no code.</p>
<p>[Setup]<br />
AppName=My Program<br />
AppVerName=My Program version 1.5<br />
DefaultDirName={pf}\My Program<br />
DefaultGroupName=My Program<br />
UninstallDisplayIcon={app}\MyProg.exe<br />
Compression=lzma<br />
SolidCompression=yes<br />
OutputDir=userdocs:Inno Setup Examples Output</p>
<p>[Files]<br />
Source: &#8220;MyProg.exe&#8221;; DestDir: &#8220;{app}&#8221;<br />
Source: &#8220;MyProg.chm&#8221;; DestDir: &#8220;{app}&#8221;<br />
Source: &#8220;Readme.txt&#8221;; DestDir: &#8220;{app}&#8221;; Flags: isreadme</p>
<p>[Icons]<br />
Name: &#8220;{group}\My Program&#8221;; Filename: &#8220;{app}\MyProg.exe&#8221;</p>
<h3>Extra Help</h3>
<p>Finding the right syntax wasn&#8217;t always a breeze as everything isn&#8217;t covered in the samples.  With that said, the best online reference I found was an <a href="http://www.agensoft.com/download/addons/inno_manual.pdf">Inno Setup Manual</a> hosted at AgentSoft.com. I can&#8217;t say I know the connection between AgentSoft and Inno but I&#8217;m still very happy to have found the reference.  I also found various &#8220;real world&#8221; installer scripts, like this <a href="http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/phpgwjp/phpgwjp_installer/phpGroupWare.iss?rev=1.3">one</a>, posted online which really helped facilitate my ramp up.</p>
<h3>.NET Framework Install Script</h3>
<p><a name="features"><span style="color: #000000;">In my requirements list,</span></a> I called out the need to check for the .NET Framework and install if it wasn&#8217;t found.  This functionality is a snap using Inno Setup &#8212; just be sure to use the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=4f7ae6fe-f4d1-4196-a372-80eab6d56332&amp;displaylang=en">Client Profile version</a> of the installer.</p>
<p>[Files]<br />
Source: &#8220;Executables\dotnetfx35setup.exe&#8221;; DestDir: &#8220;{tmp}&#8221;; Flags: deleteafterinstall</p>
<p>[Run]<br />
Filename: {tmp}\dotnetfx35setup.exe; Parameters: &#8220;/Q /NORESTART&#8221;; Check: Is35FrameworkInstalled; Flags: runhidden shellexec waituntilterminated; StatusMsg: &#8220;This may forever.&#8221;</p>
<p>[Code]<br />
function Is35FrameworkInstalled():Boolean;<br />
begin<br />
    Result := not RegKeyExists(HKEY_LOCAL_MACHINE, &#8216;SOFTWARE\Microsoft\Net Framework Setup\NDP\v3.5&#8242;);<br />
end;</p>
<h3>Summary</h3>
<p>I&#8217;ll keep it short and sweet: Inno Setup is one slick piece of software that made the dreaded task of creating a custom installer one heck of a lot easier than it could have been.  I&#8217;ve added Inno Setup to my toolbox and I highly suggest you do too.</p>
<div id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:a61f9e0b-f99c-4963-aa45-29bdb5550cb1" class="wlWriterSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/07/28/getting-started-with-inno-setup/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/07/28/getting-started-with-inno-setup/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=GPfYlj"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=GPfYlj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=wW3UjJ"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=wW3UjJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=x988Cj"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=x988Cj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=q9eI2J"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=q9eI2J" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/07/28/getting-started-with-inno-setup/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/07/28/getting-started-with-inno-setup/</feedburner:origLink></item>
		<item>
		<title>Export GridView to Excel within an UpdatePanel</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/346227704/</link>
		<comments>http://johnnycoder.com/blog/2008/07/25/export-gridview-to-excel-within-an-updatepanel/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 02:15:51 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Gridview]]></category>

		<category><![CDATA[Samples]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/07/25/export-gridview-to-excel-within-an-updatepanel/</guid>
		<description><![CDATA[There&#8217;s a ton of information online about exporting a DataGrid or GridView to Excel, but most variations do not consider the GridView may reside within an UpdatePanel.  It goes without saying, but I was disappointed when I recently dusted off my &#8220;Export GridView to Excel&#8221; code snippet and encountered a number of exceptions.  So I [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a ton of information online about exporting a DataGrid or GridView to Excel, but most variations do not consider the GridView may reside within an UpdatePanel.  It goes without saying, but I was disappointed when I recently dusted off my &#8220;Export GridView to Excel&#8221; code snippet and encountered a number of exceptions.  So I revisited a number of links and I collected a working solution.  If you need a &#8220;simple&#8221; way to export your GridView to Excel and you are using an UpdatePanel, I hope the following code finds you well:</p>
<pre class="code"><span style="color: #0000ff;">protected void </span>btnExport_Click(<span style="color: #0000ff;">object </span>sender, <span style="color: #2b91af;">EventArgs </span>e)
{
    <span style="color: #008000;">// Reference your own GridView here
    </span><span style="color: #0000ff;">if </span>(AccountGrid.Rows.Count &gt; 65535)
    {
        DisplayError(<span style="color: #a31515;">"Export to Excel is not allowed" </span>+
            <span style="color: #a31515;">"due to excessive number of rows."</span>);
        <span style="color: #0000ff;">return</span>;
    }

    <span style="color: #0000ff;">string </span>filename = <span style="color: #2b91af;">String</span>.Format(<span style="color: #a31515;">"Results_{0}_{1}.xls"</span>,
        <span style="color: #2b91af;">DateTime</span>.Today.Month.ToString(), <span style="color: #2b91af;">DateTime</span>.Today.Year.ToString());

    Response.Clear();
    Response.AddHeader(<span style="color: #a31515;">"Content-Disposition"</span>, <span style="color: #a31515;">"attachment;filename=" </span>+ filename);
    Response.Charset = <span style="color: #a31515;">""</span>;

    <span style="color: #008000;">// SetCacheability doesn't seem to make a difference (see update)
    </span>Response.Cache.SetCacheability(System.Web.<span style="color: #2b91af;">HttpCacheability</span>.NoCache);  

    Response.ContentType = <span style="color: #a31515;">"application/vnd.xls"</span>;

    System.IO.<span style="color: #2b91af;">StringWriter </span>stringWriter = <span style="color: #0000ff;">new </span>System.IO.<span style="color: #2b91af;">StringWriter</span>();
    System.Web.UI.<span style="color: #2b91af;">HtmlTextWriter </span>htmlWriter = <span style="color: #0000ff;">new </span><span style="color: #2b91af;">HtmlTextWriter</span>(stringWriter);

    <span style="color: #008000;">// Replace all gridview controls with literals
    </span>ClearControls(AccountGrid);

    <span style="color: #008000;">// Throws exception: Control 'ComputerGrid' of type 'GridView'
    // must be placed inside a form tag with runat=server.
    // ComputerGrid.RenderControl(htmlWrite);

    // Alternate to ComputerGrid.RenderControl above
    </span>System.Web.UI.HtmlControls.<span style="color: #2b91af;">HtmlForm </span>form
        = <span style="color: #0000ff;">new </span>System.Web.UI.HtmlControls.<span style="color: #2b91af;">HtmlForm</span>();
    Controls.Add(form);
    form.Controls.Add(AccountGrid);
    form.RenderControl(htmlWriter);

    Response.Write(stringWriter.ToString());
    Response.End();
}

<span style="color: #0000ff;">private void </span>ClearControls(<span style="color: #2b91af;">Control </span>control)
{
    <span style="color: #0000ff;">for </span>(<span style="color: #0000ff;">int </span>i = control.Controls.Count - 1; i &gt;= 0; i--)
    {
        ClearControls(control.Controls[i]);
    }

    <span style="color: #0000ff;">if </span>(!(control <span style="color: #0000ff;">is </span><span style="color: #2b91af;">TableCell</span>))
    {
        <span style="color: #0000ff;">if </span>(control.GetType().GetProperty(<span style="color: #a31515;">"SelectedItem"</span>) != <span style="color: #0000ff;">null</span>)
        {
            <span style="color: #2b91af;">LiteralControl </span>literal = <span style="color: #0000ff;">new </span><span style="color: #2b91af;">LiteralControl</span>();
            control.Parent.Controls.Add(literal);
            <span style="color: #0000ff;">try
            </span>{
                literal.Text =
                    (<span style="color: #0000ff;">string</span>)control.GetType().GetProperty(<span style="color: #a31515;">"SelectedItem"</span>).
                        GetValue(control, <span style="color: #0000ff;">null</span>);
            }
            <span style="color: #0000ff;">catch
            </span>{}
            control.Parent.Controls.Remove(control);
        }
        <span style="color: #0000ff;">else if </span>(control.GetType().GetProperty(<span style="color: #a31515;">"Text"</span>) != <span style="color: #0000ff;">null</span>)
        {
            <span style="color: #2b91af;">LiteralControl </span>literal = <span style="color: #0000ff;">new </span><span style="color: #2b91af;">LiteralControl</span>();
            control.Parent.Controls.Add(literal);
            literal.Text =
                (<span style="color: #0000ff;">string</span>)control.GetType().GetProperty(<span style="color: #a31515;">"Text"</span>).
                    GetValue(control, <span style="color: #0000ff;">null</span>);
            control.Parent.Controls.Remove(control);
        }
    }
    <span style="color: #0000ff;">return</span>;
}</pre>
<pre class="code"> </pre>
<h3>Update: 7/30/2008</h3>
<p>I previously noted that SetCacheability doesn&#8217;t seem to make a difference.  Well, I was right&#8230;until I deployed my code to a site behind SSL.  As it turns out, in order for Internet Explorer to open documents in Office (or any out-of-process, ActiveX document server), Internet Explorer must save the file to the local cache directory and ask the associated application to load the file by using IPersistFile::Load.</p>
<p><a href="http://support.microsoft.com/default.aspx?scid=KB;EN-US;q316431&amp;">http://support.microsoft.com/default.aspx?scid=KB;EN-US;q316431&amp;</a></p>
<p>If the file is not stored to disk, this operation fails. When Internet Explorer communicates with a secure Web site through SSL, Internet Explorer enforces any no-cache request. If the header or headers are present, Internet Explorer does not cache the file. Consequently, Office cannot open the file.</p>
<p>RESOLUTION: Web sites that want to allow this type of operation should remove the no-cache header or headers. In other words, comment out the following line of code particularly if you are running under SSL:</p>
<p>Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); </p>
<p> </p>
<h3>Additional Comments</h3>
<p>Per <a href="http://jinath.wordpress.com/2008/02/18/export-gridview-to-excel-inside-an-update-panel/">Jinath Blog</a>, if you are using an UpdatePanel, you may get a System.WebForms.PageRequestManagerParserErrorException exception.  The solution is to add a PostBackTrigger and give it’s ControlID as the excel export button’s ID or you can move your excel export button out side of the update panel.  I verified both options and they work great.  I ultimately went with the former option as such:</p>
<pre class="code">    ...
    <span style="color: #0000ff;">&lt;/</span><span style="color: #a31515;">ContentTemplate</span><span style="color: #0000ff;">&gt;
    &lt;</span><span style="color: #a31515;">Triggers</span><span style="color: #0000ff;">&gt;
        &lt;</span><span style="color: #a31515;">asp</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">PostBackTrigger </span><span style="color: #ff0000;">ControlID</span><span style="color: #0000ff;">="btnExport" /&gt;
    &lt;/</span><span style="color: #a31515;">Triggers</span><span style="color: #0000ff;">&gt;
&lt;/</span><span style="color: #a31515;">asp</span><span style="color: #0000ff;">:</span><span style="color: #a31515;">UpdatePanel</span><span style="color: #0000ff;">&gt;
</span>...</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p>Per <a href="http://aspalliance.com/771_CodeSnip_Exporting_GridView_to_Excel">ASPAlliance</a>, you may encounter issues a number of issues which require the following solution.  Check out the link (and the comments) for more details if you get stuck.  I only encountered #1 on the list.</p>
<ol>
<li>You may get an exception which states your Control &#8216;Grid&#8217; of type &#8216;GridView&#8217; must be placed inside a form tag with runat=server.  I overcame this by dynamically adding a form to the page and then the GridView to the form before RenderContent().  This solution came per the aforementioned post&#8217;s comments.</li>
<li>You may need to included the following page directive: EnableEventValidation=&#8221;false&#8221;.  I didn&#8217;t need to include this directive.</li>
<li>You may need Override the VerifyRenderingInServerForm Method.  I didn&#8217;t need to do so because I added my GridView control to a &#8220;mocked&#8221; form.<br />
 </li>
</ol>
<p>Per <a href="http://www.c-sharpcorner.com/UploadFile/DipalChoksi/ExportASPNetDataGridToExcel11222005041447AM/ExportASPNetDataGridToExcel.aspx">Dipal Choksi</a>, one can format the spreadsheet results in a generic manner by replacing all controls within the GridView with Literals.  This is reflected in the ClearControls() method above.  My prior implementation merely cleaned up the links associated with the sort functionality tied to the sortable headers.  This solution tackles all cells.</p>
<p>Additional Reference: <a href="http://gridviewguy.com/ArticleDetails.aspx?articleID=26">GridViewGuy</a> </p>
<div id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:00b54b2d-1096-495d-bdd6-aac1a8f61396" class="wlWriterSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/07/25/export-gridview-to-excel-within-an-updatepanel/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/07/25/export-gridview-to-excel-within-an-updatepanel/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=T9RD6j"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=T9RD6j" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=bUjhlJ"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=bUjhlJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=yE5MZj"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=yE5MZj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=d4XssJ"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=d4XssJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/07/25/export-gridview-to-excel-within-an-updatepanel/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/07/25/export-gridview-to-excel-within-an-updatepanel/</feedburner:origLink></item>
		<item>
		<title>TSQL - Self Update</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/345779383/</link>
		<comments>http://johnnycoder.com/blog/2008/07/25/tsql-self-update/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 15:55:10 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Samples]]></category>

		<category><![CDATA[TSQL]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/07/25/tsql-self-update/</guid>
		<description><![CDATA[This morning I needed to compose a very simple SQL routine and it took me around five compiles until I got the syntax right.  All I needed to do was transfer an active status from one entity (in my case a computer) to another.  I decided to implement this by updating the same table in [...]]]></description>
			<content:encoded><![CDATA[<p>This morning I needed to compose a very simple SQL routine and it took me around five compiles until I got the syntax right.  All I needed to do was transfer an active status from one entity (in my case a computer) to another.  I decided to implement this by updating the same table in which I was selecting.  I think the syntax associated with &#8220;self update&#8221; type queries is tricky so this post is so I personally don&#8217;t loose this code snippet and future cycles.  I hope it might help you as well.</p>
<p>This example transfers the status of the source computer to the destination computer.  Nothing fancy&#8230;</p>
<pre class="code"><span style="color: #0000ff;">DECLARE </span>@SourceID <span style="color: #0000ff;">INT</span><span style="color: #808080;">; </span><span style="color: #0000ff;">SET </span>@SourceID <span style="color: #808080;">= </span>2
<span style="color: #0000ff;">DECLARE </span>@DestinationID <span style="color: #0000ff;">INT</span><span style="color: #808080;">; </span><span style="color: #0000ff;">SET </span>@DestinationID <span style="color: #808080;">= </span>1

<span style="color: #0000ff;">DECLARE </span>@Computer <span style="color: #0000ff;">TABLE </span><span style="color: #808080;">(</span>ComputerID <span style="color: #0000ff;">INT</span><span style="color: #808080;">, </span>StatusID <span style="color: #0000ff;">INT</span><span style="color: #808080;">)

</span><span style="color: #0000ff;">INSERT INTO </span>@Computer<span style="color: #808080;">(</span>ComputerID<span style="color: #808080;">, </span>StatusID<span style="color: #808080;">)
</span><span style="color: #0000ff;">SELECT </span>@DestinationID<span style="color: #808080;">, </span>1 <span style="color: #0000ff;">UNION SELECT </span>@SourceID<span style="color: #808080;">, </span>2

<span style="color: #0000ff;">SELECT </span><span style="color: #808080;">* </span><span style="color: #0000ff;">FROM </span>@Computer

<span style="color: #0000ff;">UPDATE </span>A
<span style="color: #0000ff;">SET </span>A<span style="color: #808080;">.</span>StatusID <span style="color: #808080;">= </span>B<span style="color: #808080;">.</span>StatusID
<span style="color: #0000ff;">FROM </span>@Computer A<span style="color: #808080;">, </span>@Computer B
<span style="color: #0000ff;">WHERE </span>B<span style="color: #808080;">.</span>ComputerID <span style="color: #808080;">= </span>@SourceID
<span style="color: #808080;">AND </span>A<span style="color: #808080;">.</span>ComputerID <span style="color: #808080;">= </span>@DestinationID

<span style="color: #0000ff;">SELECT </span><span style="color: #808080;">* </span><span style="color: #0000ff;">FROM </span>@Computer</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">(2 row(s) affected)
ComputerID  StatusID
----------- -----------
1           1
2           2

(2 row(s) affected)

(1 row(s) affected)

ComputerID  StatusID
----------- -----------
1           2
2           2

(2 row(s) affected)</pre>
<p> </p>
<div id="scid:C16BAC14-9A3D-4c50-9394-FBFEF7A93539:c9b74d3c-3b98-49e0-b2c5-9a9102aa744a" class="wlWriterSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><a href="http://www.dotnetkicks.com/kick/?url=http://johnnycoder.com/blog/2008/07/25/tsql-self-update/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://johnnycoder.com/blog/2008/07/25/tsql-self-update/" border="0" alt="kick it on DotNetKicks.com" /></a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/johnnycoder?a=zijDhj"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=zijDhj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=U6SEcJ"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=U6SEcJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=E0bFgj"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=E0bFgj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/johnnycoder?a=WQ0cGJ"><img src="http://feeds.feedburner.com/~f/johnnycoder?i=WQ0cGJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://johnnycoder.com/blog/2008/07/25/tsql-self-update/feed/</wfw:commentRss>
		<feedburner:origLink>http://johnnycoder.com/blog/2008/07/25/tsql-self-update/</feedburner:origLink></item>
		<item>
		<title>Getting Started with AnkhSVN</title>
		<link>http://feeds.feedburner.com/~r/johnnycoder/~3/342878786/</link>
		<comments>http://johnnycoder.com/blog/2008/07/22/getting-started-with-ankhsvn/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 20:27:55 +0000</pubDate>
		<dc:creator>Ben Griswold</dc:creator>
		
		<category><![CDATA[Recommended]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Tools]]></category>

		<category><![CDATA[Version Control]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://johnnycoder.com/blog/2008/07/22/getting-started-with-ankhsvn/</guid>
		<description><![CDATA[I&#8217;ve previously written about managing your Subversion repositories via the TortoiseSVN client.  TortoiseSVN integrates with Windows Explorer and provides a really slick way to do things like view the status of your source code, update your Subversion working copy and commit change.
But as slick as it is, TortoiseSVN requires one to bounce between their IDE [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://johnnycoder.com/blog/2007/01/19/getting-started-with-subversion/">I&#8217;ve previously written</a> about managing your <a href="http://subversion.tigris.org/">Subversion</a> repositories via the <a href="http://tortoisesvn.tigris.org/">TortoiseSVN</a> client.  TortoiseSVN integrates with Windows Explorer and provides a really slick way to do things like view the status of your source code, update your Subversion working copy and commit change.<a href="http://johnnycoder.com/blog/wp-content/uploads/2007/01/WindowsLiveWriter/GettingStartedwithSubVersion_E7CA/image%7B0%7D%5B10%5D.png"><img style="margin: 10px" src="http://johnnycoder.com/blog/wp-content/uploads/2007/01/WindowsLiveWriter/GettingStartedwithSubVersion_E7CA/image%7B0%7D_thumb%5B4%5D.png" border="0" alt="" width="351" height="94" align="right" /></a></p>
<p>But as slick as it is, TortoiseSVN requires one to bounc