<?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.stevesmithblog.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0"><channel><title>Steve Smith's Blog</title><link>http://stevesmithblog.com/</link><description>Musings on Software and the Developer Community</description><generator>Graffiti CMS 1.2 (build 1.2.0.2308)</generator><lastBuildDate>Wed, 17 Mar 2010 14:05:13 GMT</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.stevesmithblog.com/StevenSmith" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="stevensmith" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">StevenSmith</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item><title>ASP.NET MVC 2 and Windows Azure</title><link>http://stevesmithblog.com/blog/asp-net-mvc-2-and-windows-azure/</link><pubDate>Wed, 17 Mar 2010 14:05:13 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/asp-net-mvc-2-and-windows-azure/</guid><dc:creator>ssmith</dc:creator><slash:comments>0</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/ASP.NETMVC2andWindowsAzure_8DE0/image_3.png" width="218" height="308" /&gt; If you upgrade an Azure web instance to use ASP.NET MVC 2, make sure you mark the System.Web.Mvc reference as Copy Local = true.&amp;#160; Otherwise, your deployment will fail.&amp;#160; And you won’t get any good feedback from Windows Azure as to the cause of the problem.&amp;#160; So you’ll start searching the web for help, and perhaps you’ll stumble on this post, and you’ll realize that you didn’t set Copy Local = true on your System.Web.Mvc assembly reference in your ASP.NET MVC 2 web instance.&amp;#160; And you’ll&amp;#160; leave happy (or at least slightly happier) than when you came.&lt;/p&gt;  &lt;p&gt;That is all.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n0i8f1XtTWZMcAn-E2TPP0Jw3Gs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n0i8f1XtTWZMcAn-E2TPP0Jw3Gs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n0i8f1XtTWZMcAn-E2TPP0Jw3Gs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n0i8f1XtTWZMcAn-E2TPP0Jw3Gs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=HDGnmdOi8hY:SS4JfomlQBo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=HDGnmdOi8hY:SS4JfomlQBo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=HDGnmdOi8hY:SS4JfomlQBo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=HDGnmdOi8hY:SS4JfomlQBo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=HDGnmdOi8hY:SS4JfomlQBo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=HDGnmdOi8hY:SS4JfomlQBo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/HDGnmdOi8hY" height="1" width="1"/&gt;</description></item><item><title>Simple Branching and Merging with SVN</title><link>http://stevesmithblog.com/blog/simple-branching-and-merging-with-svn/</link><pubDate>Tue, 16 Mar 2010 16:49:51 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/simple-branching-and-merging-with-svn/</guid><dc:creator>ssmith</dc:creator><slash:comments>0</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;It’s a good idea not to do too much work without checking something into source control.&amp;#160; By “too much work” I mean typically on the order of a couple of hours at most, and certainly it’s a good practice to check in anything you have before you leave the office for the day.&amp;#160; But what if your changes break the build (on the build server – you &lt;strong&gt;do&lt;/strong&gt; have a build server don’t you?) or would cause problems for others on your team if they get the latest code?&amp;#160; The solution with Subversion is branching and merging (incidentally, if you’re using Microsoft Visual Studio Team System, you can shelve your changes and share shelvesets with others, which accomplishes many of the same things as branching and merging, but is a bit simpler to do).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I’m going to assume you have Subversion installed along with the nearly ubiquitous client, &lt;a href="http://tortoisesvn.tigris.org/" rel="nofollow"&gt;TortoiseSVN&lt;/a&gt;.&amp;#160; See my previous post on &lt;a href="http://stevesmithblog.com/blog/installing-visualsvn-subversion/"&gt;installing SVN server&lt;/a&gt; if you want to get it set up real quick (you can put it on your workstation/laptop just to learn how it works easily enough).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When you know you are going to be working on something that you won’t be able to check in quickly, it’s a good idea to start a branch.&amp;#160; It’s also perfectly fine to create the branch after-the-fact (have you ever started something thinking it would be an hour and 4 hours later realized you were nowhere near done?).&amp;#160; In any event, the first thing you need to do is create a &lt;em&gt;branch&lt;/em&gt;.&amp;#160; A branch is simply a copy of the current trunk (a typical subversion setup has root directories called trunk, tags, and branches – it’s a good idea to keep this and to put your branches in the branches folder).&amp;#160; Once you have a new branch, you need to switch your working copy so that it is bound to your branch.&amp;#160; As you work,&amp;#160; you may want to merge in changes that are happening in the trunk to your branch, and ultimately when you are done you’ll want to merge your branch back into the trunk.&amp;#160; When done, you can delete your branch (or not, but it may add clutter).&amp;#160; To sum up:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create a new branch&lt;/li&gt;    &lt;li&gt;Switch your local working copy to the new branch&lt;/li&gt;    &lt;li&gt;Develop in the branch (commit changes, etc.)&lt;/li&gt;    &lt;li&gt;Merge changes from trunk into your branch&lt;/li&gt;    &lt;li&gt;Merge changes from branch into trunk&lt;/li&gt;    &lt;li&gt;Delete the branch&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Create a new branch&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb.png" width="212" height="244" /&gt;&lt;/a&gt; From the root of your repository, right-click and select TortoiseSVN –&amp;gt; Branch/tag… as shown at right (click to enlarge).&amp;#160; This will bring up the Copy (Branch / Tag) interface.&amp;#160; By default the From WC at URL: should be pointing at the trunk of your repository.&amp;#160; I recommend (after ensuring that you have the latest version) that you choose to make the copy from the HEAD revision in the repository (the first radio button).&amp;#160; In the To URL: textbox, you should change the URL from /trunk to /branches/NAME_OF_BRANCH.&amp;#160; You can name the branch anything you like, but it’s often useful to give it your name (if it’s just for your use) or some useful information (such as a datestamp or a bug/issue ID from that it relates to, or perhaps just the name of the feature you are adding.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_2.png" width="221" height="244" /&gt;&lt;/a&gt; When you’re done with that, enter in a log message for your new branch.&amp;#160; If you want to immediately switch your local working copy to the new branch/tag, check the box at the bottom of the dialog (Switch working copy to new branch/tag).&amp;#160; You can see an example at right.&lt;/p&gt;  &lt;p&gt;Assuming everything works, you should very quickly see a window telling you the Copy finished, like the one shown below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_3.png" width="244" height="112" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Switch Local Working Copy to New Branch&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If you followed the instructions above and checked the box when you created your branch, you don’t need to do this step.&amp;#160; However, if you have a branch that already exists and you would like to switch over to working on it, you can do so by using the Switch command.&amp;#160; You’ll find it in the explorer context menu under TortoiseSVN –&amp;gt; Switch:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_4.png" width="205" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This brings up a dialog that shows you your current binding, and lets you enter in a new URL to switch to:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_5.png" width="244" height="148" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In the screenshot above, you can see that I’m currently bound to a branch, and so I could switch back to the trunk or to another branch.&amp;#160; If you’re not sure what to enter here, you can click the […] next to the URL textbox to explore your repository and find the appropriate root URL to use.&amp;#160; Also, the dropdown will show you URLs that might be a good fit (such as the trunk of the current repository).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Develop in the Branch&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Once you have created a branch and switched your working copy to use it,&amp;#160; you can make changes and Commit them as usual.&amp;#160; Your commits are now going into the branch, so they won’t impact other users or the build server that are working off of the trunk (or their own branches).&amp;#160; In theory you can keep on doing this forever, but practically it’s a good idea to periodically merge the trunk into your branch, and/or keep your branches short-lived and merge them back into the trunk before they get too far out of sync.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Merge Changes from Trunk into your Branch&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Once you have been working in a branch for a little while, change to the trunk will have occurred that you’ll want to merge into your branch.&amp;#160; It’s much safer and easier to integrate changes in small increments than to wait for weeks or months and then try to merge in two very different codebases.&amp;#160; To perform the merge, simply go to the root of your branch working copy and right click, select TortoiseSVN-&amp;gt;Merge.&amp;#160; You’ll be presented with this dialog:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_14.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_6.png" width="343" height="315" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In this case you want to leave the default setting, Merge a range of revisions.&amp;#160; Click Next.&amp;#160; Now choose the URL to merge from.&amp;#160; You should select the trunk of your current repository (which should be in the dropdownlist, or you can click the […] to browse your repository for the correct URL).&amp;#160; You can leave everything else blank since you want to merge everything:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_16.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_7.png" width="338" height="314" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Click Next.&amp;#160; Again you can leave the default settings.&amp;#160; If you want to do something more granular than everything in the trunk, you can select a different Merge depth, to include merging just one item in the tree.&amp;#160; You can also perform a Test merge to see what changes will take place before you click Merge (which is often a good idea).&amp;#160; Here’s what the dialog should look like before you click Merge:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_18.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_8.png" width="345" height="314" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After clicking Merge (or Test merge) you should see a confirmation like this (it will say Test Only in the title if you click Test merge):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_20.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_9.png" width="354" height="163" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now you should build your solution, run all of your tests, and verify that your branch still works the way it should, given the updates that you’ve just integrated from the trunk.&amp;#160; Once everything works, Commit your changes, and then continue with your work on the branch.&amp;#160; Note that until you commit, nothing has actually changed in your branch on the server.&amp;#160; Other team members who may also be working in this branch won’t be impacted, etc.&amp;#160; The Merge is purely a client-side operation until you perform a Commit.&lt;/p&gt;  &lt;p&gt;In a more real-world scenario, you may have conflicts.&amp;#160; When you do, you’ll be presented with a dialog like this one:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_24.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_11.png" width="378" height="216" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It’s up to you which option you want to go with.&amp;#160; The more frequently you Merge, the fewer of these you’ll have to deal with.&amp;#160; Also, be very sure that you’re merging the right folders together.&amp;#160; If you try and merge your trunk with some subfolder in your branch’s structure, you’ll end up with all kinds of conflicts and problems.&amp;#160; Fortunately, they’re only on your working copy (unless you commit them!) but if you see something like that, be sure to doublecheck your URL and your local file location.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Merge Your Branch Back Into Trunk&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When you’re done working in your branch, it’s time to pull it back into the trunk.&amp;#160; The first thing you should do is follow the previous step’s instructions for merging the latest from the trunk into your branch.&amp;#160; This lets you ensure that what you have in your branch works correctly with the current trunk.&amp;#160; Once you’ve done that and committed your changes to your branch, you’re ready to proceed with this step.&lt;/p&gt;  &lt;p&gt;Once you’re confident your branch is good to go, you should go to its root folder and select TortoiseSVN-&amp;gt;Merge (as above) from the explorer right-click menu.&amp;#160; This time, select Reintegrate a branch as shown below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_26.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_12.png" width="396" height="367" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Click Next.&amp;#160; &lt;/p&gt;  &lt;p&gt;You’ll want it to merge with the trunk, which should be the default:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_28.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_13.png" width="414" height="376" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Click Next.&lt;/p&gt;  &lt;p&gt;Leave the default settings:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_30.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_14.png" width="418" height="382" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Click Test merge to see a test, and then if all looks good, click Merge.&amp;#160; Note that if you haven’t checked in your working copy changes, you’ll see something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_32.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_15.png" width="349" height="164" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If on the other hand things are successful:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_34.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_16.png" width="353" height="165" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After this step, it’s likely you are finished working in your branch.&amp;#160; Don’t forget to use the ToroiseSVN-&amp;gt;Switch command to change your working copy back to the trunk.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Delete the Branch&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You don’t have to delete the branch, but over time your branches area of your repository will get cluttered, and in any event if they’re not actively being worked on the branches are just taking up space and adding to later confusion.&amp;#160; Keeping your branches limited to things you’re actively working on is simply a good habit to get into, just like making sure your codebase itself remains tidy and not filled with old commented out bits of code.&lt;/p&gt;  &lt;p&gt;To delete the branch after you’re finished with it, the simplest thing to do is choose TortoiseSVN-&amp;gt;Repo Browser.&amp;#160; From there, assuming you did this from your branch, it should already be highlighted.&amp;#160; In any event, navigate to your branch in the treeview on the left, and then right-click and select Delete.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_36.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_17.png" width="349" height="200" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Enter a log message if you’d like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_38.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_18.png" width="244" height="174" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Click OK, and it’s gone.&amp;#160; Don’t be too afraid of this, though.&amp;#160; You can still get to the files by viewing the log for branches, and selecting a previous revision (anything before the delete action):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_40.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/SimpleBranchingandMergingwithSVN_B45F/image_thumb_19.png" width="369" height="326" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If for some reason you needed something that was previously in this branch, you could easily get back to any changeset you checked in, so &lt;strong&gt;you should have absolutely no fear when it comes to deleting branches you’re done with&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If you’re using Eclipse, there’s a nice write-up of the steps required by Zach Cox that I found helpful &lt;a href="http://blogs.sourceallies.com/2010/03/simple-subversion-branching-and-merging/" rel="nofollow"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/08S1qyi_rCYhFxkSK_fPS2vUPi8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/08S1qyi_rCYhFxkSK_fPS2vUPi8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/08S1qyi_rCYhFxkSK_fPS2vUPi8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/08S1qyi_rCYhFxkSK_fPS2vUPi8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=n-B2O3dLu7M:9C8uvvaJt-k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=n-B2O3dLu7M:9C8uvvaJt-k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=n-B2O3dLu7M:9C8uvvaJt-k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=n-B2O3dLu7M:9C8uvvaJt-k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=n-B2O3dLu7M:9C8uvvaJt-k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=n-B2O3dLu7M:9C8uvvaJt-k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/n-B2O3dLu7M" height="1" width="1"/&gt;</description></item><item><title>Fix: SqlDeploy Task Fails with NullReferenceException at ExtractPassword</title><link>http://stevesmithblog.com/blog/fix-sqldeploy-task-fails-with-nullreferenceexception-at-extractpassword/</link><pubDate>Wed, 10 Mar 2010 16:11:01 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/fix-sqldeploy-task-fails-with-nullreferenceexception-at-extractpassword/</guid><dc:creator>ssmith</dc:creator><slash:comments>1</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;Still working on getting a &lt;a href="http://www.jetbrains.com/teamcity/" rel="nofollow"&gt;TeamCity&lt;/a&gt; build working (&lt;a href="http://stevesmithblog.com/blog/could-not-load-type-microsoft-build-framework-buildeventcontext/"&gt;see my last post&lt;/a&gt;).&amp;#160; Latest exception is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\TeamData\Microsoft.Data.Schema.SqlTasks.targets(120, 5): error MSB4018: The &amp;quot;SqlDeployTask&amp;quot; task failed unexpectedly.       &lt;br /&gt;System.NullReferenceException: Object reference not set to an instance of an object.        &lt;br /&gt;at Microsoft.Data.Schema.Common.ConnectionStringPersistence.ExtractPassword(String partialConnection, String dbProvider)        &lt;br /&gt;at Microsoft.Data.Schema.Common.ConnectionStringPersistence.RetrieveFullConnection(String partialConnection, String provider, Boolean presentUI, String password)        &lt;br /&gt;at Microsoft.Data.Schema.Sql.Build.SqlDeployment.ConfigureConnectionString(String connectionString, String databaseName)        &lt;br /&gt;at Microsoft.Data.Schema.Sql.Build.SqlDeployment.OnBuildConnectionString(String partialConnectionString, String databaseName)        &lt;br /&gt;at Microsoft.Data.Schema.Build.Deployment.FinishInitialize(String targetConnectionString)        &lt;br /&gt;at Microsoft.Data.Schema.Build.Deployment.Initialize(FileInfo sourceDbSchemaFile, ErrorManager errors, String targetConnectionString)        &lt;br /&gt;at Microsoft.Data.Schema.Build.DeploymentConstructor.ConstructServiceImplementation()        &lt;br /&gt;at Microsoft.Data.Schema.Extensibility.ServiceConstructor`1.ConstructService()        &lt;br /&gt;at Microsoft.Data.Schema.Tasks.DBDeployTask.Execute()        &lt;br /&gt;at Microsoft.Build.BuildEngine.TaskEngine.ExecuteInstantiatedTask(EngineProxy engineProxy, ItemBucket bucket, TaskExecutionMode howToExecuteTask, ITask task, Boolean&amp;amp; taskResult)&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This time searching yielded some good stuff, including &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vstsdb/thread/a7e08143-f7b8-4647-9758-33fb13176e12" rel="nofollow"&gt;this thread that talks about how to resolve this via permissions&lt;/a&gt;.&amp;#160; The short answer is that the account that your build server runs under needs to have the necessary permissions in SQL Server.&amp;#160; You’ll need to create a Login and then ensure at least the minimum rights are configured as described here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa833413.aspx" rel="nofollow"&gt;Required Permissions in Database Edition&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Alternately, you can just make your buildserver account an admin on the database (which is probably running on the same machine anyway) and at that point it should be able to do whatever it needs to.&lt;/p&gt;  &lt;p&gt;If you’re certain the account has the necessary permissions, but you’re still getting the error, the problem may be that the account has never logged into the build server.&amp;#160; In this case, there won’t be any entry in the HKCU hive in the registry, which the system is checking for permissions (see this &lt;a href="http://social.msdn.microsoft.com/Forums/fi-FI/vstsdb/thread/595f847a-b900-460d-9071-414f5a0750d3" rel="nofollow"&gt;thread&lt;/a&gt;).&amp;#160; The solution in this case is quite simple: log into the machine (once is enough) with the build server account.&amp;#160; Then, open Visual Studio (thanks &lt;a href="http://brendan.enrick.com/"&gt;Brendan&lt;/a&gt; for the answer in &lt;a href="http://social.msdn.microsoft.com/Forums/en/vstsdb/thread/a0f97df1-50b4-491e-85de-3dac105056df?prof=required" rel="nofollow"&gt;this thread&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Make sure the build service account has the necessary database permissions&lt;/li&gt;    &lt;li&gt;Make sure the account has logged into the server so it has the necessary registry hive info&lt;/li&gt;    &lt;li&gt;Make sure the account has run Visual Studio at least once so its settings are established&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In my case I went through all 3 of these steps before I resolved the problem.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GPv6fDs52D5EQZ2inkh-IPuiSfo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GPv6fDs52D5EQZ2inkh-IPuiSfo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GPv6fDs52D5EQZ2inkh-IPuiSfo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GPv6fDs52D5EQZ2inkh-IPuiSfo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=BjbKUb9g_6s:H_54EeGL090:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=BjbKUb9g_6s:H_54EeGL090:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=BjbKUb9g_6s:H_54EeGL090:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=BjbKUb9g_6s:H_54EeGL090:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=BjbKUb9g_6s:H_54EeGL090:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=BjbKUb9g_6s:H_54EeGL090:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/BjbKUb9g_6s" height="1" width="1"/&gt;</description></item><item><title>Could Not Load Type Microsoft.Build.Framework.BuildEventContext</title><link>http://stevesmithblog.com/blog/could-not-load-type-microsoft-build-framework-buildeventcontext/</link><pubDate>Wed, 10 Mar 2010 14:50:07 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/could-not-load-type-microsoft-build-framework-buildeventcontext/</guid><dc:creator>ssmith</dc:creator><slash:comments>2</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;Setting up a &lt;a href="http://www.jetbrains.com/teamcity/" rel="nofollow"&gt;TeamCity&lt;/a&gt; build and got this error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;&lt;/i&gt;C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\TeamData\Microsoft.Data.Schema.SqlTasks.targets(80, 5): error MSB4018: The &amp;quot;SqlSetupDeployTask&amp;quot; task failed unexpectedly.      &lt;br /&gt;System.TypeLoadException: Could not load type 'Microsoft.Build.Framework.BuildEventContext' from assembly 'Microsoft.Build.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.      &lt;br /&gt;at Microsoft.Build.BuildEngine.TaskExecutionModule.SetBatchRequestSize()      &lt;br /&gt;at Microsoft.Build.BuildEngine.TaskExecutionModule..ctor(EngineCallback engineCallback, TaskExecutionModuleMode moduleMode, Boolean profileExecution)      &lt;br /&gt;at Microsoft.Build.BuildEngine.NodeManager..ctor(Int32 cpuCount, Boolean childMode, Engine parentEngine)      &lt;br /&gt;at Microsoft.Build.BuildEngine.Engine..ctor(Int32 numberOfCpus, Boolean isChildNode, Int32 parentNodeId, String localNodeProviderParameters, BuildPropertyGroup globalProperties, ToolsetDefinitionLocations locations)      &lt;br /&gt;at Microsoft.Build.BuildEngine.Engine.get_GlobalEngine()      &lt;br /&gt;at Microsoft.Data.Schema.Build.DeploymentProjectBuilder.CreateDeploymentProject()      &lt;br /&gt;at Microsoft.Data.Schema.Tasks.DBSetupDeployTask.BuildDeploymentProject(ErrorManager errors, ExtensionManager em)      &lt;br /&gt;at Microsoft.Data.Schema.Tasks.DBSetupDeployTask.Execute()      &lt;br /&gt;at Microsoft.Build.BuildEngine.TaskEngine.ExecuteTask(ExecutionMode howToExecuteTask, Hashtable projectItemsAvailableToTask, BuildPropertyGroup projectPropertiesAvailableToTask, Boolean&amp;amp; taskClassWasFound)&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The usual searching didn’t bring back anything useful, but I figured out that I’d missed a dropdownlist in the TeamCity project setup:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/CouldNotLoadTypeMicros.BuildEventContext_8A4C/image_3.png" width="492" height="327" /&gt; &lt;/p&gt;  &lt;p&gt;Originally I was using Microsoft .NET Framework 2.0 for my MSBuild task.&amp;#160; Changing it to 3.5 (as shown above) got me past this error (and on to the next one…).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dPYlYY7fgNO1RLztZJNY9sbWdAs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dPYlYY7fgNO1RLztZJNY9sbWdAs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dPYlYY7fgNO1RLztZJNY9sbWdAs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dPYlYY7fgNO1RLztZJNY9sbWdAs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=HEd3PMC0c7w:sO1MTTaSCZk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=HEd3PMC0c7w:sO1MTTaSCZk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=HEd3PMC0c7w:sO1MTTaSCZk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=HEd3PMC0c7w:sO1MTTaSCZk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=HEd3PMC0c7w:sO1MTTaSCZk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=HEd3PMC0c7w:sO1MTTaSCZk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/HEd3PMC0c7w" height="1" width="1"/&gt;</description></item><item><title>Fix: Can’t Change or Remove Visual Studio 2008 from DVD</title><link>http://stevesmithblog.com/blog/fix-can-rsquo-t-change-or-remove-visual-studio-2008-from-dvd/</link><pubDate>Mon, 08 Mar 2010 18:51:18 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/fix-can-rsquo-t-change-or-remove-visual-studio-2008-from-dvd/</guid><dc:creator>ssmith</dc:creator><slash:comments>1</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;If you installed Visual Studio 2008 on a 64-bit operating system, you may have trouble when you try ad add or remove functionality by inserting the disk (or remounting the ISO image).&amp;#160; I believe this is because of the path used to install the 32-bit Visual Studio program.&amp;#160; When you run the setup.exe off of the disk, you get this:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/FixCantChangeorRemoveVisualStudio2008fro_C2CF/image_3.png" width="512" height="416" /&gt; &lt;/p&gt;  &lt;p&gt;Clicking on Change or Remove Visual Studio 2008 brings up this dialog:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/FixCantChangeorRemoveVisualStudio2008fro_C2CF/image_8.png" width="517" height="397" /&gt; &lt;/p&gt;  &lt;p&gt;But not long after it appears, it disappears to be replaced with:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/FixCantChangeorRemoveVisualStudio2008fro_C2CF/image_9.png" width="501" height="175" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Microsoft Visual Studio 2008 Setup&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;A problem has been encountered while loading the setup components.&amp;#160; Canceling setup.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;FIX: Use Add or Remove Programs&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Launch the Add or Remove Programs dialog in Windows, and find &lt;strong&gt;Microsoft Visual Studio Team System 2008 Team Suite – EN&lt;/strong&gt;&lt;strong&gt;U&lt;/strong&gt; (or whichever SKU you installed).&amp;#160; Click Uninstall/Change.&amp;#160; From here you should be able to change your installed components of Visual Studio successfully:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/FixCantChangeorRemoveVisualStudio2008fro_C2CF/image_12.png" width="511" height="393" /&gt; &lt;/p&gt;  &lt;p&gt;Thanks to &lt;a href="http://brendan.enrick.com"&gt;Brendan&lt;/a&gt; for the tip!&lt;/p&gt;  &lt;p&gt;If you’re still having trouble, or encounter additional problems like “a selected drive is no longer valid. please review your installation path settings” then check out Heath Stewart’s posts:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/heaths/archive/2008/10/06/adding-features-to-visual-studio-2008-may-fail-to-load-setup-components.aspx" rel="nofollow"&gt;Adding features to Visual Studio 2008 may fail to load setup components&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/heaths/archive/2008/08/20/do-not-repair-vs-2008-sp1-from-installation-media.aspx" rel="nofollow"&gt;Do Not Repair VS 2008 SP1 from Installation Media&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QZjQ1lFD5ChWHU1weOrDjzqnayY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QZjQ1lFD5ChWHU1weOrDjzqnayY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QZjQ1lFD5ChWHU1weOrDjzqnayY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QZjQ1lFD5ChWHU1weOrDjzqnayY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=oFLp4Vy6oZA:UgfIc6W5x4Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=oFLp4Vy6oZA:UgfIc6W5x4Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=oFLp4Vy6oZA:UgfIc6W5x4Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=oFLp4Vy6oZA:UgfIc6W5x4Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=oFLp4Vy6oZA:UgfIc6W5x4Y:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=oFLp4Vy6oZA:UgfIc6W5x4Y:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/oFLp4Vy6oZA" height="1" width="1"/&gt;</description></item><item><title>Open Visual Studio Files As Administrator</title><link>http://stevesmithblog.com/blog/open-visual-studio-files-as-administrator/</link><pubDate>Wed, 03 Mar 2010 16:42:16 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/open-visual-studio-files-as-administrator/</guid><dc:creator>ssmith</dc:creator><slash:comments>1</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;Working with IIS as your web server, or working with Azure projects, are two examples of situations in which Visual Studio (2008+) needs to be running as Administrator (on Windows Vista or Windows 7).&amp;#160; If you don’t run it as such, you may be faced with a dialog like this one (for Azure):&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/OpenVisualStudioFilesAsAdministrator_A492/image_6.png" width="479" height="203" /&gt; &lt;/p&gt;  &lt;p&gt;Now of course if you have Visual Studio pinned to your taskbar or start menu, you can launch it as admin by right-clicking and &lt;a href="http://jeffblankenburg.com/2010/02/19th-of-diduary-did-you-know-that-you.aspx" rel="nofollow"&gt;selecting Run As Administrator, as Jeff Blankenburg shows here&lt;/a&gt;.&amp;#160; That’s great for one-off things, but in my scenario I really want to be able to double-click on a .sln file and have it open with Visual Studio as an administrator:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/OpenVisualStudioFilesAsAdministrator_A492/image_5.png" width="527" height="113" /&gt; &lt;/p&gt;  &lt;p&gt;The solution as suggested by &lt;a href="http://twitter.com/JeremySkinner" rel="nofollow"&gt;http://twitter.com/JeremySkinner&lt;/a&gt; is to go and update VSLauncher.exe so that it always runs as administrator.&amp;#160; You’ll find VSLauncher here:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;C:\Program Files (x86)\Common Files\microsoft shared\MSEnv&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Right click on it, select Properties, and then the Compatibility tab.&amp;#160; From here you can check the box for &lt;strong&gt;Run this program as an administrator:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/OpenVisualStudioFilesAsAdministrator_A492/image_9.png" width="423" height="537" /&gt; &lt;/p&gt;  &lt;p&gt;With that done, you can now go right into your project structure in Windows Explorer and open whichever solution or project files you want, and they will open in an Administrator privileged instance of Visual Studio, with the elevated privileges Azure and IIS require.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mCVx8xa3UNLgxE0RvQdv1ddNf2M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mCVx8xa3UNLgxE0RvQdv1ddNf2M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mCVx8xa3UNLgxE0RvQdv1ddNf2M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mCVx8xa3UNLgxE0RvQdv1ddNf2M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=ktNDSgn3Z2o:JR2cAWFW3JE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=ktNDSgn3Z2o:JR2cAWFW3JE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=ktNDSgn3Z2o:JR2cAWFW3JE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=ktNDSgn3Z2o:JR2cAWFW3JE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=ktNDSgn3Z2o:JR2cAWFW3JE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=ktNDSgn3Z2o:JR2cAWFW3JE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/ktNDSgn3Z2o" height="1" width="1"/&gt;</description></item><item><title>Eliminate Repetition with Action&lt;T&gt;</title><link>http://stevesmithblog.com/blog/eliminate-repetition-with-action-lt-t-gt/</link><pubDate>Tue, 02 Mar 2010 21:41:45 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/eliminate-repetition-with-action-lt-t-gt/</guid><dc:creator>ssmith</dc:creator><slash:comments>2</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;Yesterday I was looking at some old code and refactoring it to clean it up (in this case I wasn’t the original author, but I’ve written code just like this).&amp;#160; The application in question was a simple process that had to run once per month, on demand, and so was coded up as an EXE application.&amp;#160; As it ran, it provided updates on its progress, so it looked something like this:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Starting Application @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    var parser = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ParameterParser();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Parameters parameters = parser.Parse(args);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Finalizing Revenue for &amp;quot;&lt;/span&gt; + parameters.DateRange.StartDate.Month + &lt;span style="color: #006080"&gt;&amp;quot;/&amp;quot;&lt;/span&gt; + parameters.DateRange.StartDate.Year);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    IRevenueRepository repository = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; LinqRevenueRepository();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    var mostRecentFinalizedDate = repository.GetMostRecentFinalizedDate();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (mostRecentFinalizedDate &amp;gt;= parameters.DateRange.StartDate)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;&amp;quot;Revenue already finalized for period.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Begin FinalizePublisherRevenue @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    repository.FinalizePublisherRevenue(parameters.DateRange);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;End FinalizePublisherRevenue @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Begin FinalizeAccountManagerRevenue @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    repository.FinalizeAccountManagerRevenue(parameters.DateRange);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;End FinalizeAccountManagerRevenue @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Begin FinalizeAgencyRevenue @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    repository.FinalizeAgencyRevenue(parameters.DateRange);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;End FinalizeAgencyRevenue @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Begin FinalizeAccountManagerRevenueDetail @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    repository.FinalizeAccountManagerRevenueDetail(parameters.DateRange);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;End FinalizeAccountManagerRevenueDetail @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Begin FinalizeAgencyRevenueDetail @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    repository.FinalizeAgencyRevenueDetail(parameters.DateRange);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;End FinalizeAgencyRevenueDetail @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Begin SaveAccountManagerRevenueSummary @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    repository.SaveAccountManagerRevenueSummary(parameters.DateRange);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;End SaveAccountManagerRevenueSummary @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Begin SavePublisherRevenueSummary @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    repository.SavePublisherRevenueSummary(parameters.DateRange);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;End SavePublisherRevenueSummary @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;In reviewing this simple application, I noticed a few areas where it could benefit from obvious improvement that wouldn’t take long at all to implement.&amp;#160; I refactored the core logic into a separate service class, which took in an ILogger rather than writing directly to the console and also created a custom exception to take care of the case where the program was being re-run for a period that had already been finalized.&amp;#160; But the significant improvement came in the area of logging the start/end of each method call, which I did by using an Action&amp;lt;T&amp;gt; method.&amp;#160; You can see in the original code there was a lot of repetition – every method call requires 3 lines that are virtually identical except for the name of the method being called.&amp;#160; Clearly a violation of &lt;a href="http://stevesmithblog.com/blog/don-rsquo-t-repeat-yourself/"&gt;Don’t Repeat Yourself&lt;/a&gt;.&amp;#160; I replaced each 3-line call with a single line method call that took in an Action&amp;lt;DateRange&amp;gt; parameter representing the method to invoke.&amp;#160; The result is that all of the magic strings for the method names disappeared, and the code is much more compact and easily understood:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; FinalizeMonth(DateRange dateRange)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    DateTime mostRecentFinalizedDate = _revenueRepository.GetMostRecentFinalizedDate();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (mostRecentFinalizedDate &amp;gt;= dateRange.StartDate)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; RevenuePreviouslyFinalizedException(&lt;span style="color: #006080"&gt;&amp;quot;Revenue already finalized for period: &amp;quot;&lt;/span&gt; + dateRange);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    ExecuteStep(dateRange, _revenueRepository.FinalizePublisherRevenue);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    ExecuteStep(dateRange, _revenueRepository.FinalizeAccountManagerRevenue);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    ExecuteStep(dateRange, _revenueRepository.FinalizeAgencyRevenue);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    ExecuteStep(dateRange,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;                _revenueRepository.FinalizeAccountManagerRevenueDetail);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    ExecuteStep(dateRange, _revenueRepository.FinalizeAgencyRevenueDetail);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    ExecuteStep(dateRange,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;                _revenueRepository.SaveAccountManagerRevenueSummary);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    ExecuteStep(dateRange, _revenueRepository.SavePublisherRevenueSummary);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; ExecuteStep(DateRange dateRange, Action&amp;lt;DateRange&amp;gt; stepMethod)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    _logger.Info(&lt;span style="color: #006080"&gt;&amp;quot;Begin &amp;quot;&lt;/span&gt; + stepMethod.Method.Name + &lt;span style="color: #006080"&gt;&amp;quot; @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    stepMethod.Invoke(dateRange);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    _logger.Info(&lt;span style="color: #006080"&gt;&amp;quot;End &amp;quot;&lt;/span&gt; + stepMethod.Method.Name + &lt;span style="color: #006080"&gt;&amp;quot; @ &amp;quot;&lt;/span&gt; + DateTime.Now);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Note that within ExecuteStep(), I’m able to extract the name of the method being called by referring to the &lt;strong&gt;Action&amp;lt;T&amp;gt;.Method.Name&lt;/strong&gt; property.&amp;#160; This is something I wasn’t previously aware of, but it helped clean up my code significantly in this case (the FinalizeMonth method is now only about 10 lines of code, instead of the original main() method which was over 30 lines of code.&amp;#160; The new version is also testable, and in fact I added unit tests to confirm everything works as expected, since these also were lacking from the original code.&amp;#160; The result, after about an hour, is something much cleaner that I or another developer will be able to maintain witha greatly reduced learning curve and risk of breakage.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CvHRnZvqthrzvQKYEXDIJaY0oKE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CvHRnZvqthrzvQKYEXDIJaY0oKE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CvHRnZvqthrzvQKYEXDIJaY0oKE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CvHRnZvqthrzvQKYEXDIJaY0oKE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=wq2cFWZv-2E:_DUwgSb-fV0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=wq2cFWZv-2E:_DUwgSb-fV0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=wq2cFWZv-2E:_DUwgSb-fV0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=wq2cFWZv-2E:_DUwgSb-fV0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=wq2cFWZv-2E:_DUwgSb-fV0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=wq2cFWZv-2E:_DUwgSb-fV0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/wq2cFWZv-2E" height="1" width="1"/&gt;</description></item><item><title>SQLite Error IDbCommand and IDbConnection implementation in the assembly System.Data.SQLite could not be found.</title><link>http://stevesmithblog.com/blog/sqlite-error-idbcommand-and-idbconnection-implementation-in-the-assembly-system-data-sqlite-could-not-be-found/</link><pubDate>Fri, 26 Feb 2010 22:35:04 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/sqlite-error-idbcommand-and-idbconnection-implementation-in-the-assembly-system-data-sqlite-could-not-be-found/</guid><dc:creator>ssmith</dc:creator><slash:comments>0</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;I just ran into a problem with SQLite and NHibernate, which was giving me this error message:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The IDbCommand and IDbConnection implementation in the assembly System.Data.SQLite could not be found.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The strange thing was, it worked fine from within Visual Studio, but it died when I used my ClickToBuild.bat file, which calls msbuild and runs my tests from the command line.&amp;#160; A bit of searching led me to &lt;a href="http://stackoverflow.com/questions/1460045/sql-data-sqllite-version-with-nhibernate-2-1" rel="nofollow"&gt;a similar problem on StackOverflow&lt;/a&gt;, which produced the answer:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Use the x64 binaries.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I downloaded the &lt;a href="http://sourceforge.net/projects/sqlite-dotnet2/" rel="nofollow"&gt;latest version of SQLite (SQLite-1.0.65.0-binaries.zip)&lt;/a&gt; and made sure to use the .dll in the x64 folder, and the problem disappeared.&amp;#160; It’s worth noting that I’m running on Windows 7 x64.&amp;#160; I’m assuming that since Visual Studio 2008 is still in the dark ages and only runs as a 32-bit application, that’s the reason why this issue only appeared outside of Visual Studio.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SSSWsxSpuXz-adUPxEpzVsTEypw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SSSWsxSpuXz-adUPxEpzVsTEypw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SSSWsxSpuXz-adUPxEpzVsTEypw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SSSWsxSpuXz-adUPxEpzVsTEypw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=WzhPpV4tVto:Bf15pI8gUe0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=WzhPpV4tVto:Bf15pI8gUe0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=WzhPpV4tVto:Bf15pI8gUe0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=WzhPpV4tVto:Bf15pI8gUe0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=WzhPpV4tVto:Bf15pI8gUe0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=WzhPpV4tVto:Bf15pI8gUe0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/WzhPpV4tVto" height="1" width="1"/&gt;</description></item><item><title>Untrusted Projects and Blocked Files in Visual Studio</title><link>http://stevesmithblog.com/blog/untrusted-projects-and-blocked-files-in-visual-studio/</link><pubDate>Thu, 25 Feb 2010 17:01:52 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/untrusted-projects-and-blocked-files-in-visual-studio/</guid><dc:creator>ssmith</dc:creator><slash:comments>1</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;I was just trying to open a project I was emailed as a zip file from a colleague.&amp;#160; VS2010 opens up saying:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code&gt;You should only open projects from a trustworthy source. The project file 'project' may have come from a location that isn’t fully trusted. It could represent a security risk by executing customer build steps when opened in Microsoft Visual Studio that could cause damage to your computer or compromise your private information.&lt;/code&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Which is fine… but in this case I know the project is OK so I click the box and tell it to get on with it.&amp;#160; Next, I try to run the project, but I am faced with this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Error&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160; The &amp;quot;ValidateXaml&amp;quot; task failed unexpectedly.     &lt;br /&gt;System.IO.FileLoadException: Could not load file or assembly 'file:///C:\Users\Steve\Downloads\SomeFile.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)      &lt;br /&gt;File name: 'file:///C:\Users\Steve\Downloads\SomeFile.dll' ---&amp;gt; System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See &lt;a href="http://go.microsoft.com/fwlink/?LinkId=155569" rel="nofollow"&gt;http://go.microsoft.com/fwlink/?LinkId=155569&lt;/a&gt; for more information. &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark&amp;amp; stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)     &lt;br /&gt;&amp;#160;&amp;#160; at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark&amp;amp; stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)      &lt;br /&gt;&amp;#160;&amp;#160; at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark&amp;amp; stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)      &lt;br /&gt;&amp;#160;&amp;#160; at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark&amp;amp; stackMark)      &lt;br /&gt;&amp;#160;&amp;#160; at System.Reflection.Assembly.LoadFrom(String assemblyFile)      &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.Silverlight.Build.Tasks.ValidateXaml.XamlValidator.Execute(ITask task)      &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.Silverlight.Build.Tasks.ValidateXaml.XamlValidator.Execute(ITask task)      &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.Silverlight.Build.Tasks.ValidateXaml.Execute()      &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()      &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask, Boolean&amp;amp; taskResult) &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Naturally I go to the &lt;a href="http://go.microsoft.com/fwlink/?LinkId=155569" rel="nofollow"&gt;URL it references which talks about loadFromRemoteSources&lt;/a&gt; but in my case this is no help, and in any event is a red herring that hides the real issue.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Windows Wants Me To Be Safe&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;…even if it means I can’t do my work.&amp;#160; It turns out that Visual Studio’s warning wasn’t enough to protect me, but Windows was blocking many of the files I needed for this project to run.&amp;#160; There are a few ways you can fix this – if you’ve already unzipped the project and there are only a couple of such DLLs, you can open each one in Windows Explorer, select Properties, and then click the Unblock button as shown below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/UntrustedProjectsandBlockedFilesinVisual_A92C/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://stevesmithblog.com/files/media/image/WindowsLiveWriter/UntrustedProjectsandBlockedFilesinVisual_A92C/image_thumb.png" width="381" height="519" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Note that if you &lt;strong&gt;Unblock the zip file first, then everything you unzip out of it will also be unblocked&lt;/strong&gt;, so this is the way to go.&amp;#160; Another option, if you have a FAT/FAT32/exFAT file system drive handy (say, a USB Flash Drive), is to simply copy the files to and then from such a drive (it will lose any knowledge of having been blocked, etc. in the transfer).&lt;/p&gt;  &lt;p&gt;There’s a good write-up with &lt;a href="http://blog.falafel.com/2009/12/18/WindowsBlockedFilesVisualStudio2010AndNET4.aspx" rel="nofollow"&gt;some additional information on Scott Frolich’s post to the Falafel blog about Windows Blocked Files&lt;/a&gt;, too.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_alN5i0gUWp857kluU2ZmQPfom0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_alN5i0gUWp857kluU2ZmQPfom0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_alN5i0gUWp857kluU2ZmQPfom0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_alN5i0gUWp857kluU2ZmQPfom0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=jPxXFpa6gaA:fniOJuaHPaE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=jPxXFpa6gaA:fniOJuaHPaE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=jPxXFpa6gaA:fniOJuaHPaE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=jPxXFpa6gaA:fniOJuaHPaE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=jPxXFpa6gaA:fniOJuaHPaE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=jPxXFpa6gaA:fniOJuaHPaE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/jPxXFpa6gaA" height="1" width="1"/&gt;</description></item><item><title>SELECT from a Stored Procedure</title><link>http://stevesmithblog.com/blog/select-from-a-stored-procedure/</link><pubDate>Wed, 24 Feb 2010 16:45:31 GMT</pubDate><guid isPermaLink="true">http://stevesmithblog.com/blog/select-from-a-stored-procedure/</guid><dc:creator>ssmith</dc:creator><slash:comments>4</slash:comments><category domain="http://stevesmithblog.com/blog/">Blog</category><description>&lt;p&gt;Occasionally I find myself wanting to SELECT from a SPROC in SQL Server.&amp;#160; Usually this is because I want to ORDER the results or filter them further with a WHERE clause.&amp;#160; Unfortunately, you can’t just do this:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; *&lt;br /&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;&lt;br /&gt;(&lt;span class="kwrd"&gt;EXEC&lt;/span&gt; mySproc foo, bar)&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;There are several workarounds here, and the appropriate one depends mostly on whether you have any control over the use of the stored procedure, or how it works.&amp;#160; For example, you could choose to use a VIEW instead of a stored procedure.&amp;#160; Unfortunately, a VIEW usually won’t work if you need to pass parameters to your stored procedure (which I’m guessing you are).&amp;#160; If your sproc is literally just a wrapper for a query that has no dependencies on parameters, then yeah, you probably should just use a view, and then of course you can select from it to your heart’s content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;INSERT-EXEC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The simplest approach that doesn’t require making any changes to your perfectly good stored procedure is to declare a temporary table with the appropriate schema to match what the sproc outputs.&amp;#160; Then INSERT the stored procedure’s results into the temp table and SELECT from it.&amp;#160; An example looks like this:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; #&lt;span class="kwrd"&gt;Result&lt;/span&gt;&lt;br /&gt;(&lt;br /&gt;  ID &lt;span class="kwrd"&gt;int&lt;/span&gt;,  Name &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(500), Revenue money&lt;br /&gt;)&lt;br /&gt;INSERT #&lt;span class="kwrd"&gt;Result&lt;/span&gt; &lt;span class="kwrd"&gt;EXEC&lt;/span&gt; RevenueByAdvertiser &lt;span class="str"&gt;'1/1/10'&lt;/span&gt;, &lt;span class="str"&gt;'2/1/10'&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; #&lt;span class="kwrd"&gt;Result&lt;/span&gt; &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; Name&lt;br /&gt;&lt;span class="kwrd"&gt;DROP&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; #Result&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This is the approach I favor when I simply need to apply a WHERE or an ORDER BY to an existing stored procedure.&amp;#160; There are actually quite a few other ways to share data between stored procedures or between ad hoc queries and stored procedures.&amp;#160; Erland Sommerskog has a nice article outline &lt;a href="http://www.sommarskog.se/share_data.html"&gt;How to Share Data Between Stored Procedures&lt;/a&gt; that you might want to read for more options.&lt;/p&gt;

&lt;p&gt;Erland also notes a few &lt;a href="http://www.sommarskog.se/share_data.html#INSERTEXEC"&gt;limitations&lt;/a&gt; to the above approach, which you should keep in mind.&amp;#160; I only use this approach for quick ad hoc queries, not for use in production code, because of the limitations involved.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CBQWg_qqBH6RPws9GYAtrBuLalo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CBQWg_qqBH6RPws9GYAtrBuLalo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CBQWg_qqBH6RPws9GYAtrBuLalo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CBQWg_qqBH6RPws9GYAtrBuLalo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=k61qf5Swg34:ZiXrlixY4yI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=k61qf5Swg34:ZiXrlixY4yI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=k61qf5Swg34:ZiXrlixY4yI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=k61qf5Swg34:ZiXrlixY4yI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.stevesmithblog.com/~ff/StevenSmith?a=k61qf5Swg34:ZiXrlixY4yI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/StevenSmith?i=k61qf5Swg34:ZiXrlixY4yI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/StevenSmith/~4/k61qf5Swg34" height="1" width="1"/&gt;</description></item></channel></rss>
