<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Dave Donaldson</title><link>http://arcware.net/</link><description>Critical thinking in software development</description><generator>Graffiti CMS 1.2 (build 1.2.0.1312)</generator><lastBuildDate>Tue, 06 Jan 2009 16:41:12 GMT</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/arcware" type="application/rss+xml" /><item><title>Test Naming: To Underscore or Not To Underscore</title><link>http://feeds.feedburner.com/~r/arcware/~3/504437684/</link><pubDate>Tue, 06 Jan 2009 16:41:12 GMT</pubDate><guid isPermaLink="false">http://arcware.net/test-naming-to-underscore-or-not-to-underscore/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;As I’ve mentioned a few times in this space before, I am a freak when it comes to naming things, so much so that &lt;a href="http://infozerk.com/averyblog/"&gt;James&lt;/a&gt; even gave me the nickname “The Name Nazi” a couple years ago. But in my ever-expanding quest to constantly challenge the way I think, I’ve been peeking at the conventions being used by BDD’ers where underscores tend to be used for test names and fixtures.&lt;/p&gt;   &lt;p&gt;As someone with a constant eye on the public API design of everything, I’ve never been a fan of using underscores in method names, and when it comes to public APIs, I definitely believe underscores should not be used. But seeing some of the work &lt;a href="http://www.lostechies.com/blogs/sean_chambers/default.aspx"&gt;Sean&lt;/a&gt; and &lt;a href="http://fallenrogue.appspot.com/"&gt;Leon&lt;/a&gt; are doing with certain things internally here at &lt;a href="http://telligent.com"&gt;Telligent&lt;/a&gt; has me re-thinking how I write tests, in particular how I name my tests (this re-thinking is why you hire people smarter than you, but that’s a topic for another day).&lt;/p&gt;  &lt;p&gt;You see, with BDD, test names tend to get very long because they describe behavior very explicitly. Many believe that because of this, using standard Pascal-case for test names leads to less readable names than if you used underscores. Take for example the following three test method names:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CanGetSuccessReturnCodeFromBlogsEndpoint()
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CanGetSuccessReturnCodeFromBlogEndpointById()
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CanGetSuccessReturnCodeFromBlogPostEndpointByKey()&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;All three of those test names are pretty descriptive and kind of lengthy. Now look at them with underscores:&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; can_get_success_return_code_from_blogs_endpoint()
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; can_get_success_return_code_from_blog_endpoint_by_id()
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; can_get_success_return_code_from_blog_endpoint_by_key()&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Do you find these more readable than the Pascal-cased names above? I’ve always considered underscores a bit of noise that is distracting in code, but in this case, I’m starting to reverse that line of thought, at least in terms of test names. For a different look, here’s how the names appear in NUnit GUI:&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;table cellspacing="0" cellpadding="0" width="100%" border="0"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;img title="underscores" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="146" alt="underscores" src="http://arcware.net/files/media/image/WindowsLiveWriter/TestNamingToUnderscoreorNotToUnderscore_A361/underscores_3.png" width="403" border="0" /&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;So for me, I’m going to give underscores in test names a shot and see if it sticks, but what I really want to know is what *you* think. Which way do you prefer, and why?&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/decreasing-developer-ramp-up-time/"&gt;Decreasing Developer Ramp Up Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/nhibernaterepository/"&gt;NHibernateRepository&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/ABBCF86B47512C90935500BFA246393D835AFA43"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/ABBCF86B47512C90935500BFA246393D835AFA43"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/504437684" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/test-naming-to-underscore-or-not-to-underscore/</feedburner:origLink></item><item><title>My Top 5 Posts of 2008, Sort Of</title><link>http://feeds.feedburner.com/~r/arcware/~3/499496811/</link><pubDate>Wed, 31 Dec 2008 14:39:42 GMT</pubDate><guid isPermaLink="false">http://arcware.net/my-top-5-posts-of-2008-sort-of/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;I’ve never actually written a “Top X Posts” post to end the year before, so I figured, what the heck, I’ll do one this year. &lt;a href="http://haacked.com/archive/2008/12/30/not-your-typical-top-ten-of-2008-post.aspx"&gt;As Phil points out&lt;/a&gt;, “I find that somewhat narcissistic, so you know I’m going to do that”.&lt;/p&gt;   &lt;p&gt;And notice I said “sort of” in the title of this post. That’s because on October 1st &lt;a href="http://arcware.net/finally-moved-to-graffiti-and-orcsweb/"&gt;I switched blog engines (from Subtext to Graffiti) and hosting providers (from DiscountASP to OrcsWeb)&lt;/a&gt;, so instead of trying to be completely accurate and aggregate stats across both both engines and both hosting providers, I’m taking the lazy approach and am using only the Top 5 posts since making the switch.&lt;/p&gt;  &lt;p&gt;My guess is these are a pretty good projection of the year anyway, so here are my Top 5 posts for 2008 (sort of), according to Graffiti for the reporting period Oct 1 – Dec 31:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://arcware.net/nhibernaterepository/"&gt;NHibernateRepository&lt;/a&gt;. This post is over two years old but still gets plenty of traffic. The codebase is a bit outdated now; hopefully I can update it soon to take advantage of stuff I’ve learned since then.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://arcware.net/use-a-single-web-config-for-iis6-and-iis7/"&gt;Use a Single Web.Config for IIS6 and IIS7&lt;/a&gt;. The title pretty much says it all.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://arcware.net/charcoal-visual-studio-settings/"&gt;Charcoal Visual Studio Settings&lt;/a&gt;. After avoiding dark-background settings for so long, I finally found a theme I like to code in.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://arcware.net/zune-desktop-theme/"&gt;Zune Desktop Theme&lt;/a&gt;. Another post that’s a couple years old, but helps show how many people out there still use Windows XP.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://arcware.net/bloggers-holiday-charity-challenge/"&gt;Bloggers Holiday Charity Challenge&lt;/a&gt;. This is me taking part in &lt;a href="http://simpable.com/life/ebhcc/"&gt;ScottW’s challenge to spread some love this holiday season&lt;/a&gt;. I’ll be posting my results of this in the next few days.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;And that’ll do it for 2008. See you on the flip side.&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/how-to-move-from-subtext-to-graffiti/"&gt;How to Move from Subtext to Graffiti&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/finally-moved-to-graffiti-and-orcsweb/"&gt;Finally Moved to Graffiti (and OrcsWeb)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/1CC85B1D7564720B85501831029E442D37CBA127"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/1CC85B1D7564720B85501831029E442D37CBA127"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/499496811" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/my-top-5-posts-of-2008-sort-of/</feedburner:origLink></item><item><title>Why Do Some 64-Bit Apps Install to C:\Program Files (x86)?</title><link>http://feeds.feedburner.com/~r/arcware/~3/498668124/</link><pubDate>Tue, 30 Dec 2008 15:11:00 GMT</pubDate><guid isPermaLink="false">http://arcware.net/why-do-some-64-bit-apps-install-to-c-program-files-x86/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;I&amp;rsquo;ve been running 64-bit Vista for awhile now and have experienced almost zero issues. One of the nice things about 64-bit operating systems is their ability to continue to run the thousands of 32-bit applications just fine. In Vista&amp;rsquo;s case, it even goes so far as to segregate the installation of 32-bit apps and 64-bit apps into separate locations: 64-bit apps default to C:\Program Files while 32-bit apps default to C:\Program Files (x86). Heck, you can even &lt;a href="http://arcware.net/tortoisesvn-32-bit-and-64-bit-versions-can-run-side-by-side/"&gt;run 32-bit and 64-bit versions of the same app side-by-side&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;But have you ever went to install a 64-bit app and notice it default to the C:\Program Files (x86) directory? I recently stumbled into this when installing &lt;a href="http://www.microsoft.com/windows/products/winfamily/virtualpc/default.mspx"&gt;Virtual PC 2007 (x64)&lt;/a&gt; after rebuilding my desktop. During installation I noticed its default location to be C:\Program Files (x86) which I found very odd. Shouldn&amp;rsquo;t it be defaulting to C:\Program Files instead? Should I change the default location? Am I installing the right version?&lt;/p&gt;
&lt;p&gt;Because of this, I posted a few tweets that said something along the lines of, &amp;ldquo;Why didn&amp;rsquo;t Microsoft change the default install directory for Vistual PC 2007 x64? Was it really that hard?&amp;rdquo;. Well, later on I was straightened out by my old &lt;a href="http://develop.com"&gt;DevelopMentor&lt;/a&gt; colleague &lt;a href="http://mcwtech.com/cs/blogs/brianr/"&gt;Brian Randell&lt;/a&gt;, who sent me a direct message clearing up my confusion. Basically Brian told me that Virtual PC 2007 x64 is in fact a 32-bit application, but with 64-bit drivers.&lt;/p&gt;
&lt;p&gt;So there you go. It didn&amp;rsquo;t occur to me that the &amp;ldquo;x64&amp;rdquo; in the title could just mean 64-bit drivers. I assumed it meant the app is a true 64-bit app. My mistake, but at least I learned something.&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/tortoisesvn-32-bit-and-64-bit-versions-can-run-side-by-side/"&gt;TortoiseSVN 32-bit and 64-bit Versions Can Run Side-by-Side&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/every-beginning-has-an-end-and-tattoos/"&gt;Every Beginning Has An End (And Tattoos)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/B2E129BE65DBFA6F69E31801C587DB020930E1F5"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/B2E129BE65DBFA6F69E31801C587DB020930E1F5"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/498668124" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/why-do-some-64-bit-apps-install-to-c-program-files-x86/</feedburner:origLink></item><item><title>UI Design First, Then Everything Else</title><link>http://feeds.feedburner.com/~r/arcware/~3/498114334/</link><pubDate>Mon, 29 Dec 2008 22:58:54 GMT</pubDate><guid isPermaLink="false">http://arcware.net/ui-design-first-then-everything-else/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;One of the things I wanted to do &lt;a href="http://arcware.net/christmas-vacation-to-do-list/"&gt;while on Christmas break&lt;/a&gt; was to begin building a custom web site for our travel baseball organization. The existing one is outdated and horribly designed and while I’m by no means the World’s Greatest Web Site Designer, I’ve been around long enough to have an understanding of what good design looks like.&lt;/p&gt;   &lt;p&gt;So to build this new web site, I’m taking a different approach than what I’ve normally done. Instead of starting from the database and working my way “up” to the user interface, I’m beginning with the UI and will work my way “down” to the storage level (which may end up in &lt;a href="http://www.microsoft.com/azure/sql.mspx"&gt;Azure SQL Services&lt;/a&gt;, just for kicks). The former approach has usually worked out just fine, as it made sense that the UI would just “plug in” to the business/services layer and all would be well, but I’m trying to expand how I think about design, so I thought I’d flip my thought process and see how things go.&lt;/p&gt;  &lt;p&gt;As I start on the UI design, I’ve decided to do it entirely with paper. I know that &lt;a href="http://balsamiq.com/"&gt;Balsamiq&lt;/a&gt; has been making some headway with online mockups, but I tried it and although it’s cool and slick, it still doesn’t feel as natural to me as manually drawing on a piece of paper (or whiteboard). So what I’ve done is put all of my UI mockups in a spiral notebook (remember those?) for easy access whenever I need it (sitting on the couch, laying in bed, wherever). Here’s a sample of a couple pages:&lt;/p&gt;  &lt;p&gt;   &lt;table width="100%" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top"&gt;&lt;img title="paper-design" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="379" alt="paper-design" src="http://arcware.net/files/media/image/WindowsLiveWriter/UIDesignFirstThenEverythingElse_EC2D/paper-design_3.jpg" width="504" border="0" /&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;It’s been nice to have all these UI mockups and other design thoughts located in a single binder. Everything is right there together for quick and easy reference, and I can scribble in the margins to note certain behaviors and whatever else comes to mind. Ultimately the way I want this to work is to take a mockup and code it from the UI on down, thus implementing the site in end-to-end slices that eventually make up the whole site.&lt;/p&gt;  &lt;p&gt;Another reason I wanted to start with the UI first is because I think it will help flush out a better API with regards to the business and data layers. I’ve always used tests to flush out API design in those layers, and while I’ll still write tests here, I think having the UI up front will help even more.&lt;/p&gt;  &lt;p&gt;So what do you think? Have you ever taken this approach? If so, how did it go? Was it better than going bottom-up?&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/decreasing-developer-ramp-up-time/"&gt;Decreasing Developer Ramp Up Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/every-beginning-has-an-end-and-tattoos/"&gt;Every Beginning Has An End (And Tattoos)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/44CBDA8687572B01B58E453BAF106AF0CAB21E19"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/44CBDA8687572B01B58E453BAF106AF0CAB21E19"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/498114334" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/ui-design-first-then-everything-else/</feedburner:origLink></item><item><title>Using svn:externals to Manage Project References</title><link>http://feeds.feedburner.com/~r/arcware/~3/490785340/</link><pubDate>Sat, 20 Dec 2008 19:33:52 GMT</pubDate><guid isPermaLink="false">http://arcware.net/using-svn-externals-to-manage-project-references/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;Almost every project I've ever worked on has had dependencies on external projects, whether it was web services, components, or libraries, and working at &lt;a href="http://telligent.com"&gt;Telligent&lt;/a&gt; is no different. But what's been interesting is how we manage internal dependencies, especially with regards to building &lt;a href="http://communityserver.com"&gt;Community Server&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The core Community Server product is developed using a single Visual Studio solution that contains many projects, and for the projects in that solution, we use project references and all is good. Where it gets interesting is when Community Server needs something outside of the solution, but still built by us.&lt;/p&gt; &lt;h3&gt;The Infamous lib Folder&lt;/h3&gt; &lt;p&gt;Like many projects, we used to have a folder named lib, and the original intent of the lib folder was that it would contain all third-party assemblies used by Community Server (things like &lt;a href="http://www.rssdotnet.com/"&gt;RSS.NET&lt;/a&gt; and &lt;a href="http://www.xml-rpc.net/"&gt;CookComputing.XmlRpc&lt;/a&gt;). Then to reference those third-party assemblies, we simply used a file reference from the proper project(s) and life was good.&lt;/p&gt; &lt;p&gt;However, Community Server not only depends on third-party assemblies, but also some internal non-Community Server specific assemblies. These are things we internally refer to as the Telligent.* assemblies; assemblies that can be used cross-product, such as Telligent.Caching and Telligent.Common. Those assemblies are not part of the Community Server solution and are maintained separately.&lt;/p&gt; &lt;p&gt;What we used to do with these other assemblies was to also add them to the lib folder, which worked for awhile, but was problematic. For instance, if Telligent.Caching was updated, it was too easy to forgot to put the updated version in the lib folder, thus increasing the risk that the wrong version of Telligent.Caching would be shipped with Community Server. And of course the problem was compounded for each additional dependency, and more risk was incurred. We tried using post-build events to help manage that process, but it was kind of messy and people would still forget to check-in the updated versions to the lib folder.&lt;/p&gt; &lt;h3&gt;FallenRogue to the Rescue&lt;/h3&gt; &lt;p&gt;As we marched closer to the CS 2008.5 and &lt;a href="http://communityserver.com/products/evolution/"&gt;CS Evolution&lt;/a&gt; releases, it became clear that our &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; repositories needed some restructuring. The overall structure wasn't necessarily bad, but there were several things in the wrong place and/or that needed to be consolidated.&lt;/p&gt; &lt;p&gt;During this time &lt;a href="http://fallenrogue.appspot.com/"&gt;Leon&lt;/a&gt; and I were brainstorming about what problems we were having and what changes needed to be made, with one of those changes being how we managed those pesky project references. And if I remember correctly, Leon asked "Why aren't we using svn:externals?" to which I replied "Huh?" :-)&lt;/p&gt; &lt;p&gt;After much discussion, I was having problems wrapping my head around what Leon was explaining because I couldn't quite visualize it; what we needed was for the two of us to stand at a big whiteboard and draw it all out. So, having a large whiteboard in my home office, and Leon being only an hour away, he drove to my place a few days later (with &lt;a href="http://danhounshell.com/blogs/dan/default.aspx"&gt;Dan H&lt;/a&gt; in tow) to spend a day working on this. What we hashed out that day with svn:externals has made a huge improvement in how we manage our project references.&lt;/p&gt; &lt;h3&gt;3rdParty, Assemblies, and References, Oh My!&lt;/h3&gt; &lt;p&gt;The first thing we decided was to eliminate the lib folder, at least in its current form. Instead, we would have a folder named 3rdParty that would contain *only* true third-party assemblies. Any assembly we use that is not ours goes into the 3rdParty folder. Simple enough.&lt;/p&gt; &lt;p&gt;That change leaves us with the question of where we put the other non-Community Server specific assemblies, and this is where svn:externals comes into play. So just what is svn:externals exactly? According to &lt;a href="http://svnbook.red-bean.com/en/1.0/ch07s03.html"&gt;this section of the SVN Book&lt;/a&gt; its:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;"An externals definition is a mapping of a local directory to the URL — and possibly a particular revision — of a versioned resource."&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;What we wanted to do was designate a folder that would contain all of our other references, but set it up in a way that would automatically keep those other references up-to-date; this is accomplished using svn:externals. To see it in action, first look at the following folder structures:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;table border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top"&gt;&lt;strong&gt;Trunk of Community Server&lt;/strong&gt;&lt;br&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="649" alt="svn-externals-1" src="http://arcware.net/files/media/image/WindowsLiveWriter/UsingsvnexternalstoManageDependencies_9481/svn-externals-1_6.png" width="288" border="0"&gt;&lt;/td&gt; &lt;td valign="top"&gt;&lt;strong&gt;Trunk of Telligent.Caching&lt;/strong&gt;&lt;br&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="157" alt="svn-externals-2" src="http://arcware.net/files/media/image/WindowsLiveWriter/UsingsvnexternalstoManageDependencies_9481/svn-externals-2_3.png" width="350" border="0"&gt;  &lt;p&gt;&lt;/p&gt;&lt;strong&gt;Trunk of Telligent.Common&lt;/strong&gt;&lt;br&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="157" alt="svn-externals-3" src="http://arcware.net/files/media/image/WindowsLiveWriter/UsingsvnexternalstoManageDependencies_9481/svn-externals-3_6.png" width="348" border="0"&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Notice how all three projects have an Assemblies folder, while Community Server has an additional folder named References. These are defined as such:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Assemblies&lt;/strong&gt;: Contains the compiled output of the project. For example, when the Telligent.Caching project is compiled, a post-build event runs that copies all of its dll files to its Assemblies folder, and those assemblies are check-in to Subversion. The Assemblies folder is what is used by svn:externals.  &lt;li&gt;&lt;strong&gt;References&lt;/strong&gt;: Contains the assemblies for all non-third party references. For example, the References folder for Community Server contains the assemblies for Telligent.Caching and Telligent.Common, among others.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If we expand the References folder for Community Server, this is what we see:&lt;/p&gt; &lt;p&gt; &lt;table width="100%" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="239" alt="svn-externals-4" src="http://arcware.net/files/media/image/WindowsLiveWriter/UsingsvnexternalstoManageDependencies_9481/svn-externals-4_3.png" width="238" border="0"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;Each folder in References corresponds to the Assemblies folder of its respective project. For example, the Telligent.Caching folder in References is linked to the Assemblies folder we saw above in the Telligent.Caching project. Thus, the Telligent.Caching folder we see in References contains the exact same dll files as the Assemblies folder in the Telligent.Caching project. This is svn:externals in action.&lt;/p&gt; &lt;h3&gt;Setting Up svn:externals&lt;/h3&gt; &lt;p&gt;To set all of this up, first create a References folder and add it to Subversion. &lt;strong&gt;Leave it completely empty and don't put anything else in it; it gets its contents from svn:externals later&lt;/strong&gt;. Once it's part of Subversion, you can apply svn:externals to it by (using TortoiseSVN) right-clicking on it, going to TortoiseSVN, selecting Properties, and clicking New. If you then click the dropdown list in the top right corner, this is what you'll see:&lt;/p&gt; &lt;table width="100%" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="428" alt="svn-externals-5" src="http://arcware.net/files/media/image/WindowsLiveWriter/UsingsvnexternalstoManageDependencies_9481/svn-externals-5_3.png" width="525" border="0"&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;There are all kinds of Subversion properties you can use, but when you select svn:externals, you simply enter key-value pairs in the Property Value textbox. More accurately, svn:externals is a collection of one or more key-value pairs. The svn:externals property for the References folder in Community Server looks like this:&lt;/p&gt; &lt;table width="100%" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="428" alt="svn-externals-6" src="http://arcware.net/files/media/image/WindowsLiveWriter/UsingsvnexternalstoManageDependencies_9481/svn-externals-6_3.png" width="629" border="0"&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;If you look closely, each entry is simply a name (the key), followed by a space, followed by a fully-qualified Subversion URL to the appropriate Assemblies folder (the value). For example, Telligent.Caching is setup with the name "Telligent.Caching", followed by a space, followed by "svn://svn.telligent.com/Product/Telligent/Telligent.Caching/Trunk/Assemblies".&lt;/p&gt; &lt;p&gt;&lt;em&gt;Note that the name in the key-value pair will be the name of the folder for that project that gets put into the References folder.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Once you've entered all key-value pairs and click OK, you must do two things:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Commit those changes to Subversion for the References folder, then  &lt;li&gt;Re-get the References folder. At this point when you re-get References, it will get populated with the contents of the folder(s) it was linked to with svn:externals. In our case this is the contents of various Assemblies folders of several other projects.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Essentially what's happening is that svn:externals acts as a linker of sorts, so that when you update your local working copy, Subversion will ensure the References folder is automatically updated with the current revisions of the folders defined in the svn:externals property.&lt;/p&gt; &lt;p&gt;You can even setup svn:externals to pull only specific revisions instead of the most current. For example, let's say recent changes to Telligent.Caching broke something in Community Server and, because of other factors, can't be addressed right away. But because we knew the previous revision worked fine, we can update svn:externals on the References folder to pull that specific revision for the Telligent.Caching assemblies. Simply edit the Telligent.Caching key-value pair in svn:externals of the References folder to include a revision number, like so:&lt;/p&gt; &lt;table width="100%" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="428" alt="svn-externals-7" src="http://arcware.net/files/media/image/WindowsLiveWriter/UsingsvnexternalstoManageDependencies_9481/svn-externals-7_3.png" width="629" border="0"&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;em&gt;Notice the -r490 in the Telligent.Caching key-value pair. This says for Telligent.Caching, only pull revision 490 because that's the last known working version.&lt;/em&gt;&lt;/p&gt; &lt;h3&gt;Tying it Back to Visual Studio&lt;/h3&gt; &lt;p&gt;To circle back around to our Visual Studio projects, the various assemblies in the folders of the References folder is what our projects use for file references with regards to all the other non-third party assemblies we need. For example, if a project requires Telligent.Caching, it references Telligent.Caching.dll found in the References\Telligent.Caching folder, and if a project requires Telligent.Common, it references Telligent.Common.dll found in the References\Telligent.Common folder, and so on and so on.&lt;/p&gt; &lt;h3&gt;Wrapping Up&lt;/h3&gt; &lt;p&gt;I realize it might take a couple readthroughs of this post to fully grasp what's happening and how to use svn:externals, but once you get it you'll realize it's actually quite simple, and very effective. Feel free to ping me with questions and I'll try to help where I can.&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
 Tagged as 
