<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>JamesWampler.com</title>
	
	<link>http://www.jameswampler.com</link>
	<description>Where Caffeine and Software Developement Converge</description>
	<lastBuildDate>Tue, 12 Jan 2010 19:50:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JamesWampler" /><feedburner:info uri="jameswampler" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>TFS Merging Infinite Loop Madness</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/G8OYESn-hfw/</link>
		<comments>http://www.jameswampler.com/index.php/2010/01/12/tfs-merging-infinite-loop-madness/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 19:50:48 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=207</guid>
		<description><![CDATA[
I made a bug fix to the trunk of one of my projects, which included a change to the project file.  When I tried to merge the trunk into my development branch in TFS, I double clicked on the solution file before I commited my changes.


Now, Visual Studio is reporting this error message in [...]]]></description>
			<content:encoded><![CDATA[<p>
I made a bug fix to the trunk of one of my projects, which included a change to the project file.  When I tried to merge the trunk into my development branch in TFS, I double clicked on the solution file before I commited my changes.
</p>
<p>
Now, Visual Studio is reporting this error message in a dialog box, and clicking OK causes it to reappear over and over and over again.
</p>
<blockquote><p>
TF14093: &#8216;The item $foo\branches\foo-development\src\blah.csproj&#8217; has a pending merge conflict, please run resolve before pending a change against it.
</p></blockquote>
<p>
Hmm, where&#8217;s that pesky Run Resolve command again?  Is it not possible to review pending changes in Visual Studio after a merge but before a commit when a project file has been modified?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2010/01/12/tfs-merging-infinite-loop-madness/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2010/01/12/tfs-merging-infinite-loop-madness/</feedburner:origLink></item>
		<item>
		<title>Fixing Broken Paging Links in WordPress Running on Windows</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/sPUs6j2lYIo/</link>
		<comments>http://www.jameswampler.com/index.php/2010/01/08/fixing-broken-paging-links-in-wordpress-running-on-windows/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 16:00:46 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=190</guid>
		<description><![CDATA[I periodically review Google Analytics and Google Webmaster Tools for a couple of different sites I that manage, and I noticed that there were several pages on my blog with broken links.  It turns out that on any page with a link to &#8220;Recent Posts&#8221; or &#8220;Older Posts&#8221; the links were broken because an [...]]]></description>
			<content:encoded><![CDATA[<p>I periodically review <a href="http://www.google.com/analytics/">Google Analytics</a> and <a href="http://www.google.com/webmasters/tools/">Google Webmaster Tools</a> for a couple of different sites I that manage, and I noticed that there were several pages on my blog with broken links.  It turns out that on any page with a link to &#8220;Recent Posts&#8221; or &#8220;Older Posts&#8221; the links were broken because an extra index.php was added.
</p>
<p>
So, instead of links to <br />/index.php/category/<em>categoryname</em>/page/2<br /> is was seeing<br /> /index.php/<strong>Index.php</strong>/category/<em>categoryname</em>/page/2
</p>
<p>
By adding the following line to the clean_url() method in the <span style="white-space: nowrap">/wp-includes/formatting.php</span> file in the folder where WordPress is installed the correct links will be created.  Make sure you add the link before any if statements.
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'index.php/Index.php'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'index.php'</span><span style="color: #339933;">,</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
Now, my clean_url() method looks like this:
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> clean_url<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$protocols</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$context</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'display'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$original_url</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$url</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">''</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #000088;">$url</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Added line to Fix Broken Paging Link Problem</span>
	<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'index.php/Index.php'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'index.php'</span><span style="color: #339933;">,</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'|[^a-z0-9-~+_.?#=!&amp;;,/:%@$\|*\'()\\x80-\\xff]|i'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$strip</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%0d'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'%0a'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'%0D'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'%0A'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> _deep_replace<span style="color: #009900;">&#40;</span><span style="color: #000088;">$strip</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">';//'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'://'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">/* If the URL doesn't appear to contain a scheme, we
	 * presume it needs http:// appended (unless a relative
	 * link starting with / or a php file).
	 */</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">':'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span> <span style="color: #339933;">&amp;&amp;</span>
		<span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'/'</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'#'</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/^[a-z0-9-]+?\.php/i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$url</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Replace ampersands and single quotes only when displaying.</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'display'</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$context</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/&amp;([^#])(?![a-z]{2,8};)/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&amp;#038;$1'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&amp;#039;'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$protocols</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #000088;">$protocols</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'https'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ftp'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ftps'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'mailto'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'news'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'irc'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'gopher'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'nntp'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'feed'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'telnet'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> wp_kses_bad_protocol<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$protocols</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$url</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> apply_filters<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'clean_url'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$original_url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$context</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>
I found the solution <a href="http://wordpress.org/support/topic/160869/page/2">here</a> from a commenter name Donbert.
</p>
<p>
I just upgraded to WordPress 2.9.1, so I am not sure this change will get overwritten next time I upgrade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2010/01/08/fixing-broken-paging-links-in-wordpress-running-on-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2010/01/08/fixing-broken-paging-links-in-wordpress-running-on-windows/</feedburner:origLink></item>
		<item>
		<title>I Recant.  Clarifying My IOC Rant</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/6OLrgtAfcHo/</link>
		<comments>http://www.jameswampler.com/index.php/2010/01/06/i-recant-clarifying-my-alt-net-rant/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 21:04:18 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=162</guid>
		<description><![CDATA[
Guess what I found in my inbox today&#8230;comments.  I&#8217;ve never had comments before.  It kind sucks that they came from rant.


Yesterday, I spent the day trying to pick an IOC container.  I had a single clear requirement; take the username of the user from either Environment.UserName or HttpContext.Current.User.Identity.Username and pass it into [...]]]></description>
			<content:encoded><![CDATA[<p>
Guess what I found in my inbox today&#8230;comments.  I&#8217;ve never had comments before.  It kind sucks that they came from rant.
</p>
<p>
Yesterday, I spent the day <a href="http://www.jameswampler.com/index.php/2010/01/05/death-to-choice-an-anti-alt-net-rant/">trying to pick an IOC container</a>.  I had a single clear requirement; take the username of the user from either Environment.UserName or HttpContext.Current.User.Identity.Username and pass it into my object.  This assembly could be run from either ASP.NET or Windows Forms, so it would be nice if it were configurable.  There are lots of ways I could do this, but I decided that it was time to pick an IOC container.
</p>
<p>
Hey, guess what?  Every single IOC container in existance does this.  So now what?  Do I just stick the name of each one on a dart board, throw a dart, and that&#8217;s my new IOC container? Unfortunately, I don&#8217;t like random.  I want to know which of these is the best choice for me and my team.
</p>
<p>
So, I start comparing them.  I assume, that if multiple people went to the trouble of building and maintaining several different IOC containers, that there must be a reason for that.  So, what do I want? I am not really a fan of XML configuration.  I don&#8217;t really want to litter my code with attributes or tie it to a specific dependancy.  I want a large enough community that I can get feedback and help from other people and know that bugs are going to get fixed.  Where does that leave me?  Still with too many choices.
</p>
<p>
I am hesitant to just pick one and go with it.  The problem with a lot of development shops, including mine, is that once you pick a tool, it requires an act of God to switch to a different one.  If I pick Unity today, and decide after a couple of months that StructureMap is a better fit, that&#8217;s fine for me, but a lot of my coworkers aren&#8217;t going to want to change without a compelling reason.
</p>
<p>
Logically, I know this decision doesn&#8217;t matter that much.  I know I need to just pick one, learn it as best I can, use it, and I can adjust later if necessary.  Tim Barcz has a great post on <a href="http://www.timbarcz.com/blog/YourIoCContainerChoiceIsNotAFeatureOfYourApplication.aspx">your IOC container not being a feature</a>.  Had I read this post before I spent the whole day weighing my options, I might have just picked one and ran with it instead of blogging my frustration for the whole world to see.
</p>
<p>
Just to clarify a few things from yesterday&#8217;s post:
</p>
<ul>
<li>I don&#8217;t hate having alternatives, I hate not having enough information to make an intelligent choice</li>
<li>I don&#8217;t hate open source.  I wanted an IOC container in the .NET framework because it would have given me an obvious path forward.  All the options I was considering were open source projects</li>
<li>I don&#8217;t really like designers or drag-n-drop development.  But writing code against six different dependancies with six different API&#8217;s and trying to make an informed decision made me wish for the simplicity of dragging a control onto a design surface.</li>
<li>I blew a day of development, not because I didn&#8217;t have good options, but because I can&#8217;t seem to find good information on how to weigh them and I don&#8217;t know enough yet.  Frankly, If I had 5 bad options and 1 good one, I wouldn&#8217;t have had anything to post.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2010/01/06/i-recant-clarifying-my-alt-net-rant/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2010/01/06/i-recant-clarifying-my-alt-net-rant/</feedburner:origLink></item>
		<item>
		<title>Death To Choice: An Anti-ALT.NET Rant</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/LVpmnWoQdvk/</link>
		<comments>http://www.jameswampler.com/index.php/2010/01/05/death-to-choice-an-anti-alt-net-rant/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 20:45:28 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[ALT.NET]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=151</guid>
		<description><![CDATA[
Updated: Because writing a blog post when you are frustrated is never a good idea, I have posted a clarificaton to this post.  Also, I have added some emphasis in a few places to highlight a couple of things that I failed to draw enough attention to.


I like options.  I really do.  [...]]]></description>
			<content:encoded><![CDATA[<p>
<em>Updated: Because writing a blog post when you are frustrated is never a good idea, I have posted a <a href="http://www.jameswampler.com/index.php/2010/01/06/i-recant-clarifying-my-alt-net-rant/">clarificaton to this post</a>.  Also, I have added some emphasis in a few places to highlight a couple of things that I failed to draw enough attention to.</em>
</p>
<p>
<strong>I like options.  I really do.</strong>  This week I made the decision to finally pick an IOC tool.  It&#8217;s not that I haven&#8217;t been using Dependancy Injection.  I have.  It&#8217;s that I no longer want to keep manually creating factories and contructor overloads simply to avoid typing <em>new</em> anywhere in my code.
</p>
<p>
I just really didn&#8217;t want to have to <em>find</em> and learn <strong>ANOTHER</strong> frickin&#8217; tool.  I didn&#8217;t want to spend 40 hours this week comparing Castle Windsor with Ninject, AutoFaq, StructureMap and Unity.    I didn&#8217;t want to carry around yet another 3rd party dll; version control it, teach it, support it and  check for newer versions of it.
</p>
<p>
What I want is to easily wire up a username in class that is used in both Windows Forms and ASP.NET without re-writing the majority of my existing code and spending eight hours reading wiki&#8217;s, Google Groups threads and blog posts.  What I want, <strong>right now</strong>, is for Microsoft to build a me a nice shiny IOC container right into the framework along with a pretty visual designer in Visual Studio.
</p>
<p>
Maybe if the guys who have spent the last four years building their own IOC containers could stop building new IOC containers, stop telling everyone how easy it is to learn an IOC container, and spend a little time updating their freaking documentation, I wouldn&#8217;t be having fond memories of dragging a dataset onto a grid.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2010/01/05/death-to-choice-an-anti-alt-net-rant/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2010/01/05/death-to-choice-an-anti-alt-net-rant/</feedburner:origLink></item>
		<item>
		<title>Happy New Year, 2010!</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/9aLpJ7Ygzlg/</link>
		<comments>http://www.jameswampler.com/index.php/2010/01/01/happy-new-year-2010/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 08:01:29 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Career]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=139</guid>
		<description><![CDATA[
It&#8217;s the new year, so time for another obligatory New Year&#8217;s resolution post.


My general resolution this year is to finish what I start.  I usually have a lot of balls in the air, and it&#8217;s not uncommon for me to abandon a partially finished project (either at work or at home) in favor of [...]]]></description>
			<content:encoded><![CDATA[<p>
It&#8217;s the new year, so time for another obligatory New Year&#8217;s resolution post.
</p>
<p>
My general resolution this year is to finish what I start.  I usually have a lot of balls in the air, and it&#8217;s not uncommon for me to abandon a partially finished project (either at work or at home) in favor of something more important or just more interesting.
</p>
<p>
Every year, I make the resolution to read and understand 12 technical books; 1 per month.  Last year, I only managed eight, so this year I am going to try again.
</p>
<p>
Last year, my professional goals were to learn ASP.NET MVC, NHibernate, and jQuery, which I did.  This year, I would like to expand my knowledge of those three technologies, as well as learn Ruby and the new Microsoft AJAX library.
</p>
<p>
Last, my goal for posting on this blog this year is 3 posts per week, for a total of 156 posts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2010/01/01/happy-new-year-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2010/01/01/happy-new-year-2010/</feedburner:origLink></item>
		<item>
		<title>Merging a .NET .DLL into an .EXE with ILMerge</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/4bpEgRaNQd4/</link>
		<comments>http://www.jameswampler.com/index.php/2009/12/09/merging-a-net-dll-into-an-exe-with-ilmerge/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 17:21:17 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[DOS]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=128</guid>
		<description><![CDATA[I am currently working a C# console application that I want to be able to easily deploy onto multiple machines.  Currently, it is referencing about a half a dozen other DLL&#8217;s that I don&#8217;t want to have to deploy along with it.  I really, really wanted to be able to deploy a single [...]]]></description>
			<content:encoded><![CDATA[<p>I am currently working a C# console application that I want to be able to easily deploy onto multiple machines.  Currently, it is referencing about a half a dozen other DLL&#8217;s that I don&#8217;t want to have to deploy along with it.  I really, really wanted to be able to deploy a single file via xcopy to ensure that I do not accidentally miss any of those dependancies.</p>
<p>ILMerge allows you to merge multiple .NET assesmblies into a single dll or executable.  </p>
<h3>Merging into a DLL</h3>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;">ilmerge.exe /target:library /out:newassembly.dll assembly1.dll assembly2.dll</pre></div></div>

<h3>Merging into an EXE</h3>

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;">ilmerge.exe /target:winexe /out:newassembly.exe assembly1.exe assembly2.dll</pre></div></div>

<p>
You can find <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=22914587-b4ad-4eae-87cf-b14ae6a939b0&#038;displaylang=en">ILMerge here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2009/12/09/merging-a-net-dll-into-an-exe-with-ilmerge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2009/12/09/merging-a-net-dll-into-an-exe-with-ilmerge/</feedburner:origLink></item>
		<item>
		<title>Production Surprise</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/tMZI6-OyVPk/</link>
		<comments>http://www.jameswampler.com/index.php/2009/11/04/production-surprise/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 23:30:35 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=120</guid>
		<description><![CDATA[
I found this while I was debugging a minor production problem this afternoon.


if &#40;userName.Contains&#40;&#34;&#34;&#41;&#41;
	userName = GetUserName&#40;userName&#41;;
&#160;
if &#40;String.IsNullOrEmpty&#40;userName&#41;&#41;
	throw new ArgumentNullException&#40;&#34;userName can not be null.  Verify identity.Name is not empty.&#34;&#41;;


This code was written last month during a refactor of this method, and I can not for the life of me understand what userName.Contains(&#8220;&#8221;) is there for. [...]]]></description>
			<content:encoded><![CDATA[<p>
I found this while I was debugging a minor production problem this afternoon.
</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>userName.<span style="color: #0000FF;">Contains</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
	userName <span style="color: #008000;">=</span> GetUserName<span style="color: #000000;">&#40;</span>userName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span>.<span style="color: #0000FF;">IsNullOrEmpty</span><span style="color: #000000;">&#40;</span>userName<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
	<span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentNullException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;userName can not be null.  Verify identity.Name is not empty.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>
This code was written last month during a refactor of this method, and I can not for the life of me understand what userName.Contains(&#8220;&#8221;) is there for.   I am testing for null or empty strings on the line right below it, and I have never in my life written .Contains(&#8220;&#8221;) to check for an empty string.  There are no code or check-in comments, and it was checked into TFS with my username.  I would feel more ashamed if I wasn&#8217;t partially convinced that someone stole my username and password, logged in as me, wrote this shitty code, and then checked it in.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2009/11/04/production-surprise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2009/11/04/production-surprise/</feedburner:origLink></item>
		<item>
		<title>Creating a Database Object in DAAB from a Dynamic ConnectionString</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/zNPXGOrHQ3Y/</link>
		<comments>http://www.jameswampler.com/index.php/2009/09/04/creating-a-database-object-in-daab-from-a-dynamic-connectionstring/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 06:10:15 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DAAB]]></category>
		<category><![CDATA[EntLib]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=98</guid>
		<description><![CDATA[When using the Database Access Application Block in the Microsoft Enterprise Library, you can define a Database object from a ConnectionString in your project app or web.config.  In my latest project, I needed to create a ConnectionString from information the user enters in the login form.  After a little trial and error, this [...]]]></description>
			<content:encoded><![CDATA[<p>When using the <a href="http://msdn.microsoft.com/en-us/library/cc309504.aspx">Database Access Application Block</a> in the <a href="http://www.codeplex.com/entlib">Microsoft Enterprise Library</a>, you can define a Database object from a ConnectionString in your project app or web.config.  In my latest project, I needed to create a ConnectionString from information the user enters in the login form.  After a little trial and error, this is what I came up with.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">Microsoft.Practices.EnterpriseLibrary.Data</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">Microsoft.Practices.EnterpriseLibrary.Data.Sql</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">class</span> DatabaseFactory
<span style="color: #000000;">&#123;</span>
&nbsp;
     <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> Database CreateDatabase<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> connectionString, <span style="color: #FF0000;">string</span> provider<span style="color: #000000;">&#41;</span>
     <span style="color: #000000;">&#123;</span>
&nbsp;
          DbProviderFactory factory <span style="color: #008000;">=</span> DbProviderFactories.<span style="color: #0000FF;">GetFactory</span><span style="color: #000000;">&#40;</span>provider<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> 
	  Database database <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
&nbsp;
          <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span>.<span style="color: #0000FF;">IsNullOrEmpty</span><span style="color: #000000;">&#40;</span>connectionString<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
	       <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentNullException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;connectionString can not be null or empty.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
	  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>factory <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
	       <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;provider was not a valid type&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
	  <span style="color: #0600FF;">switch</span> <span style="color: #000000;">&#40;</span>factory.<span style="color: #0000FF;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToLower</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
	 <span style="color: #000000;">&#123;</span>
	      <span style="color: #0600FF;">case</span> <span style="color: #666666;">&quot;system.data.sqlclient&quot;</span> <span style="color: #008000;">:</span>
	           database <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> SqlDatabase<span style="color: #000000;">&#40;</span>connectionString<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	           break<span style="color: #008000;">;</span>
	      <span style="color: #0600FF;">default</span><span style="color: #008000;">:</span>
	           database <span style="color: #008000;">=</span>  <span style="color: #008000;">new</span> GenericDatabase<span style="color: #000000;">&#40;</span>connectionString, factory<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		   break<span style="color: #008000;">;</span>
         <span style="color: #000000;">&#125;</span>
&nbsp;
	 <span style="color: #0600FF;">return</span> database<span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Our team already has built some helper classes around working with DAAB Database objects, so it made more sense for us to continuing working with them instead of just creating a DbConnection directly.  I did find a link on <a href="http://www.davidhayden.com/blog/dave/archive/2007/02/22/ReadConnectionStringsWebConfigAppConfig.aspx">David Hayden&#8217;s blog</a> that outlines that approach instead.  The code is at the bottom of the post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2009/09/04/creating-a-database-object-in-daab-from-a-dynamic-connectionstring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2009/09/04/creating-a-database-object-in-daab-from-a-dynamic-connectionstring/</feedburner:origLink></item>
		<item>
		<title>Preventing the User from Navigating Away from a Dirty Page</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/mTx79qDKPUI/</link>
		<comments>http://www.jameswampler.com/index.php/2009/08/31/preventing-the-user-from-navigating-away-from-a-dirty-page/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 23:24:12 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=84</guid>
		<description><![CDATA[A bug popped up in testing today in some code a wrote a few months ago to prevent our users from navigating away from a modified page.  When I did my initial testing, I neglected to test the case where the user makes a change to a single control and then clicks the back [...]]]></description>
			<content:encoded><![CDATA[<p>A bug popped up in testing today in some code a wrote a few months ago to prevent our users from navigating away from a modified page.  When I did my initial testing, I neglected to test the case where the user makes a change to a single control and then clicks the back button without changing focus off that control.  Here is my updated code.  I am sure there are better ways to do this, but this works as an initial pass.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> isDirty <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
window.<span style="color: #660066;">onbeforeunload</span> <span style="color: #339933;">=</span> checkIsDirty<span style="color: #339933;">;</span>
&nbsp;
$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.form input[type='text']&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">keypress</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> isDirty <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.form input[type='text']&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">change</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> isDirty <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.form input[type='checkbox']&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> isDirty <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.form input[type='radio']&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> isDirty <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;.form textarea&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">keypress</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> isDirty <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> checkIsDirty<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isDirty <span style="color: #339933;">==</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'The information on this page has been modified.'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/js/jquery-1.3.2.min.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/js/isdirty.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;form1&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;form&quot;</span>&gt;</span>
     Enter Text Here:
     <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;TextBox1&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
     <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Button1&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Submit&quot;</span> <span style="color: #000066;">onclick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;isDirty=false;&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>

<p>
This works directly against the html inputs, or with the ASP.NET server controls, like asp:TextBox, asp:Checkbox, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2009/08/31/preventing-the-user-from-navigating-away-from-a-dirty-page/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2009/08/31/preventing-the-user-from-navigating-away-from-a-dirty-page/</feedburner:origLink></item>
		<item>
		<title>Always Ask About the Development Environment During an Interview</title>
		<link>http://feedproxy.google.com/~r/JamesWampler/~3/GSU1S4_K5ds/</link>
		<comments>http://www.jameswampler.com/index.php/2009/08/27/always-ask-about-the-development-environment-during-an-interview/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 19:24:06 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Career]]></category>
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://www.jameswampler.com/?p=72</guid>
		<description><![CDATA[
BlogCoward had a post this week that stated that the version of Microsoft Office that a company runs can tell you a lot about the &#8220;sophistication&#8221; of that company.


In the comments, someone commented that the versions of Windows and Internet Explorer they use are also good things to ask about in an interview.  I [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://www.blogcoward.com">BlogCoward</a> had a <a href="http://blogcoward.com/archive/2009/08/25/Microsoft-Office-A-potentially-telling-indicator-of-the-sophistication-level.aspx">post this week</a> that stated that the version of Microsoft Office that a company runs can tell you a lot about the <q>&#8220;sophistication&#8221;</q> of that company.
</p>
<p>
In the comments, someone commented that the versions of Windows and Internet Explorer they use are also good things to ask about in an interview.  I think these are great questions, but I would suggest that you go even further.  As I mentioned in my <a href="http://www.jameswampler.com/index.php/2009/08/26/why-a-developer-needs-the-best-possible-hardware/">last post</a> you are going to spend 40+ hours a week working in this environment, possibly for years, so the environment you work in and the tools you use matter a lot.
</p>
<p>
We just finished interviewing and hiring three new developers on our team this last year, and I was surprised that no one asked any questions about the hardware they would be using, the versions of software we used, about access to training, about access to new tools and software, etc.  Some of it we covered during our interview questions and the tour of our area, but there was still a lot of questions about our day to day work that were never asked about.
</p>
<p>
When I have interviewed in the past, I always make sure I know the answers to the following questions:
</p>
<ol>
<li>What are the specifications for the workstations or laptops you use?  How often are they replaced?  How easy is it to get more RAM, bigger hard drives, etc?  How many monitors do you use?</li>
<li>What version of Visual Studio and the .NET framework do you use?  When do you plan to upgrade?  How long after release of a new version do you wait to upgrade?</li>
<li>How easy is it to get third-party development tools?  Do you use Resharper, Photoshop, third-party database tools, etc?</li>
<li>What application life cycle management (APM) tools do you use?  Do you use Team Foundation Server?  What is your source control system?  What do you use for bug tracking?  How do you manage your builds?</li>
<li>What is the work environment like?  Will I have an office, a cubicle, etc?  Is the work area quite?  Can I have a tour?</li>
<li>Who supports your applications?  Do you rotate an on-call or is there dedicated staff?  Do you handle your own deployments or hand off the responsibility?</li>
<li>What percentage of development is greenfield vs. brownfield?</li>
<li>What is the job track here?  Is there upware mobility?  A promotion path?  What is the pay and bonus structure?</li>
<li>What would my first three months look like?  What projects will I be working on?  Who will I be working with?  Who will I be reporting to?  What do you expect from me at the end of the first three months?</li>
</ol>
<p>
If a company or development team doesn&#8217;t want to or can&#8217;t answer these questions, it will say a lot about them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jameswampler.com/index.php/2009/08/27/always-ask-about-the-development-environment-during-an-interview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.jameswampler.com/index.php/2009/08/27/always-ask-about-the-development-environment-during-an-interview/</feedburner:origLink></item>
	</channel>
</rss>
