<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss1full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:cc="http://web.resource.org/cc/" xmlns="http://purl.org/rss/1.0/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

<channel rdf:about="http://bradwilson.typepad.com/blog/">
<title>Brad Wilson</title>
<link>http://bradwilson.typepad.com/blog/</link>
<description>Technologist. Agile Evangelist. Poker Player. Amateur Neologist. Metalhead.</description>
<dc:language>en-US</dc:language>
<dc:creator />
<dc:date>2009-07-11T22:17:45-07:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.typepad.com/" />


<items>
<rdf:Seq><rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2009/07/xunitnet-15-ctp-2.html" />
<rdf:li rdf:resource="tag:flickr.com,2005:/photo/3645628303" /><rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2009/06/projection-and-screen-sizes.html" />
<rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2009/05/xunitnet-15-ctp-1.html" />
<rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2009/05/zune-pass-and-the-dreaded-c00d12ea-error.html" />
<rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2009/05/a-portable-startupps1-file.html" />
<rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2009/04/its-not-tdd-its-design-by-example.html" />
<rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2009/04/dataannotations-and-aspnet-mvc.html" />
<rdf:li rdf:resource="tag:flickr.com,2005:/photo/3335018192" /><rdf:li rdf:resource="tag:flickr.com,2005:/photo/3335018102" /><rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2009/02/announcing-xunitnet-contrib.html" />
<rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2009/02/when-is-a-type-not-a-type.html" />
<rdf:li rdf:resource="http://bradwilson.typepad.com/blog/2008/12/find-to-set-aliasps1.html" />
<rdf:li rdf:resource="tag:flickr.com,2005:/photo/3040922577" /><rdf:li rdf:resource="tag:flickr.com,2005:/photo/3004253424" /></rdf:Seq>
</items>

<geo:lat>47.677471</geo:lat><geo:long>-122.121383</geo:long><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FBradWilson" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FBradWilson" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FBradWilson" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/BradWilson" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FBradWilson" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FBradWilson" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FBradWilson" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><geo:lat>47.677471</geo:lat><geo:long>-122.121383</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/BradWilson-ThenetGuy" type="application/rss+xml" /></channel>