&lt;a href="http://arcware.net/tags/subversion/"&gt;subversion&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/tortoisesvn/"&gt;tortoisesvn&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/telligent/"&gt;telligent&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/communityserver/"&gt;communityserver&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/nhibernaterepository/"&gt;NHibernateRepository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/every-beginning-has-an-end-and-tattoos/"&gt;Every Beginning Has An End (And Tattoos)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/6899BDA31A420FF1838F69AB60EC3BE9BAFC463A"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/6899BDA31A420FF1838F69AB60EC3BE9BAFC463A"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/490785340" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/using-svn-externals-to-manage-project-references/</feedburner:origLink></item><item><title>Christmas Vacation To-Do List</title><link>http://feeds.feedburner.com/~r/arcware/~3/488259399/</link><pubDate>Thu, 18 Dec 2008 03:19:40 GMT</pubDate><guid isPermaLink="false">http://arcware.net/christmas-vacation-to-do-list/</guid><dc:creator>Dave</dc:creator><slash:comments>1</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;Like many people, this is my last work week of the year. After this Friday I am officially off work until Jan. 5, 2009 (but only for two days because then I'm off again the rest of that week for &lt;a href="http://codemash.org"&gt;CodeMash&lt;/a&gt;, hehe), and I'm really looking forward to it. It's the first time since before I was a consultant that I've had the last two weeks of the year off, and it's even better this time because it coincides exactly with my kids' Christmas break from school.&lt;/p&gt; &lt;p&gt;But even though I'm officially off work doesn't mean I won't be busy with "work". You see, I've always looked forward to this time off because it allows me to catch up on things that I've been meaning to spend time with. So not only do I look forward to using my boys' as &lt;a href="http://gearsofwar.xbox.com/uploadedImages/Media/screenshots/GOW2_Screenshots/DizzyMeatShield.jpg"&gt;meatshields in Gears of War 2&lt;/a&gt;, but I've got a nice laundry list of things I plan on spending time with, such as:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;ASP.NET MVC&lt;/li&gt; &lt;li&gt;jQuery&lt;/li&gt; &lt;li&gt;Fluent NHibernate&lt;/li&gt; &lt;li&gt;Ninject&lt;/li&gt; &lt;li&gt;Rhino Mocks&lt;/li&gt; &lt;li&gt;LINQ&lt;/li&gt; &lt;li&gt;Azure&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I've dabbled in most of these over the past year, but nothing with real significance that I could consider myself an expert in, so it's time to get deeper with this stuff, and Christmas break is the perfect time to do it. To do this, I'm going to try to use them all together on a side project building a custom web site for our travel baseball organization. There's no better way to learn than by doing.&lt;/p&gt; &lt;p&gt;So what about you? Are you off for Christmas break? Do you have a similar to-do list?&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/clarity/"&gt;Clarity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/every-beginning-has-an-end-and-tattoos/"&gt;Every Beginning Has An End (And Tattoos)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/776C0D886922FCF5BA9D96404347CDEF1699BDE1"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/776C0D886922FCF5BA9D96404347CDEF1699BDE1"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/488259399" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/christmas-vacation-to-do-list/</feedburner:origLink></item><item><title>How to Link to Your Xbox Live Avatar</title><link>http://feeds.feedburner.com/~r/arcware/~3/483886107/</link><pubDate>Sat, 13 Dec 2008 19:05:14 GMT</pubDate><guid isPermaLink="false">http://arcware.net/how-to-link-to-your-xbox-live-avatar/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;For everyone out there on Xbox Live, you've no doubt updated your Xbox 360 console to the New Xbox Experience (NXE) by now. I won't go into all the new features here, but I did want to point out something everyone might not be aware of yet: that you can add your Xbox Live avatar to any web site now.&lt;/p&gt;   &lt;p&gt;For those unfamiliar (ahem, &lt;a href="http://kohari.org/"&gt;Nate&lt;/a&gt;), part of NXE is a complete revamp of the avatar system. Before NXE, all you had was the ability to pick from static images, either from the standard ones that come with the console or by buying others from the &lt;a href="http://marketplace.xbox.com/en-US"&gt;Xbox Live Marketplace&lt;/a&gt;. But with NXE you can build your own avatar, with different hairstyles, clothes, accessories, etc. The avatars are definitely a rip-off from the Mii system on the Wii console, but they look a lot better.&lt;/p&gt; &lt;p&gt;With the NXE launch, Microsoft also increased the integration of the &lt;a href="http://www.xbox.com/en-US/live/"&gt;Xbox Live web site&lt;/a&gt; with the Xbox Live platform itself, with one of those integration points being the avatars. If you check out the &lt;a href="http://www.xbox.com/en-US/live/avatars/"&gt;avatars page&lt;/a&gt;, you'll see a section that says "Share Your Avatar" that lists the links for you to add your avatar to your web site.&lt;/p&gt; &lt;p&gt;To save you the suspense, here's the format of your Xbox Live avatar:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="5" width="100%" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; border-bottom: #000000 1px solid; background-color: #dddddd" valign="top"&gt;http://avatar.xboxlive.com/avatar/YOUR-GAMERTAG-HERE/avatar-body.png&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;So to add your avatar to your blog or other web site, simply set your avatar URL as the source of an image tag, and you get something like this:&lt;/p&gt; &lt;table width="100%" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;img alt="Arcware Xbox Live Avatar" src="http://avatar.xboxlive.com/avatar/arcware/avatar-body.png"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;There is *some* resemblance of my avatar to me, but it's not nearly an exact match. The avatar I've seen that most resembles their actual look is &lt;a href="http://avatar.xboxlive.com/avatar/fallenrogue420/avatar-body.png"&gt;Leon's&lt;/a&gt;. Heck, his even matches his personality, hat and all :-)&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
 Tagged as 
&lt;a href="http://arcware.net/tags/gaming/"&gt;gaming&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/xbox/"&gt;xbox&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/how-to-move-from-subtext-to-graffiti/"&gt;How to Move from Subtext to Graffiti&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/how-to-work-from-home-full-time/"&gt;How To Work From Home Full-Time&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/5A0F69ABD85ED06B09A3F2002AF2C139989A23CF"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/5A0F69ABD85ED06B09A3F2002AF2C139989A23CF"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/483886107" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/how-to-link-to-your-xbox-live-avatar/</feedburner:origLink></item><item><title>How to Suppress PowerShell Errors</title><link>http://feeds.feedburner.com/~r/arcware/~3/482799167/</link><pubDate>Fri, 12 Dec 2008 15:49:00 GMT</pubDate><guid isPermaLink="false">http://arcware.net/how-to-suppress-powershell-errors/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;If you've read my blog at all over the last couple weeks, it's pretty obvious that I've taken a liking to PowerShell; however, it's not been all sunshine and daisies. PowerShell definitely has a learning curve, causes a lot of trial-and-error, and is not without its frustrations.&lt;/p&gt;&lt;p&gt;One of those frustrations is how to suppress warnings and errors. For example, on my desktop is a folder named Temp, and in this folder I want to recursively delete all subfolders named Junk. To do so with PowerShell is quite simple and looks like this:&lt;/p&gt;
&lt;div&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;
set-location C:\Users\Dave\Desktop\Temp
get-childitem -recurse -force |
  where {$_.name &lt;span style="color: rgb(204, 102, 51);"&gt;-eq&lt;/span&gt; &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Junk&amp;quot;&lt;/span&gt;} |
    &lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt; ($_) {remove-item $_.fullname -recurse -force}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This works fine, but the output looks like this, even though the script did in fact recursively delete all subfolders named Junk:&lt;/p&gt;