<item rdf:about="http://bradwilson.typepad.com/blog/2009/07/xunitnet-15-ctp-2.html">
<title>xUnit.net 1.5 CTP 2</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/iZcHdhnEySU/xunitnet-15-ctp-2.html</link>
<description>Jim and I just shipped the second CTP for xUnit.net 1.5. As is the theme for 1.5, this release is primarily about updating the GUI runner. We’ve made quite a bit of progress since we released CTP 1 about 7...</description>
<content:encoded><![CDATA[<p>Jim and I just shipped the second CTP for xUnit.net 1.5. As is the theme for 1.5, this release is primarily about updating the GUI runner. We’ve made quite a bit of progress since we released CTP 1 about 7 weeks ago.</p>  <p><a title="xUnit.net 1.5 CTP 2 GUI by Brad Wilson, on Flickr" href="http://www.flickr.com/photos/dotnetguy/3711389189/"><img alt="xUnit.net 1.5 CTP 2 GUI" src="http://farm3.static.flickr.com/2547/3711389189_e6f1621be3.jpg" width="500" height="407" /></a></p>  <p><strong>“Sticky” results in the test list</strong></p>  <blockquote>   <p>Previously, when you did any refinements, all information about the last test run was lost. Now, we are preserving last run information. You can even refine the test list while tests are running.</p> </blockquote>  <p><strong>Trait-based filtering</strong></p>  <blockquote>   <p>We added a trait box to the refinements section of the GUI (and made the refinements use the entire left side of the GUI window. Traits are displayed grouped by their name, and selecting multiple traits (with the Ctrl key) filters to methods which match any of the given traits.</p> </blockquote>  <p><strong>Automatic reloading of modified assemblies </strong></p>  <blockquote>   <p>We support automatically reloading assemblies, and since test assemblies are always shadow copied, you can leave the GUI running while re-compiling your work. We also added a right-click menu to assemblies which allows you to unload or reload any assembly manually. We also added the ability to specify which assemblies to load on the command line, which is useful for Visual Studio integration.</p> </blockquote>  <p><strong>User interface tweaks</strong></p>  <blockquote>   <p>We added a test counter bar to the top of the test method list which shows status counts from the tests in your currently refined list. We also added better status icons. We also remember your last placement of the runner window for the next time you run. We also made some UI-related performance tweaks so that any slowness of the UI shouldn’t slow down the run speed of the tests.</p> </blockquote>  <p><strong>What’s next?</strong></p>  <blockquote>   <p>There are still some UI tweaks to be done. Most notably, any test method which results in multiple runs (for example, [Theory] from the extensions project) is not well represented in the UI. We are considering what our exact strategy is for display here, as we’ve rapidly outgrown the ListView’s simple UI capabilities.</p>    <p>We would like to add project file support, so you can open a single file which will remember all the assemblies you have loaded as well as any refinements you’ve made.</p>    <p>Mostly, we’re hoping for more feedback on the UI so that we might be able to make useful tweaks one last time before we ship a new 1.5 RTM build!</p></blockquote><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=R42ob4DsdUc:gynp99ciNz0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=R42ob4DsdUc:gynp99ciNz0:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=R42ob4DsdUc:gynp99ciNz0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=R42ob4DsdUc:gynp99ciNz0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=R42ob4DsdUc:gynp99ciNz0:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/R42ob4DsdUc" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=iZcHdhnEySU:R42ob4DsdUc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=iZcHdhnEySU:R42ob4DsdUc:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=iZcHdhnEySU:R42ob4DsdUc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=iZcHdhnEySU:R42ob4DsdUc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=iZcHdhnEySU:R42ob4DsdUc:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/iZcHdhnEySU" height="1" width="1"/>]]></content:encoded>



<dc:creator>Brad Wilson</dc:creator>
<dc:date>2009-07-11T22:17:45-07:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2009/07/xunitnet-15-ctp-2.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/R42ob4DsdUc/xunitnet-15-ctp-2.html</feedburner:origLink></item><item rdf:about="tag:flickr.com,2005:/photo/3645628303"><title>iPhone Tethered to AT&amp;T [Flickr]</title><link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/B50I_qPDMnw/</link><dc:subject>rss</dc:subject><dc:subject>att</dc:subject><dc:subject>iphone</dc:subject><dc:subject>tethering</dc:subject><dc:creator>Brad Wilson</dc:creator><dc:date>2009-06-21T00:47:14-07:00</dc:date><description>&lt;p&gt;&lt;a href="http://www.flickr.com/people/dotnetguy/"&gt;Brad Wilson&lt;/a&gt; posted a photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/dotnetguy/3645628303/" title="iPhone Tethered to AT&amp;amp;T"&gt;&lt;img src="http://farm4.static.flickr.com/3398/3645628303_b91c72febe_m.jpg" width="160" height="240" alt="iPhone Tethered to AT&amp;amp;T" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instructions:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.ditii.com/2009/06/18/guide-to-enable-tethering-on-iphone-3-0-worldwide-carriers/" rel="nofollow"&gt;http://www.ditii.com/2009/06/18/guide-to-enable-tethering-on-iphone-3-0-worldwide-carriers/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
This picture was posted via the tether on my MacBook.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson/~4/z3uNFjCr8js" height="1" width="1"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=B50I_qPDMnw:ose5onEoUxE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=B50I_qPDMnw:ose5onEoUxE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=B50I_qPDMnw:ose5onEoUxE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=B50I_qPDMnw:ose5onEoUxE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=B50I_qPDMnw:ose5onEoUxE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/B50I_qPDMnw" height="1" width="1"/&gt;</description><dc:date.Taken>2009-06-21T00:47:26-08:00</dc:date.Taken><feedburner:origLink>http://www.flickr.com/photos/dotnetguy/3645628303/</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/z3uNFjCr8js/</feedburner:origLink></item>
<item rdf:about="http://bradwilson.typepad.com/blog/2009/06/projection-and-screen-sizes.html">
<title>Projection and Screen Sizes</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/WyvBhkax8do/projection-and-screen-sizes.html</link>
<description>Most people who know me, know that I love watching movies. I've been trying to decide how I wanted to get a good movie watching experience in my relatively small house, and after a few back and forth conversations with...</description>
<content:encoded><![CDATA[<p>Most people who know me, know that I love watching movies. I&#39;ve been trying to decide how I wanted to get a good movie watching experience in my relatively small house, and after a few back and forth conversations with an installer, I&#39;ve decided what I&#39;m going to do: a <a href="http://www.projectorcentral.com/panasonic_ae3000_projector_review.htm" target="_blank">1080p front projector</a> with a 2.35:1 screen.</p>
<p>I thought I&#39;d talk a little bit about why I made this decision, for others who may be considering putting in a front-screen projection system in their house for movie watching.</p>
<h3>Content</h3>
<p>The most important thing to think about when you&#39;re setting up a viewing area is what kind of content you&#39;ll be watching. Will you be watching primarily television or movies? If you&#39;re watching television, will you be watching primarily HDTV or standard definition?</p>
<p>If your answer is &quot;primarily television&quot;, then your decision is probably much simpler: get an HDTV, or a front projector with&#0160;a traditional widescreen screen. The vast majority of your content will either be 1.33:1 standard definition television or 1.78:1 widescreen television.</p>
<p>For me, the primary source of watching will be movies. I have so few movies that are 1.33:1 that it makes no difference, and even the television I have on DVD is mostly 1.78:1. However, if you look through your movie collection, you&#39;ll probably notice that a rather large percentage of those movies were actually shot in 2.35:1 (sometimes now listed as 2.4:1), or occasionally even wider. In my case, the number was almost 2/3rds of the movies being in 2.35:1.</p>
<p>
<h3>Screen Sizes</h3>
<p></p>
<p>Back in the bad old days of analog standard definition television, most of us probably had a very large, nearly square piece of glass in our living rooms. Standard definition television, with its 1.33:1 ratio, was set a long time ago when many movies were filmed in simple 35mm.</p>
<p>Fast forward a few decades, and movies were starting to get filmed in progressively wider and wider ratios, to offer a sense of grandeur to the viewer: an enveloping experience. Today, most movies are either filmed in 1.85:1 or 2.35:1. When these widescreen movies are shown on original scale televisions, they are either presented in &quot;pan &amp; scan&quot; (part of the picture is cut off so it fits the screen ratio) or they are &quot;letterboxed&quot; (black bars are placed at the top and bottom of the picture).</p>
<p>When digital widescreen television was being developed, they chose a ratio (1.78:1) which was considered to be a &quot;reasonable compromise&quot; between the predominant television format of the day (1.33:1) and the predominant widest movie format of the day (2.35:1). These new HDTVs that we have excel at displaying HDTV, as well as those 1.85:1 movies. Wider movies get the familiar letterboxing, and SDTV gets bars along the side (&quot;pillarboxing&quot;).</p>
<p>If you&#39;re going with a traditional HDTV, you really don&#39;t have any choice over screen ratio: you will be getting 1.78:1. If that&#39;s you, there&#39;s nothing more to decide upon. You&#39;re done.</p>
<p>If, however, you opt for a projection system, you hold a little more power in your hands. Some modern projectors, like the one I&#39;m considering, offer zoom modes designed specifically for people who want to use extra-wide screens because the majority of their viewing material is extra-wide.</p>
<p>Consider a 2.35:1 screen. When watching any 1.85:1 or 1.33:1 material, you will end up pillarboxes on the right and left side, as illustrated here:</p>
<p style="TEXT-ALIGN: center"><a href="http://www.flickr.com/photos/dotnetguy/3626627173/" title="Constant Height (2.35:1) by Brad Wilson, on Flickr"><img alt="Constant Height (2.35:1)" height="200" src="http://farm3.static.flickr.com/2452/3626627173_21a9b934f1_o.png" width="470" /></a></p>
<p>You get what&#39;s called a &quot;constant height&quot; picture: at 2.35:1, you&#39;re using the maximum value of the screen, and then progressive using less for smaller pictures. 
<p>
<p>You need some kind of special zoom system to help here, because the material on the Blu-ray disc is encoded at 1.78:1, with black bars along the top and the bottom. In this scenario, you are zooming the picture so the &quot;dead&quot; black bars from the picture are projected above and below the edges of the screen, and the 2.35:1 image fills the screen.</p>
<p>Compare this with a more traditional 1.85:1 screen arrangement:</p>
<p style="TEXT-ALIGN: center"><a href="http://www.flickr.com/photos/dotnetguy/3626627183/" title="Widescreen (1.85:1) by Brad Wilson, on Flickr"><img alt="Widescreen (1.85:1)" height="200" src="http://farm4.static.flickr.com/3630/3626627183_84a2db0521_o.png" width="370" /></a></p>
<p>The side bars for the 1.33:1 content are smaller, respective to the size of the screen, but if you keep the screens the same absolute height (as I did here for the purposes of illustration), you&#39;ll see that the picture size for 1.33:1 and 1.85:1 are unchanged. Only the 2.35:1 suffers, as it must be protected with its letterboxes intact. In fact, the picture size for 2.35:1 in the second example is only about 60% of the size of the picture in the first example.</p>
<p>In my room, the height of the screen is probably the hardest quantity to grow. My ceilings are only so high, but the wall I&#39;m putting the screen on is significantly wider than it is high. It also seems like a no-brainer to set myself up for the maximum &quot;wow&quot; factor for the majority of my movies. And, really, choosing the 2.35:1 screen isn&#39;t a compromise at all when you consider how little flexibility I have with screen height anyway.</p>
<p>There are downsides to this plan. Obviously, you need some kind of zooming mechanism, whether it&#39;s a projector that uses physical zoom or some kind of an anamorphic lens system. Secondly, there are cases where those black bars above and below the picture might actually carry data (like in the case of subtitles for foreign films). Finally, there are those rare movies which are both 1.85:1 and 2.35:1 at different points in the film (recently, The Dark Knight used this to great effect in IMAX); in this case, you&#39;re probably stuck watching the whole film projected at 1.85:1 with letterboxing during the wider scenes.</p>
<p>If you&#39;re planning a home theater sometime in the near future, hopefully this information will be helpful!</p>
<p></p>
<p></p>
<p></p></p></p></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=8Zn_kswA-0Q:5KPrwdQCd-g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=8Zn_kswA-0Q:5KPrwdQCd-g:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=8Zn_kswA-0Q:5KPrwdQCd-g:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=8Zn_kswA-0Q:5KPrwdQCd-g:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=8Zn_kswA-0Q:5KPrwdQCd-g:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/8Zn_kswA-0Q" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=WyvBhkax8do:8Zn_kswA-0Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=WyvBhkax8do:8Zn_kswA-0Q:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=WyvBhkax8do:8Zn_kswA-0Q:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=WyvBhkax8do:8Zn_kswA-0Q:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=WyvBhkax8do:8Zn_kswA-0Q:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/WyvBhkax8do" height="1" width="1"/>]]></content:encoded>


<dc:subject>Movies</dc:subject>

<dc:creator>Brad Wilson</dc:creator>
<dc:date>2009-06-14T18:59:35-07:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2009/06/projection-and-screen-sizes.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/8Zn_kswA-0Q/projection-and-screen-sizes.html</feedburner:origLink></item>
<item rdf:about="http://bradwilson.typepad.com/blog/2009/05/xunitnet-15-ctp-1.html">
<title>xUnit.net 1.5 CTP 1</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/iiTz3XmfHzo/xunitnet-15-ctp-1.html</link>
<description>This morning, we published the first CTP of xUnit.net 1.5. This release includes a new GUI runner, support for ASP.NET MVC 1.0 RTM (for both C# and VB.NET), and several bug fixes. A note for Resharper users: support for xUnit.net...</description>
<content:encoded><![CDATA[<p>This morning, we published the <a href="http://xunit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=23593">first CTP of xUnit.net 1.5</a>. This release includes a new GUI runner, support for ASP.NET MVC 1.0 RTM (for both C# and VB.NET), and several bug fixes.</p>  <p><em>A note for Resharper users: support for xUnit.net in Resharper has been moved to the <a href="http://xunitcontrib.codeplex.com/">xUnit.net Contrib</a> project, and is no longer part of the core xUnit.net distribution.</em></p>  <p><strong>New GUI Runner</strong></p>  <p><a title="xUnit.net Test Runner (1.5 CTP 1) by Brad Wilson, on Flickr" href="http://www.flickr.com/photos/dotnetguy/3563604569/"><img alt="xUnit.net Test Runner (1.5 CTP 1)" src="http://farm4.static.flickr.com/3366/3563604569_70b7f8fb0d_o.png" width="650" height="529" /></a></p>  <p>Our goal with the new UI is to streamline the test running process for test-first developers. It is common for test-first development to result in several test assemblies and thousands of tests. The traditional thinking of test runners and tree representations of tests seems to fall apart when your test list becomes large.</p>  <p>We wanted to give developers a quick way to filter test lists that don’t involve navigating large trees. This first CTP allows users to filter by loaded assembly, as well as using a search box which live-filters the lists of tests. Additionally, the user can use the test list to select a subset of tests to run.</p>  <p><strong>What’s Left To Do?</strong></p>  <p>This runner is still in a very early state. We wanted to get it out and get user feedback. We have several features (and some significant code restructuring) left to implement before it will be ready. We are intending to re-add the automatic assembly reloading feature, as well as additional test list filtering (for example, filtering by traits). Mostly, though, we would like to see the community provide feedback on the general effectiveness of the design for their day to day runner needs.</p>  <p>We will be releasing at least one more CTP before we release the final 1.5 bits. Please take this opportunity to try out the new runner and let us know what you think!</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=O5c1UjRznzM:ilghTnQma3M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=O5c1UjRznzM:ilghTnQma3M:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=O5c1UjRznzM:ilghTnQma3M:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=O5c1UjRznzM:ilghTnQma3M:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=O5c1UjRznzM:ilghTnQma3M:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/O5c1UjRznzM" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=iiTz3XmfHzo:O5c1UjRznzM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=iiTz3XmfHzo:O5c1UjRznzM:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=iiTz3XmfHzo:O5c1UjRznzM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=iiTz3XmfHzo:O5c1UjRznzM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=iiTz3XmfHzo:O5c1UjRznzM:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/iiTz3XmfHzo" height="1" width="1"/>]]></content:encoded>


<dc:subject>Agile</dc:subject>
<dc:subject>ASP.NET MVC</dc:subject>
<dc:subject>Technical</dc:subject>
<dc:subject>xUnit.net</dc:subject>

<dc:creator>Brad Wilson</dc:creator>
<dc:date>2009-05-25T14:16:37-07:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2009/05/xunitnet-15-ctp-1.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/O5c1UjRznzM/xunitnet-15-ctp-1.html</feedburner:origLink></item>
<item rdf:about="http://bradwilson.typepad.com/blog/2009/05/zune-pass-and-the-dreaded-c00d12ea-error.html">
<title>Zune Pass and the Dreaded C00D12EA Error</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/2jo6HiNPIMM/zune-pass-and-the-dreaded-c00d12ea-error.html</link>
<description>I had to reinstall Windows on my laptop at work, which is also the machine that I use for listening to music. I have a Zune Pass, which means I can download as much stuff as I want. Unfortunately, I...</description>
<content:encoded><![CDATA[<p>I had to reinstall Windows on my laptop at work, which is also the machine that I use for listening to music. I have a Zune Pass, which means I can download as much stuff as I want. Unfortunately, I forgot to back up my downloads last time, so I’m re-downloading the things I listen to the most (which is okay, because this machine isn’t meant for lots of music, given its small hard drive).</p>  <p>The very first thing I went to download was the new album from Dååth, The Concealers. Mmm, Dååth. Instead of downloading the album, I was greeted with a bunch of yellow warning icons next to all the tracks, telling me something went wrong.</p>  <p>This is the error message it showed:</p>  <p><a title="Zune C00D12EA Error by Brad Wilson, on Flickr" href="http://www.flickr.com/photos/dotnetguy/3540131355/"><img border="0" alt="Zune C00D12EA Error" src="http://farm4.static.flickr.com/3558/3540131355_585fdb48e1_o.png" width="360" height="309" /></a></p>  <p>If you click on the web help link, it sends you off to a page which suggests that the problem is that your clock is set incorrectly.</p>  <p>Nope, my clock was correct. I checked all my paths. I checked security settings. I tried another album, and it worked. I tried yet another album, and it failed, but it did so in a very telling way.</p>  <p><strong><em>Here’s what really happened.</em></strong></p>  <p>The album is question was one that I had purchased (with my 10 free songs/month, but that doesn’t matter). When you purchase music from Zune, sometimes the label will let you re-download it and sometimes they won’t. Fine, I’ve never really required a re-download system before (knock on backup wood). Except, now I’m stuck without the ability to even download a DRM’d Zune Pass version of the album, because now it knows I own it (and when you own the album, the ‘download’ feature silently becomes a ‘re-download the MP3s’ feature, rather than downloading the Zune Pass DRM’d version).</p>  <p>Ugh.</p>  <p>I’m forced to get copies from home into work now, so I’m using Windows Live Sync to download them – one album at a time – from my home PC onto my work laptop. Such a pain. I sure hope they fix this!</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=OyxhDoqXzDA:tw1IQmbPkQE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=OyxhDoqXzDA:tw1IQmbPkQE:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=OyxhDoqXzDA:tw1IQmbPkQE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=OyxhDoqXzDA:tw1IQmbPkQE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=OyxhDoqXzDA:tw1IQmbPkQE:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/OyxhDoqXzDA" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=2jo6HiNPIMM:OyxhDoqXzDA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=2jo6HiNPIMM:OyxhDoqXzDA:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=2jo6HiNPIMM:OyxhDoqXzDA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=2jo6HiNPIMM:OyxhDoqXzDA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=2jo6HiNPIMM:OyxhDoqXzDA:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/2jo6HiNPIMM" height="1" width="1"/>]]></content:encoded>


<dc:subject>Music</dc:subject>

<dc:creator>Brad Wilson</dc:creator>
<dc:date>2009-05-17T17:33:58-07:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2009/05/zune-pass-and-the-dreaded-c00d12ea-error.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/OyxhDoqXzDA/zune-pass-and-the-dreaded-c00d12ea-error.html</feedburner:origLink></item><item rdf:about="tag:flickr.com,2005:/photo/3335018192"><title>Friends! [Flickr]</title><link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/jDK9SRIz-0I/</link><dc:subject>rss</dc:subject><dc:creator>Brad Wilson</dc:creator><dc:date>2009-03-06T23:44:28-08:00</dc:date><description>&lt;p&gt;&lt;a href="http://www.flickr.com/people/dotnetguy/"&gt;Brad Wilson&lt;/a&gt; posted a photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/dotnetguy/3335018192/" title="Friends!"&gt;&lt;img src="http://farm4.static.flickr.com/3613/3335018192_fed34a0de2_m.jpg" width="240" height="160" alt="Friends!" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My new house-cleaner thought that my bar set was perfect for humor, and positioned the corkscrew so that it appeared to be hugging the ice tongs and bottle opener, then titled it &amp;quot;Friends!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
I love that everything is leaning a little bit like maybe they're all a bit drunk. :-p&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson/~4/ovUFfdpyAPo" height="1" width="1"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=jDK9SRIz-0I:p5z9X3jYtL0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=jDK9SRIz-0I:p5z9X3jYtL0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=jDK9SRIz-0I:p5z9X3jYtL0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=jDK9SRIz-0I:p5z9X3jYtL0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=jDK9SRIz-0I:p5z9X3jYtL0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/jDK9SRIz-0I" height="1" width="1"/&gt;</description><dc:date.Taken>2009-03-06T23:24:19-08:00</dc:date.Taken><feedburner:origLink>http://www.flickr.com/photos/dotnetguy/3335018192/</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/ovUFfdpyAPo/</feedburner:origLink></item><item rdf:about="tag:flickr.com,2005:/photo/3335018102"><title>Games [Flickr]</title><link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/WQw8eyDzN60/</link><dc:subject>rss</dc:subject><dc:subject>games</dc:subject><dc:subject>boardgames</dc:subject><dc:subject>eurogames</dc:subject><dc:creator>Brad Wilson</dc:creator><dc:date>2009-03-06T23:44:23-08:00</dc:date><description>&lt;p&gt;&lt;a href="http://www.flickr.com/people/dotnetguy/"&gt;Brad Wilson&lt;/a&gt; posted a photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/dotnetguy/3335018102/" title="Games"&gt;&lt;img src="http://farm4.static.flickr.com/3290/3335018102_eb16f8a90a_m.jpg" width="160" height="240" alt="Games" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Games for the semi-weekly board game night&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson/~4/kN2zsdwRry0" height="1" width="1"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=WQw8eyDzN60:Kf8zVPi68ks:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=WQw8eyDzN60:Kf8zVPi68ks:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=WQw8eyDzN60:Kf8zVPi68ks:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=WQw8eyDzN60:Kf8zVPi68ks:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=WQw8eyDzN60:Kf8zVPi68ks:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/WQw8eyDzN60" height="1" width="1"/&gt;</description><dc:date.Taken>2009-03-06T23:23:18-08:00</dc:date.Taken><feedburner:origLink>http://www.flickr.com/photos/dotnetguy/3335018102/</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/kN2zsdwRry0/</feedburner:origLink></item>
<item rdf:about="http://bradwilson.typepad.com/blog/2009/05/a-portable-startupps1-file.html">
<title>A Portable Startup.ps1 File</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/dqmCGoFrt94/a-portable-startupps1-file.html</link>
<description>I have a habit of keeping a \Dev directory on any machine I do any significant development on. And of course, I’m never without PowerShell. So I drop a Startup.ps1 file in that Dev directory, and in my Profile.ps1 I...</description>
<content:encoded><![CDATA[<p>I have a habit of keeping a \Dev directory on any machine I do any significant development on. And of course, I’m never without PowerShell. So I drop a Startup.ps1 file in that Dev directory, and in my Profile.ps1 I start looking for it on C:, D:, E:, etc.</p>  <p>I also carry around a bunch of things in a “bin” folder that I tend to always want handy; things like:</p>  <ul>   <li>cdburn/dvdburn (probably disappear once I’m consolidated on Win7/Win2k8 R2) </li>    <li>zip/unzip/gzip/gunzip/unrar </li>    <li>Reflector </li>    <li>Notepad2 </li>    <li>WindowClippings </li>    <li>cpc/tfc </li> </ul>  <p>The location of the dev files vary from machine to machine, and until today, I’d been keeping separate copies of that Startup.ps1. I really wanted to keep everything sync’d up with Windows Live Sync, but in order to do that, I needed to make my Startup.ps1 file portable.</p>  <p>This is the top of my Startup.ps1 file, which figures out where it’s running from and automatically registers the Notepad2 shell extension if it’s never been registered:</p>  <pre class="brush:powershell; gutter:false">$dev = (split-path $MyInvocation.MyCommand.Path)

if ((test-path "$dev\bin\notepad2.exe") -eq $true) {
    set-content env:\EDITOR "$dev\bin\notepad2.exe"

    push-location -literalPath "HKLM:\Software\Classes\`*\shell"
    new-item -type directory -path Notepad2 -ErrorAction:SilentlyContinue  | out-null
    new-item -type directory -path Notepad2\command -ErrorAction:SilentlyContinue | out-null
    set-itemproperty -path Notepad2\command -name "(default)" -value "$dev\bin\notepad2.exe `"%1`""
    pop-location
}

append-path $dev\bin</pre>

<p>The append-path command there is one my standard cadre of scripts that I always take with me:</p>

<pre class="brush:powershell; gutter:false">$local:command_usage =
&quot;usage: append-path path-to-be-added
&quot;

if ($args.length -lt 1) { return ($command_usage) }

$local:oldPath = get-content Env:\Path
$local:newPath = $local:oldPath + &quot;;&quot; + $args
set-content Env:\Path $local:newPath</pre><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=ibSXDJknQTY:QiyOJNXHl0U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=ibSXDJknQTY:QiyOJNXHl0U:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=ibSXDJknQTY:QiyOJNXHl0U:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=ibSXDJknQTY:QiyOJNXHl0U:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=ibSXDJknQTY:QiyOJNXHl0U:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/ibSXDJknQTY" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=dqmCGoFrt94:ibSXDJknQTY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=dqmCGoFrt94:ibSXDJknQTY:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=dqmCGoFrt94:ibSXDJknQTY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=dqmCGoFrt94:ibSXDJknQTY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=dqmCGoFrt94:ibSXDJknQTY:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/dqmCGoFrt94" height="1" width="1"/>]]></content:encoded>


<dc:subject>PowerShell</dc:subject>
<dc:subject>Technical</dc:subject>

<dc:creator>Brad Wilson</dc:creator>
<dc:date>2009-05-16T18:23:15-07:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2009/05/a-portable-startupps1-file.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/ibSXDJknQTY/a-portable-startupps1-file.html</feedburner:origLink></item>
<item rdf:about="tag:flickr.com,2005:/photo/3040922577"><title>OOF? [Flickr]</title><link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/dCwlpVYiMmA/</link><dc:subject>rss</dc:subject><dc:subject>microsoft</dc:subject><dc:subject>oof</dc:subject><dc:creator>Brad Wilson</dc:creator><dc:date>2008-11-18T11:03:29-08:00</dc:date><description>&lt;p&gt;&lt;a href="http://www.flickr.com/people/dotnetguy/"&gt;Brad Wilson&lt;/a&gt; posted a photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/dotnetguy/3040922577/" title="OOF?"&gt;&lt;img src="http://farm4.static.flickr.com/3135/3040922577_7d30e766e0_m.jpg" width="240" height="180" alt="OOF?" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Long before I joined Microsoft, the standard term for being away from your office was &amp;quot;OOF&amp;quot; (out of facility), rather than the traditional &amp;quot;OOO&amp;quot; (out of office).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson/~4/kSJH3YS7dyA" height="1" width="1"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=dCwlpVYiMmA:3qVK6r_BOsQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=dCwlpVYiMmA:3qVK6r_BOsQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=dCwlpVYiMmA:3qVK6r_BOsQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=dCwlpVYiMmA:3qVK6r_BOsQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=dCwlpVYiMmA:3qVK6r_BOsQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/dCwlpVYiMmA" height="1" width="1"/&gt;</description><dc:date.Taken>2008-11-15T00:28:46-08:00</dc:date.Taken><feedburner:origLink>http://www.flickr.com/photos/dotnetguy/3040922577/</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/kSJH3YS7dyA/</feedburner:origLink></item><item rdf:about="tag:flickr.com,2005:/photo/3004253424"><title>My Desk at Work [Flickr]</title><link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/w5V6hcN5xDk/</link><dc:subject>work</dc:subject><dc:subject>rss</dc:subject><dc:creator>Brad Wilson</dc:creator><dc:date>2008-11-04T16:13:52-08:00</dc:date><description>&lt;p&gt;&lt;a href="http://www.flickr.com/people/dotnetguy/"&gt;Brad Wilson&lt;/a&gt; posted a photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/dotnetguy/3004253424/" title="My Desk at Work"&gt;&lt;img src="http://farm4.static.flickr.com/3042/3004253424_a5b3c8af29_m.jpg" width="240" height="180" alt="My Desk at Work" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I haven't taken a desk picture in a while... this one's a little boring compared to the last, but I figured I'd take it anyway. :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson/~4/y5I8L9l5PDs" height="1" width="1"/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=w5V6hcN5xDk:7AGlmIbE8JM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=w5V6hcN5xDk:7AGlmIbE8JM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=w5V6hcN5xDk:7AGlmIbE8JM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=w5V6hcN5xDk:7AGlmIbE8JM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=w5V6hcN5xDk:7AGlmIbE8JM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/w5V6hcN5xDk" height="1" width="1"/&gt;</description><dc:date.Taken>2008-11-04T16:13:52-08:00</dc:date.Taken><feedburner:origLink>http://www.flickr.com/photos/dotnetguy/3004253424/</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/y5I8L9l5PDs/</feedburner:origLink></item><item rdf:about="http://bradwilson.typepad.com/blog/2009/04/its-not-tdd-its-design-by-example.html">
<title>It&amp;rsquo;s Not TDD, It&amp;rsquo;s Design By Example</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/ECNE3vVky2g/its-not-tdd-its-design-by-example.html</link>
<description>The word “test” in software is a very loaded term. The first time I came across a tester (as in, a person performing the quality assurance role) was in my first professional job. We were never taught about testing at...</description>
<content:encoded><![CDATA[<p>The word “test” in software is a very loaded term. The first time I came across a tester (as in, a person performing the quality assurance role) was in my first professional job. We were never taught about testing at college, as we were all there to learn to be “developers”.</p>  <p>It turns out there are lots of different kinds of testing. In a series of blog posts titled <a href="http://www.exampler.com/old-blog/2004/05/26/#directions-toc">Agile Testing Directions</a>, Brian Marick came up with a 2x2 matrix of test types, and describse the activities which happen in each corner of the matrix. If you haven’t read the blog posts, they can help to provide a vocabulary about the kinds of testing that most software teams undertake.</p>  <p>A lot has changed in the nearly 6 years since Brian wrote those posts. Test Driven Development is arguably the most well known and most popular part of the <a href="http://www.extremeprogramming.org/">eXtreme Programming</a> software development process. For several years, I’ve been giving talks and coaching teams on how to do Test Driven Development, and by far the most frustrating part of the process has been overcoming people’s expectations when you use the word “test”. For most developers, “testing” is something that’s done by “testers”, not something that’s done by developers. Even those developers who are savvy enough to be doing unit testing are still practicing an activity whose primary purpose is quality assurance.</p>  <p>What the name Test Driven Development has going against it is that it doesn’t properly express the purpose of TDD; namely, that it is a process designed to help you drive and iterate the design of your implementation at the unit level. The result of the design process is unit tests, but their primary purpose is not one of quality assurance; rather, it is an expression of the intended usage of the component under design. In this way, the “tests” that you are writing become the first client of your component, and come into being <em>just</em> before the component’s code is written. The rhythm in TDD is “write a test, watch it fail; write the production code, watch the test now pass; when prudent, refactor the code to increase clarity and remove duplication”.</p>  <p>The unit tests written by TDD have some quality assurance value as a secondary effect of the test, but that is not their primary goal. Their primary goal is to help you design the code, and to give you a safety net with which to refactor your code. Note that when I use the word refactor, I mean it in the classical sense: <em>to change the internal implementation of a component without changing its externally observable behavior</em>; that is, if you find yourself needing to change a unit test, you are not doing refactoring.</p>  <p>Frustrated by the misunderstanding of the purpose of TDD, my friends and I (<a href="http://www.peterprovost.org/">Peter</a>, <a href="http://jamesnewkirk.typepad.com/">Jim</a>, <a href="http://www.agileprogrammer.com/oneagilecoder/">Brian</a>, <a href="http://scottdensmore.typepad.com/">Scott</a>, and many others, all agile practitioners and coaches) decided to start calling it Test Driven Design. A small change, but it starts to focus on the fact that the process is about <em>design</em>. Unfortunately, that “test” word baggage is still in there, so our next iteration was then Example Driven Design. This worked well too, but “EDD” and “TDD” were still too close together and confusing.</p>  <p>The final iteration ended up being Design By Example (DbE). Now when I talk about TDD, I always call it Design By Example, and explain why we like this name better than TDD. Where TDD(esign) or EDD failed to get traction, people really seem to resonate to Design By Example.</p>  <p>~ ~ ~</p>  <p>As an aside, you’ll note that most of the unit testing frameworks on .NET have the word “test” in them a lot. NUnit started this with the [Test] attribute, which MbUnit adopted, and MSTest converted into [TestMethod]. When Jim and I set out to design <a href="http://xunit.codeplex.com/">xUnit.net</a>, it originally had a [Test] attribute in it as well, which is how it was when we first talked about it publicly at the first ALT.NET event in Austin. Even before ALT.NET, we’d been lamenting the name [Test] for the attribute exactly because of this baggage with the word “test”. We wanted xUnit.net to be a framework that was first and foremost for TDD (erm, DbE) practitioners.</p>  <p>At the Austin event, we decided to rename [Test] to [Fact]. While some users have lamented this as an arbitrary change, we felt it was right because it removed the focus of the word “test” from the code that you were writing when doing DbE. It also lined up very well with the [Theory] feature we added to xUnit.net Extensions to support <a href="http://shareandenjoy.saff.net/2006/12/new-paper-practice-of-theories.html">David Saff’s data theories</a>. The essential difference is: a [Fact] is an expression of some condition which is invariant, whereas a [Theory] is an expression of a condition which is only necessarily true for the given set of data. As such, [Theory]s are driven with external data; if you provide invalid data, then the theory will potentially produce invalid results.</p>  <p>An example of a [Fact] is the condition which says, “if you have failed to properly initialize this object, when you call this method on it, it will throw InvalidOperationException”. There are no variations on this rule; it is always true. An example of a [Theory], using the classic <a href="http://imranontech.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/">FizzBuzz</a> interview question, is the condition which says, “if you pass a number which is divisible by 3, but not by 5, the result should be ‘Fizz’.” For this theory, you pass values which meet the initial requirement; if you were to pass 4 or 15, though, the result would be a failure, but that doesn’t mean the theory is bad, it simply means the preconditions for the theory weren’t properly met.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=R70yeoJgshY:sjUhwQTkEvA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=R70yeoJgshY:sjUhwQTkEvA:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=R70yeoJgshY:sjUhwQTkEvA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=R70yeoJgshY:sjUhwQTkEvA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=R70yeoJgshY:sjUhwQTkEvA:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/R70yeoJgshY" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=ECNE3vVky2g:R70yeoJgshY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=ECNE3vVky2g:R70yeoJgshY:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=ECNE3vVky2g:R70yeoJgshY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=ECNE3vVky2g:R70yeoJgshY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=ECNE3vVky2g:R70yeoJgshY:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/ECNE3vVky2g" height="1" width="1"/>]]></content:encoded>



<dc:creator>Brad Wilson</dc:creator>
<dc:date>2009-04-18T00:33:02-07:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2009/04/its-not-tdd-its-design-by-example.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/R70yeoJgshY/its-not-tdd-its-design-by-example.html</feedburner:origLink></item>
<item rdf:about="http://bradwilson.typepad.com/blog/2009/04/dataannotations-and-aspnet-mvc.html">
<title>DataAnnotations and ASP.NET MVC</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/yqizeYgj6Lw/dataannotations-and-aspnet-mvc.html</link>
<description>In .NET 3.5 SP1, the ASP.NET team introduced a new DLL named System.ComponentModel.DataAnnotations, in conjunction with the ASP.NET Dynamic Data project. The purpose of this DLL is to provide UI-agnostic ways of annotating your data models with semantic attributes like...</description>
<content:encoded><![CDATA[<p>In .NET 3.5 SP1, the ASP.NET team introduced a new DLL named System.ComponentModel.DataAnnotations, in conjunction with the ASP.NET Dynamic Data project. The purpose of this DLL is to provide UI-agnostic ways of annotating your data models with semantic attributes like [Required] and [Range]. Dynamic Data uses these attributes, when applied to your models, to automatically wire up to validators in WebForms. The UI-agnostic bit is important, and is why the functionality exists in the <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx">System.ComponentModel.DataAnnotations namespace</a>, rather than somewhere under System.Web.</p> <p>For .NET 4.0, the <a href="http://blogs.msdn.com/brada/archive/2009/03/19/what-is-net-ria-services.aspx">.NET RIA Services</a> team is also supporting DataAnnotations (which have been significantly enhanced since their initial introduction). This means that models you annotate can end up with automatic validation being performed in both client- and server-side code, supporting WebForms (via Dynamic Data) as well as Silverlight (via RIA Services).</p> <p>In our exploration of data support in <a href="http://www.asp.net/mvc">ASP.NET MVC</a>, we wrote a model binder which does server-side validation in MVC by relying on the DataAnnotations attributes. Using a preview of the .NET 4.0 DataAnnotations DLL (the same one that we released with <a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24887">Dynamic Data 4.0 Preview 3</a>), we extended the default model binder behavior to include DataAnnotations support, and then released the code as a <a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471">sample project</a> with unit tests.</p> <h3><strong>How Does It Work?</strong></h3> <p>The MVC DefaultModelBinder class has a lot of extensibility points, some of which are designed specifically with validation in mind. The DataAnnotations model binder leverages those extension points to allow DataAnnotations attributes to contribute to the validation of a model.</p> <p>For example, let’s take a simple model:</p> <pre class="brush:csharp">public class Contact
{
  public string FirstName { get; set; }

  public string LastName { get; set; }
}</pre>

<p>In a standard MVC application, if I want FirstName and LastName to be required, I have to write custom validation code to make this happen. My action method might look something like this:</p>

<pre class="brush:csharp">public ActionResult Edit(Contact contact)
{
  if (String.IsNullOrEmpty(contact.FirstName))
    ModelState.AddModelError("FirstName", "First name is required");

  if (String.IsNullOrEmpty(contact.LastName))
    ModelState.AddModelError("LastName", "Last name is required");

  try
  {
    if (ModelState.IsValid)
    {
      // Submit the changes to the database here
      return Redirect("Index");
    }
  }
  catch(Exception ex)
  {
    // Log the exception somewhere to be looked at later
    ModelState.AddModelError("*", "An unexpected error occurred.");
  }

  return View(contact);
}</pre>

<p>Now let’s take a look at the same model, but using DataAnnotations:</p>

<pre class="brush:csharp">public class Contact
{
  [Required]
  public string FirstName { get; set; }

  [Required]
  public string LastName { get; set; }
}</pre>

<p>And our updated action method:</p>

<pre class="brush:csharp">public ActionResult Edit(Contact contact)
{
  try
  {
    if (ModelState.IsValid)
    {
      // Submit the changes to the database here
      return Redirect("Index");
    }
  }
  catch(Exception ex)
  {
    // Log the exception somewhere to be looked at later
    ModelState.AddModelError("*", "An unexpected error occurred.");
  }

  return View(contact);
}</pre>

<p>Notice how much cleaner the action method is, now that the validation of the model has been moved into the metadata on the model itself. Now the action method can just focus on submission and error handling, without being concerned about how to validate the model. Score one for <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">separation of concerns</a>! :)</p>

<p>To make this work, you need to compile the DataAnnotations model binder project, and then added references to the two DLLs in you find in the src\bin\Debug folder (Microsoft.Web.Mvc.ModelBinders.dll and System.ComponentModel.DataAnnotations.dll).</p>

<p>Then, in your Global.asax.cs file, you make the following changes to register the model binder:</p>

<pre class="brush:csharp">void Application_Start()
{
  RegisterRoutes(RouteTable.Routes);
  RegisterModelBinders(ModelBinders.Binders); // Add this line
}

public void RegisterModelBinders(ModelBinderDictionary binders) // Add this whole method
{
  binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder();
}</pre>

<p>Now when you submit forms, the model binder will automatically find instances of the DataAnnotations attributes on your models and run the validations you’ve specified.</p>

<h3></h3>

<h3><strong>How Do I Test It?</strong></h3>

<p>Using the DataAnnotations attributes for your models moves the validation out of the controller actions and into the model binder, which means your unit tests for your controller actions will be simplified.</p>

<p>When you’re writing tests for this, you need to verify three things:</p>

<ol>
 <li>Is the DataAnnotationsModelBinder registered as the default binder?
  <br><em>You’ll only do this once for the whole application, much like the route tests you would write.</em>&nbsp;</li>
 <li>Is my model properly decorated with DataAnnotations attributes? 
  <br><em>You’ll end up writing tests for each validation attribute that you add to your model.</em></li>
 <li>Does my action method properly react when the model state is invalid?
  <br><em>You’ll only need to write this once per action method.</em></li>
</ol>

<p>Those tests will probably look something like this:</p>

<pre class="brush:csharp">[Fact]
public void Default_model_binder_is_DataAnnotationsModelBinder()
{
  // Arrange var binders = new ModelBinderDictionary();
  var application = new MvcApplication();

  // Act
  application.RegisterModelBinders(binders);

  // Assert
  Assert.IsType&lt;DataAnnotationsModelBinder&gt;(binders.DefaultBinder);
}

[Fact]
public void Contact_model_FirstName_is_required()
{
  // Arrange
  var propertyInfo = typeof(Contact).GetProperty("FirstName");

  // Act
  var attribute = propertyInfo.GetCustomAttributes(typeof(RequiredAttribute))
                .Cast&lt;RequiredAttribute&gt;()
                .FirstOrDefault();

  // Assert
  Assert.NotNull(attribute);
}

[Fact]
public void Contact_Edit_action_shows_view_with_invalid_ModelState()
{
  // Arrange
  var contact = new Contact();
  var controller = new ContactController();
  controller.ModelState.AddModelError("*", "Invalid model state");

  // Act
  var actionResult = controller.Edit(contact);

  // Assert
  var viewResult = Assert.IsType&lt;ViewResult&gt;(actionResult);
  Assert.Empty(viewResult.ViewName);
  Assert.Same(contact, viewResult.ViewData.Model);
}</pre>

<p>In your TDD rhythm, you’ll find yourself writing tests like #2 in advance of defining the models that will support those actions and views. Then you’ll find yourself writing tests like #3 in advance of adding new actions (that test obviously isn’t exhaustive, as it doesn’t test the valid model path nor the “throwing an exception” path, but you get the idea).</p>

<h3><strong>Where Did My “Validation” Tests Go?</strong></h3>

<p>One thing you’ll notice is that there is no test which explicitly says “given an empty first name, a model state error should occur”. The reason for that is simple: the DataAnnotations attributes behave in an <a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">AOP</a>-style fashion where their behavior becomes visible only when the whole system is functioning.</p>

<p>You can consider the DataAnnotations model binder like an accepted piece of infrastructure in your project, just like you already do for the default model binder (or the action invoker, or the controller factory, or any of the dozens of other moving parts that makes an ASP.NET MVC application “go”).</p>

<p>Even so, you may still want to have tests which verify that an empty first name edit box, when submitted, returns back a validation error to the user.</p>

<p>The most common way to see the system running as a whole is to do <a href="http://en.wikipedia.org/wiki/Exploratory_testing">exploratory testing</a>. In this way, you start the application and try using the forms with the validation attributes, and observe the behavior to ensure that the validation is taking place. Many QA departments rely primarily on scripted exploratory testing to ensure that applications are functioning properly before deploying them into production.</p>

<p>An alternative that is popular with agile teams is <a href="http://en.wikipedia.org/wiki/Acceptance_testing">automated acceptance testing</a>, where developers, testers and customers collaborate to write tests which ensure the functioning of the system as a whole, using tools like the <a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22739">Lightweight Test Automation Framework</a>. These tests allow customers to know that the application is functioning properly with a high degree of confidence, without the delays and manual labor involved with exploratory testing.</p>

<p>Happy validating!</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=9l3b9mut_FU:rDdMpK3asOw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=9l3b9mut_FU:rDdMpK3asOw:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=9l3b9mut_FU:rDdMpK3asOw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=9l3b9mut_FU:rDdMpK3asOw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=9l3b9mut_FU:rDdMpK3asOw:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/9l3b9mut_FU" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=yqizeYgj6Lw:9l3b9mut_FU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=yqizeYgj6Lw:9l3b9mut_FU:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=yqizeYgj6Lw:9l3b9mut_FU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=yqizeYgj6Lw:9l3b9mut_FU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=yqizeYgj6Lw:9l3b9mut_FU:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/yqizeYgj6Lw" height="1" width="1"/>]]></content:encoded>



<dc:creator>Brad Wilson</dc:creator>
<dc:date>2009-04-09T02:21:17-07:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2009/04/dataannotations-and-aspnet-mvc.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/9l3b9mut_FU/dataannotations-and-aspnet-mvc.html</feedburner:origLink></item>
<item rdf:about="http://bradwilson.typepad.com/blog/2009/02/announcing-xunitnet-contrib.html">
<title>Announcing xUnit.net Contrib</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/PHyP63d9sW0/announcing-xunitnet-contrib.html</link>
<description>Jim and I have a relatively limited amount of time to work on xUnit.net, since we’re not together in the same group any more. One of the things that has suffered as a result was the Resharper runner support, particular...</description>
<content:encoded><![CDATA[<p>Jim and I have a relatively limited amount of time to work on <a href="http://xunit.codeplex.com/">xUnit.net</a>, since we’re not together in the same group any more. One of the things that has suffered as a result was the Resharper runner support, particular since neither of us uses Resharper. This has been complicated by the fact that the Jetbrains team seems intent to breaking their extensibility APIs with every single release.</p>  <p><a href="http://sticklebackplastic.com/">Matt Ellis</a> approached us about contributing some fixes for the Resharper runner, and we all though it might be a great opportunity to launch an <a href="http://xunitcontrib.codeplex.com/">xUnit.net Contrib</a> project on CodePlex. Matt has <a href="http://sticklebackplastic.com/Posts/Post.aspx?postId=33c68a60-45fc-40de-b7f1-0db362f3d729">very graciously agreed to run the project</a>, whose first deliverable is a new Resharper runner with several bug fixes.</p>  <p>Thanks, Matt!</p>  <p>Everybody who uses xUnit.net and Resharper should go <a href="http://www.codeplex.com/xunitcontrib/Release/ProjectReleases.aspx">download the new runner bits</a>. :)</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=50YpUfV8L9U:hZt8o59QTIM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=50YpUfV8L9U:hZt8o59QTIM:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=50YpUfV8L9U:hZt8o59QTIM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=50YpUfV8L9U:hZt8o59QTIM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=50YpUfV8L9U:hZt8o59QTIM:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/50YpUfV8L9U" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=PHyP63d9sW0:50YpUfV8L9U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=PHyP63d9sW0:50YpUfV8L9U:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=PHyP63d9sW0:50YpUfV8L9U:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=PHyP63d9sW0:50YpUfV8L9U:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=PHyP63d9sW0:50YpUfV8L9U:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/PHyP63d9sW0" height="1" width="1"/>]]></content:encoded>


<dc:subject>Agile</dc:subject>
<dc:subject>Technical</dc:subject>
<dc:subject>xUnit.net</dc:subject>

<dc:creator>Brad Wilson</dc:creator>
<dc:date>2009-02-22T11:28:59-08:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2009/02/announcing-xunitnet-contrib.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/50YpUfV8L9U/announcing-xunitnet-contrib.html</feedburner:origLink></item>
<item rdf:about="http://bradwilson.typepad.com/blog/2009/02/when-is-a-type-not-a-type.html">
<title>When is a Type not a Type?</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/Jqo4SoMjtPc/when-is-a-type-not-a-type.html</link>
<description>On the .NET Framework, when we call GetType() on an object (or use the typeof operator), the documentation says it returns a Type. What most people don’t realize is that the Type class is an extensibility point in the system;...</description>
<content:encoded><![CDATA[<p>On the .NET Framework, when we call GetType() on an object (or use the typeof operator), the documentation says it returns a Type. What most people don’t realize is that the Type class is an extensibility point in the system; in fact, most of the members of Type are abstract or virtual. When you call GetType() or use typeof, what you’re actually getting back is an instance of RuntimeType.</p> <p>For the most part, developers don’t care that they’ve been handed a RuntimeType; it <em>should</em> be an implementation detail of the system. And, for most developers, it appears to be so; in fact, I’d estimate most developers aren’t even aware that RuntimeType exists. For most developers – including myself, until about 2 weeks ago – we’ve always thought of Type as something the system provides us. For most of us, Type == RuntimeType.</p> <p>However, there are places in the .NET Framework where a RuntimeType is actually required. In our happy cases, we don’t ever realize these exist because the method signatures all talk about Type, not RuntimeType. The requirement for a RuntimeType actually exists down inside the method code itself, only to be discovered at runtime (if we fail the check).</p> <p>An example of where RuntimeTypes are required is found in Activator.CreateInstance. You can take a generic type declaration (i.e., List&lt;&gt;) and use reflection to turn that into a concrete type declaration (i.e., List&lt;object&gt;):</p> <pre class="brush:csharp">Type genericListType = typeof(List&lt;&gt;);
Type listOfObjectType = genericListType.MakeGenericType(typeof(object));
List&lt;object&gt; objectList = (List&lt;object&gt;)Activator.CreateInstance(listOfObjectType);</pre>

<p>MakeGenericType will happily accept non-RuntimeTypes when creating the generic type, but as soon as you try to run Activator.CreateInstance() on it, you’ll get complaints that there are non-RuntimeTypes involved.</p>

<p><strong>Why would you ever have a non-RuntimeType Type?</strong></p>

<p>Since Type is an extensibility point in the system, you can derive from it and override members. One common reason you might want to do this is to influence the results of reflection; for example, adding or removing members that aren’t on the original type, or perhaps adding or removing attributes on members and/or parameters. Anything you can do with reflection, can be influenced by overriding methods or properties on Type.</p>

<p>In fact, the system provides just such a helper class for you: System.Reflection.TypeDelegator. The TypeDelegator class takes as its constructor parameter an existing Type object to wrap, and offers several virtual methods to be overriden (f.e., GetMethods) to provide hooks to influence the results of reflection. Anything you don’t specifically override is passed along to the wrapped Type.</p>

<p>In our example above, we used typeof(object) as the generic parameter type. The typeof operator is guaranteed to always return a RuntimeType, so this was a safe assumption. What if we'd been handed a Type instance, rather than getting one from the typeof operator?</p>

<p><strong>How can I handle non-RuntimeTypes?</strong></p>

<p>It's not safe to automatically assume that you've been handed a RuntimeType. If you write code that has to handle Type objects, and those objects come from any other method than the typeof operator, you have to consider the possibility that the Type you have isn’t a RuntimeType. You also need to be aware of the places where RuntimeTypes end up being required.</p>

<p>The Type class has a property named UnderlyingSystemType, which can be used to acquire the actual RuntimeType when you’re using a type delegator. Anywhere where you know you need a RuntimeType, you should use the UnderlyingSystemType property to retrieve it from any Type objects you’ve been given. If you call UnderlyingSystemType on a RuntimeType, it simply returns itself, since it’s already a RuntimeType.</p>

<p>In fact, Activator.CreateInstance does try to help you out as much as it can: when you pass it a Type object, it uses UnderlyingSystemType to ensure that it's talking to the RuntimeType rather than any type wrapper or delegator class. Of course, this only helps for top-level types; as we saw above, generics instantiated with non-RuntimeTypes will throw exceptions when you try to create them. There are other places in the framework where a non-RuntimeType will throw similar exceptions (f.e., setting a class’s base class when doing IL emit operations).</p>

<p>Unfortunately, the methods which require RuntimeType aren’t always obvious, because methods aren’t written with RuntimeType parameters. They often end up being checked at some point during runtime, to allow developers to pass around Type objects without being aware of their actual implementations. The best way to ensure that you properly handle non-RuntimeType Types is to write test code which passes instances of TypeDelegator into any of your methods which take a type. This will allow you to quickly determine when you’re calling methods which require RuntimeTypes.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=sGWOdaSFIjM:ckVBpN_esMM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=sGWOdaSFIjM:ckVBpN_esMM:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=sGWOdaSFIjM:ckVBpN_esMM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=sGWOdaSFIjM:ckVBpN_esMM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=sGWOdaSFIjM:ckVBpN_esMM:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/sGWOdaSFIjM" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=Jqo4SoMjtPc:sGWOdaSFIjM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=Jqo4SoMjtPc:sGWOdaSFIjM:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=Jqo4SoMjtPc:sGWOdaSFIjM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=Jqo4SoMjtPc:sGWOdaSFIjM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=Jqo4SoMjtPc:sGWOdaSFIjM:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/Jqo4SoMjtPc" height="1" width="1"/>]]></content:encoded>


<dc:subject>Technical</dc:subject>

<dc:creator>Brad Wilson</dc:creator>
<dc:date>2009-02-05T11:17:39-08:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2009/02/when-is-a-type-not-a-type.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/sGWOdaSFIjM/when-is-a-type-not-a-type.html</feedburner:origLink></item>
<item rdf:about="http://bradwilson.typepad.com/blog/2008/12/find-to-set-aliasps1.html">
<title>find-to-set-alias.ps1</title>
<link>http://feedproxy.google.com/~r/BradWilson-ThenetGuy/~3/fw9lsciLMro/find-to-set-aliasps1.html</link>
<description>Inspired by Harry's post, I made an expanded version of find-to-set-alias suitable to putting into a script (.ps1) file, which includes warnings and diagnostic information, with an optional -quiet switch (more useful for your profile to automatically find and alias...</description>
<content:encoded><![CDATA[<p>Inspired by <a href="http://devhawk.net/2008/12/17/PowerShell+Findtosetalias.aspx">Harry's post</a>, I made an expanded version of find-to-set-alias suitable to putting into a script (.ps1) file, which includes warnings and diagnostic information, with an optional -quiet switch (more useful for your profile to automatically find and alias things, when you expect that they might not be there).</p> <p><strong>Source: find-to-set-alias.ps1</strong></p><pre class="brush:powershell; gutter:false">param(
  $foldersearch = $(throw "foldersearch required"),
  $filename = $(throw "filename required"),
  $alias = $(throw "alias required"),
  [switch]$quiet
)

if ((test-path $foldersearch) -eq $false) {
  if ($quiet -eq $false) { write-warning ("Could not find any paths to match " + $foldersearch) }
  exit
}

# If the user specified a wildcard, turn the foldersearch into an array of matching items
# We don't always want to do this, because specifying a non-wildcard directory gives false positives

if ($foldersearch.contains('*') -or $foldersearch.contains('?')) {
  $foldersearch = Get-ChildItem $foldersearch -ErrorAction SilentlyContinue
}

$files = @($foldersearch | %{ Get-ChildItem $_ -Recurse -Filter $filename -ErrorAction SilentlyContinue })

if ($files -eq $null) {
  if ($quiet -eq $false) {
    write-warning ("Could not find " + $filename + " in searched paths:")
    $foldersearch | %{ write-warning (" " + $_) }
  }
  exit
}

set-alias $alias $files[0].FullName -scope Global

if ($quiet -eq $false) {
  write-host ("Added alias " + $alias + " for " + $files[0].FullName)
  if ($files.count -gt 1) {
    write-warning ("There were " + $files.count + " matches:")
    $files | %{ write-warning (" " + $_.FullName) }
  }
}</pre><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson?a=R7AVwINmIco:1TSPNJnPPNk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=R7AVwINmIco:1TSPNJnPPNk:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=R7AVwINmIco:1TSPNJnPPNk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson?a=R7AVwINmIco:1TSPNJnPPNk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson?i=R7AVwINmIco:1TSPNJnPPNk:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson/~4/R7AVwINmIco" height="1" width="1"/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=fw9lsciLMro:R7AVwINmIco:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=fw9lsciLMro:R7AVwINmIco:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=fw9lsciLMro:R7AVwINmIco:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?a=fw9lsciLMro:R7AVwINmIco:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/BradWilson-ThenetGuy?i=fw9lsciLMro:R7AVwINmIco:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/BradWilson-ThenetGuy/~4/fw9lsciLMro" height="1" width="1"/>]]></content:encoded>



<dc:creator>Brad Wilson</dc:creator>
<dc:date>2008-12-28T12:46:09-08:00</dc:date>
<feedburner:origLink>http://bradwilson.typepad.com/blog/2008/12/find-to-set-aliasps1.html</feedburner:origLink><feedburner:origLink>http://feedproxy.google.com/~r/BradWilson/~3/R7AVwINmIco/find-to-set-aliasps1.html</feedburner:origLink></item>


</rdf:RDF><!-- ph=1 --><!-- nhm:dynamic-ssi -->