&lt;table border="0" width="100%"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top"&gt;&lt;img height="116" border="0" width="644" src="http://arcware.net/files/media/image/WindowsLiveWriter/UseErrorActiontoSuppressPowerShellWarnin_A2A1/ps-silentycontinue1_3.png" alt="ps-silentycontinue1" style="border-width: 0px;" /&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Because the script did do its job properly, I guess it's not a huge deal, but it's very misleading. And it gets much worse because it will output that error message for each matching item, in this case for each Junk subfolder (just imagine a recursive delete on all .svn folders).&lt;/p&gt;
&lt;p&gt;I put up with this behavior for awhile until I just couldn't take it anymore, knowing there *had* to be a way of suppressing these types of errors. It took some digging in to the get-help feature of PowerShell, but I finally found what I was looking for. If you type &amp;quot;get-help about_CommonParameters&amp;quot; at a PowerShell prompt, you'll see that one of the common parameters is ErrorAction, which is an enum of the following values: Continue (the default), Stop, SilentlyContinue, and Inquire.&lt;/p&gt;
&lt;p&gt;So there it was, the answer I was looking for: SilentlyContinue. Now I can change the script to include an ErrorAction parameter with a SilentlyContinue value, like so:&lt;/p&gt;
&lt;div&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;
set-location C:\Users\Dave\Desktop\Temp
get-childitem -recurse -force -erroraction silentlycontinue |
  where {$_.name &lt;span style="color: rgb(204, 102, 51);"&gt;-eq&lt;/span&gt; &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;Junk&amp;quot;&lt;/span&gt;} |
    &lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt; ($_) {remove-item $_.fullname -recurse -force}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And when I run the script again, here's the output:&lt;/p&gt;
&lt;table border="0" width="100%"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top"&gt;&lt;img height="57" border="0" width="644" src="http://arcware.net/files/media/image/WindowsLiveWriter/UseErrorActiontoSuppressPowerShellWarnin_A2A1/ps-silentycontinue2_3.png" alt="ps-silentycontinue2" style="border: 0px none ;" /&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You see those error messages? Me neither :-)&lt;/p&gt;
&lt;p&gt;Of course, you don't always want to suppress PowerShell errors; you still have to be smart about where to do it. But for stuff like this, it makes perfect sense. And keep in mind ErrorAction is not limited to the get-childitem commandlet I've shown above; it's referred to as a &amp;quot;common parameter&amp;quot; for a reason :-)&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
 Tagged as 
&lt;a href="http://arcware.net/tags/tools/"&gt;tools&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/powershell/"&gt;powershell&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/argumenthelper-and-consistent-exception-messages/"&gt;ArgumentHelper and Consistent Exception Messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/nhibernaterepository/"&gt;NHibernateRepository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/B933727574B428BC85020A9C3BC542E1D54BE2FB"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/B933727574B428BC85020A9C3BC542E1D54BE2FB"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/482799167" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/how-to-suppress-powershell-errors/</feedburner:origLink></item><item><title>Modifying Web.config with PowerShell</title><link>http://feeds.feedburner.com/~r/arcware/~3/481651176/</link><pubDate>Thu, 11 Dec 2008 13:21:00 GMT</pubDate><guid isPermaLink="false">http://arcware.net/modifying-web-config-with-powershell/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;For all you .NET-ers, you know how during your development cycle you set debug=&amp;quot;true&amp;quot; in web.config, and then when you get ready to release your application you have to remember to switch it to be debug=&amp;quot;false&amp;quot;? And how many times have you had to re-deploy your web.config all because you simply forgot to do that? Yea, me too, but I've figured out a way to automate this using PowerShell, and not only that, I've discovered how to do it in only five lines of code.&lt;/p&gt;&lt;p&gt;For completeness, here's a web.config file that contains only the &amp;lt;compilation&amp;gt; node with debug=&amp;quot;true&amp;quot;:&lt;/p&gt;
&lt;div&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;system.web&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;compilation&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;debug&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;system.web&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;configuration&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;To change debug=&amp;quot;true&amp;quot; to debug=&amp;quot;false&amp;quot;, I started down the path of using the typical XPath stuff to get the &amp;lt;compilation&amp;gt; node and its attributes. But in doing so, somewhere along the way I stumbled across an article (which I've since lost the link and now can't find) that showed a shortened, more terse way of making the change. You can see it in line 4 of this block of script:&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style: none; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   1:&lt;/span&gt; $webConfig = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;C:\Inetpub\Wwwroot\MyApp\web.config&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   2:&lt;/span&gt; $doc = new-object System.Xml.XmlDocument&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   3:&lt;/span&gt; $doc.Load($webConfig)&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   4:&lt;/span&gt; $doc.get_DocumentElement().&lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;system.web&amp;quot;&lt;/span&gt;.compilation.debug = &lt;span style="color: rgb(0, 96, 128);"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   5:&lt;/span&gt; $doc.Save($webConfig)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I assume the ability to do this has been around for quite awhile and I'm just now discovering it, but that makes things *so* much nicer than having to use XPath with XmlNodes and XmlAttributes. Using get_DocumentElement() to get the root node of the XML document and then simple dot notation to traverse the child nodes and attributes is a thing of beauty.&lt;/p&gt;
&lt;p&gt;Just one word of caution: be sure to call the Save() method on the XML document object. I forgot to do that and spent an hour trying to figure out why my changes weren't being saved. Ouch is right ;-)&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
 Tagged as 
&lt;a href="http://arcware.net/tags/tools/"&gt;tools&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/powershell/"&gt;powershell&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/use-a-single-web-config-for-iis6-and-iis7/"&gt;Use a Single Web.Config for IIS6 and IIS7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/nhibernaterepository/"&gt;NHibernateRepository&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/5E9D51C052A51DE99741D47D3149491D7EDB9211"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/5E9D51C052A51DE99741D47D3149491D7EDB9211"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/481651176" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/modifying-web-config-with-powershell/</feedburner:origLink></item><item><title>Creating IIS Applications with PowerShell</title><link>http://feeds.feedburner.com/~r/arcware/~3/481169620/</link><pubDate>Thu, 11 Dec 2008 01:39:22 GMT</pubDate><guid isPermaLink="false">http://arcware.net/creating-iis-applications-with-powershell/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;To help automate our functional testing, I need to use PowerShell to create the IIS application required to run &lt;a href="http://communityserver.com"&gt;Community Server&lt;/a&gt; on our build server. After searching around, I found some articles that showed how to programmatically create a virtual directory, but what I need is a virtual directory that is actually an *application* in the eyes of IIS.&lt;/p&gt; &lt;p&gt;Kind of surprisingly, it took digging into the IIS SDK and &lt;a href="http://msdn.microsoft.com/en-us/library/ms524830.aspx"&gt;this article&lt;/a&gt; to find what I was looking for. So after reading that and some minor trial-and-error, here's what I came up with:&lt;/p&gt; &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt; &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;# Get parameters passed to the script&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;param&lt;/span&gt;($appName, $appPath)&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; $path = [ADSI]&lt;span style="color: #006080"&gt;"IIS://localhost/W3SVC/1/ROOT"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; $app = $path.Create(&lt;span style="color: #006080"&gt;"IIsWebVirtualDir"&lt;/span&gt;, $appName)&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; $app.AppCreate2(1)&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; $app.Put(&lt;span style="color: #006080"&gt;"AppFriendlyName"&lt;/span&gt;, $appName)&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt; $app.Put(&lt;span style="color: #006080"&gt;"Path"&lt;/span&gt;, $appPath)&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt; $app.Put(&lt;span style="color: #006080"&gt;"DefaultDoc"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"Default.aspx"&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt; $app.SetInfo()&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div align="left"&gt;A few notes:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Line 4: This is the IIS path to the Default Web Site on localhost. 
&lt;li&gt;Line 5: This creates the virtual directory. 
&lt;li&gt;&lt;strong&gt;Line 6: This is what turns the virtual directory into an application.&lt;/strong&gt; 
&lt;li&gt;Line 10: This saves the changes in IIS. 
&lt;li&gt;This script works in both IIS6 and IIS7. 
&lt;li&gt;This script assumes the app doesn't already exist in IIS. If it does, an error is thrown.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;If you save this script in the root of your C: drive and name it CreateIISApp.ps1, this is how you'd run it:&lt;/p&gt;
&lt;p&gt;
&lt;table width="100%" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="44" alt="create-iis-app" src="http://arcware.net/files/media/image/WindowsLiveWriter/CreatingIISApplicationswithPowerShell_D118/create-iis-app_3.png" width="548" border="0"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;You could certainly enhance this script to check if the app already exists, or to pass in the server name and web site as parameters, but you get the general idea.&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
 Tagged as 
&lt;a href="http://arcware.net/tags/tools/"&gt;tools&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/powershell/"&gt;powershell&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/use-a-single-web-config-for-iis6-and-iis7/"&gt;Use a Single Web.Config for IIS6 and IIS7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/compare-assemblies-with-bitdiffer/"&gt;Compare Assemblies with BitDiffer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/creating-a-sql-server-database-from-powershell/"&gt;Creating a SQL Server Database from PowerShell&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/1D92DAED3A53644882C755BB4A325CB8B3C38D72"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/1D92DAED3A53644882C755BB4A325CB8B3C38D72"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/481169620" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/creating-iis-applications-with-powershell/</feedburner:origLink></item><item><title>Comments Now Powered by Disqus</title><link>http://feeds.feedburner.com/~r/arcware/~3/480116911/</link><pubDate>Wed, 10 Dec 2008 02:16:08 GMT</pubDate><guid isPermaLink="false">http://arcware.net/comments-now-powered-by-disqus/</guid><dc:creator>Dave</dc:creator><slash:comments>0</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;One of the great things about having a blog is getting comments from people. Some posts get no comments, some get one or two, and then there are &lt;a href="http://arcware.net/do-you-write-software-at-home-like-you-do-at-work/"&gt;some that generate several comments&lt;/a&gt;, effectively turning those posts into discussions. But there are downsides with a basic blog commenting system, such as the lack of threaded replies and the inevitable comment spam.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div style="padding-left: 10px; float: right; padding-bottom: 10px"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="79" alt="disqus" src="http://arcware.net/files/media/image/WindowsLiveWriter/CommentsNowPoweredbyDisqus_14E5C/disqus_3.png" width="254" border="0"&gt;&lt;/div&gt; &lt;p&gt;So to enhance the commenting experience, and to get &lt;a href="http://simpable.com"&gt;ScottW&lt;/a&gt; off my back since he's been nudging me about this for awhile now, I've swapped out the standard &lt;a href="http://graffiticms.com"&gt;Graffiti&lt;/a&gt; commenting system in my blog theme for &lt;a href="http://disqus.com"&gt;Disqus&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I won't regurgitate all the niceties of Disqus here, as &lt;a href="http://simpable.com/code/disqus/"&gt;Scott already did a good job of that&lt;/a&gt; (with steps to add it to Graffiti for those interested), but I'm looking forward to seeing if using Disqus really does enhance people's experience when leaving comments on my blog.&lt;/p&gt; &lt;p&gt;Feel free to comment away :-)&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/how-to-move-from-subtext-to-graffiti/"&gt;How to Move from Subtext to Graffiti&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/every-beginning-has-an-end-and-tattoos/"&gt;Every Beginning Has An End (And Tattoos)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/087BC8D48A9CE8A843CB7A2FD1BC145659287CF2"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/087BC8D48A9CE8A843CB7A2FD1BC145659287CF2"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/480116911" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/comments-now-powered-by-disqus/</feedburner:origLink></item><item><title>Should Branch History Be Kept After a Merge?</title><link>http://feeds.feedburner.com/~r/arcware/~3/478059727/</link><pubDate>Mon, 08 Dec 2008 03:30:04 GMT</pubDate><guid isPermaLink="false">http://arcware.net/should-branch-history-be-kept-after-a-merge/</guid><dc:creator>Dave</dc:creator><slash:comments>6</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;As we've changed &lt;a href="http://telligent.com"&gt;our&lt;/a&gt; development process to now work in feature teams and feature branches (much more on that in a later post), one of the things we're discussing is whether or not to keep the branch history once a branch has been merged back into trunk.&lt;/p&gt; &lt;p&gt;Initially, we thought of course we'd want to keep the branch history. Check-in history and revision comments are very important to us and that seemed like the obvious decision. However, we're now having second thoughts and are questioning whether or not the branch history even matters once it's merged into trunk.&lt;/p&gt; &lt;p&gt;Our thinking is that first and foremost, trunk rules all. Trunk is the mainline and should be kept sacred and *always* in a good working state; afterall, we ship trunk. A branch is a segment of work with specific functionality for a certain amount of time that, when completed and merged into trunk, goes away. Obviously history of trunk is extremely important, but should you really care about all the incremental changes that occurred in a branch before the merge occurred? We're beginning to think not.&lt;/p&gt; &lt;p&gt;So I wanted to ask the question and get feedback from you: should branch history be kept after a merge? Whether your answer is yes or no, I'd also like to see your reasoning in case we're missing something. Start/join the discussion by leaving your comments.&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/decreasing-developer-ramp-up-time/"&gt;Decreasing Developer Ramp Up Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/teched-2005-recap/"&gt;TechEd 2005 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/clarity/"&gt;Clarity&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/C29620C37B71FE558AAFE46A71814AE51973360F"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/C29620C37B71FE558AAFE46A71814AE51973360F"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/478059727" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/should-branch-history-be-kept-after-a-merge/</feedburner:origLink></item><item><title>Creating a SQL Server Database from PowerShell</title><link>http://feeds.feedburner.com/~r/arcware/~3/476662446/</link><pubDate>Sat, 06 Dec 2008 13:59:27 GMT</pubDate><guid isPermaLink="false">http://arcware.net/creating-a-sql-server-database-from-powershell/</guid><dc:creator>Dave</dc:creator><slash:comments>1</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;My PowerShell scripting madness continues, with the need to automate the setup and teardown of a SQL Server database in prep for running automated functional tests. Here's what I came up with:&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #008000"&gt;# Get the parameters passed to the script&lt;/span&gt;
Param($dbInstance, $dbName) 

[System.Reflection.Assembly]::LoadWithPartialName(&lt;span style="color: #006080"&gt;"Microsoft.SqlServer.Smo"&lt;/span&gt;)
$dbServer = new-object Microsoft.SqlServer.Management.Smo.Server ($dbInstance)
$db = new-object Microsoft.SqlServer.Management.Smo.Database 

&lt;span style="color: #008000"&gt;# Loop thru the db list to find the one we need. If found, set the local&lt;/span&gt;
&lt;span style="color: #008000"&gt;# vars to avoid errors when trying to delete the db from within the loop.&lt;/span&gt;
$found = &lt;span style="color: #006080"&gt;"false"&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; ($_ &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; $dbServer.Databases)
{
    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ($_.Name &lt;span style="color: #cc6633"&gt;-eq&lt;/span&gt; $dbName)
    {
        $db = $_
        $found = &lt;span style="color: #006080"&gt;"true"&lt;/span&gt;
    }
} 

&lt;span style="color: #008000"&gt;# Now that we're out of the loop we can kill the db&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ($found &lt;span style="color: #cc6633"&gt;-eq&lt;/span&gt; &lt;span style="color: #006080"&gt;"true"&lt;/span&gt;)
{
    &lt;span style="color: #006080"&gt;"Deleting database $dbName..."&lt;/span&gt;
    $dbServer.KillAllProcesses($db.Name)
    $dbServer.KillDatabase($db.Name)
} 

&lt;span style="color: #006080"&gt;"Creating database $dbName..."&lt;/span&gt;
$db = new-object Microsoft.SqlServer.Management.Smo.Database ($dbServer, $dbName)
$db.Create()
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So to use this, let's say this is in a script named C:\CreateDatabase.ps1 and you want to create a database named MyDatabase on the default instance of the local SQL Server. This is what it would look like:&lt;/p&gt;
&lt;table width="100%" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="164" alt="PowerShell-CreateDatabase" src="http://arcware.net/files/media/image/WindowsLiveWriter/CreatingaSQLServerDatabasefromPowerShell_A802/PowerShell-CreateDatabase_3.png" width="646" border="0"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The -dbInstance and -dbName are named parameters passed to the script, which are grabbed in the first line of the script. PowerShell didn't like "(local)" passed in, so I had to escape the double-quotes to get it to be recognized properly, although you could certainly use the server name instead; I just wanted to show using "(local)" as an example. But other than that, all works as expected without any issues.&lt;/p&gt;
&lt;p&gt;There's several other properties you can set on the database when creating it, such as the size, growth type, and file name, but if all you need are the defaults, the above script will take care of it.&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
 Tagged as 
&lt;a href="http://arcware.net/tags/tools/"&gt;tools&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/powershell/"&gt;powershell&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/nhibernaterepository/"&gt;NHibernateRepository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/compare-assemblies-with-bitdiffer/"&gt;Compare Assemblies with BitDiffer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/running-a-powershell-script-with-a-space-in-the-path/"&gt;Running a PowerShell Script with a Space in the Path&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/C0DDE6DC7699996086DB04476BAA22889B58ED83"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/C0DDE6DC7699996086DB04476BAA22889B58ED83"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/476662446" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/creating-a-sql-server-database-from-powershell/</feedburner:origLink></item><item><title>Tip: Use CC.NET Prebuild to Run Subversion Cleanup Before Building</title><link>http://feeds.feedburner.com/~r/arcware/~3/475780298/</link><pubDate>Fri, 05 Dec 2008 15:23:00 GMT</pubDate><guid isPermaLink="false">http://arcware.net/tip-use-cc-net-prebuild-to-run-subversion-cleanup-before-building/</guid><dc:creator>Dave</dc:creator><slash:comments>1</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;If you've used &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt; for any length of time, you've no doubt encountered a situation where it tells you to run the &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; &amp;quot;cleanup&amp;quot; command. This happens when TortoiseSVN needs to clear inconsistencies in your local copy, which means that under-the-covers it needs to re-execute log files within your .svn folders to get things back to a happy state. And usually when this happens, it's easy enough to simply right-click on the offending folder, go to TortoiseSVN, select Cleanup, and you're good to go.&lt;/p&gt;&lt;p&gt;But what if this happens on your build server while running your automated builds? It doesn't make much sense to log on to your build server every time this happens just to manually issue the cleanup command to get the build working again.&lt;/p&gt;
&lt;p&gt;To solve this problem, add a &amp;lt;prebuild&amp;gt; element to all of your &lt;a href="http://ccnet.thoughtworks.com"&gt;CC.NET&lt;/a&gt; config scripts that issues the cleanup command automatically. The existence of a &amp;lt;prebuild&amp;gt; element in CC.NET means that whatever tasks are inside it are guaranteed to run before anything else in the build script. For example, here's what the &amp;lt;prebuild&amp;gt; element looks like in our &lt;a href="http://communityserver.com"&gt;Community Server&lt;/a&gt; CC.NET build script:&lt;/p&gt;
&lt;p&gt;
&lt;table width="100%" style="border: 2px dashed rgb(187, 187, 187);"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;font face="Courier New"&gt;&amp;lt;prebuild&amp;gt;&lt;br /&gt;
            &amp;nbsp; &amp;lt;exec&amp;gt;&lt;br /&gt;
            &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;executable&amp;gt;C:\Program Files\CollabNet Subversion\svn.exe&amp;lt;/executable&amp;gt;&lt;br /&gt;
            &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;buildArgs&amp;gt;cleanup&amp;lt;/buildArgs&amp;gt;&lt;br /&gt;
            &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;baseDirectory&amp;gt;D:\Builds\CommunityServer\Working\Trunk&amp;lt;/baseDirectory&amp;gt;&lt;br /&gt;
            &amp;nbsp; &amp;lt;/exec&amp;gt;&lt;br /&gt;
            &amp;lt;/prebuild&amp;gt;&lt;/font&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Having a &amp;lt;prebuild&amp;gt; element in your CC.NET scripts ensures a smooth build each and every time without the need for ad-hoc manual intervention. And the less manual effort, the better.&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
 Tagged as 
&lt;a href="http://arcware.net/tags/tools/"&gt;tools&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/subversion/"&gt;subversion&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/cc-net/"&gt;cc-net&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/tortoisesvn/"&gt;tortoisesvn&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/tortoisesvn-global-ignore-pattern-vs-svn-ignore/"&gt;TortoiseSVN Global Ignore Pattern vs. svn:ignore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/compare-assemblies-with-bitdiffer/"&gt;Compare Assemblies with BitDiffer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/decreasing-developer-ramp-up-time/"&gt;Decreasing Developer Ramp Up Time&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/32696274AC934DD4204FDC870825051B0959C563"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/32696274AC934DD4204FDC870825051B0959C563"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/475780298" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/tip-use-cc-net-prebuild-to-run-subversion-cleanup-before-building/</feedburner:origLink></item><item><title>TortoiseSVN Global Ignore Pattern vs. svn:ignore</title><link>http://feeds.feedburner.com/~r/arcware/~3/474682266/</link><pubDate>Thu, 04 Dec 2008 13:57:54 GMT</pubDate><guid isPermaLink="false">http://arcware.net/tortoisesvn-global-ignore-pattern-vs-svn-ignore/</guid><dc:creator>Dave</dc:creator><slash:comments>9</slash:comments><category domain="http://arcware.net/uncategorized/">Uncategorized</category><description>&lt;p&gt;When using a source control system, there are certain files and folders you normally want to exclude from source control. For instance, on projects developed with Visual Studio, you almost never want to check-in your bin and obj folders, nor should you ever check-in any .user or .suo files.&lt;/p&gt; &lt;p&gt;If you use the &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt;-&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; combo, you have a couple ways to exclude files and folders from source control:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;By setting the svn:ignore property on the relevant files and folders, or  &lt;li&gt;By using the Global Ignore Pattern setting in TortoiseSVN&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Using the svn:ignore Property&lt;/h3&gt; &lt;p&gt;Let's look at the svn:ignore property first because I'm willing to bet that many people set this property without actually realizing it. With TortoiseSVN, it's really easy to exclude an item from Subversion source control by right-clicking on it, going to TortoiseSVN, and selecting "Add to ignore list".&lt;/p&gt; &lt;p&gt;That's simple enough, but you have to do this for each and every file/folder you wish to exclude, which can be tedious. But what's really happening is that TortoiseSVN is setting a svn:ignore property &lt;strong&gt;on the parent folder&lt;/strong&gt; of the item being excluded, which will get committed for that folder on the Subversion server side during your next check-in.&lt;/p&gt; &lt;p&gt;For example, in my main Trunk folder I want to exclude a folder named Temp from source control, so I right-click it, go to TortoiseSVN, and select "Add to ignore list". To see the effect, I right-click on Trunk (the parent folder of Temp), go to TortoiseSVN, select Properties, and see this:&lt;/p&gt; &lt;p&gt; &lt;table width="100%" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="287" alt="svn-ignore1" src="http://arcware.net/files/media/image/WindowsLiveWriter/SubversionGlobalIgnorePatternv.svnignore_D560/svn-ignore1_3.png" width="574" border="0"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;Before I added Temp to the ignore list, this box was empty, and now this change will get committed in Subversion and everyone else on my team will pick up the change the next time they get latest, which may or may not be the desired effect.&lt;/p&gt; &lt;h3&gt;Using the TortoiseSVN Global Ignore Pattern&lt;/h3&gt; &lt;p&gt;That's all well and good, but like I said, it can be tedious to do that for every item you wish to exclude from source control. Another way to accomplish the same thing is to use the Global Ignore Pattern in your TortoiseSVN settings. To do this, right-click on the root folder of your local repository, go to TortoiseSVN, and select Settings (notice I said Settings, not Properties). This is what you'll see:&lt;/p&gt; &lt;p&gt; &lt;table width="100%" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="430" alt="global-ignore1" src="http://arcware.net/files/media/image/WindowsLiveWriter/SubversionGlobalIgnorePatternv.svnignore_D560/global-ignore1_3.png" width="644" border="0"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;It's here that you can enter any item you wish to ignore, and TortoiseSVN will save them in your local settings without ever adding svn:ignore properties to anything.&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;
 Tagged as 
&lt;a href="http://arcware.net/tags/tools/"&gt;tools&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/tortoisesvn/"&gt;tortoisesvn&lt;/a&gt;
,
&lt;a href="http://arcware.net/tags/subversion/"&gt;subversion&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Similar Posts&lt;/strong&gt;&lt;br /&gt;
&lt;ol id="similarPosts" class="splist"&gt;
&lt;li&gt;&lt;a href="http://arcware.net/tfs-offline-pending-changes-in-visual-studio/"&gt;TFS Offline Pending Changes in Visual Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/how-to-move-from-subtext-to-graffiti/"&gt;How to Move from Subtext to Graffiti&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arcware.net/executing-vsts-unit-tests-and-code-coverage-from-the-command-line/"&gt;Executing VSTS Unit Tests and Code Coverage from the Command Line&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://theloungenet.com/feeds/redirect/DOTNETRSS/ARCWARE/4DE3F7437E64071247F0C751916EAAB644782698"&gt;&lt;img src="http://theloungenet.com/feeds/img/DOTNETRSS/ARCWARE/4DE3F7437E64071247F0C751916EAAB644782698"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/arcware/~4/474682266" height="1" width="1"/&gt;</description><feedburner:origLink>http://arcware.net/tortoisesvn-global-ignore-pattern-vs-svn-ignore/</feedburner:origLink></item></channel></rss>
