<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Ian Suttle's Blog</title>
    <description>... on managing software development and technology</description>
    <link>http://www.iansuttle.com/blog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.Net Syndication Generator 1.0.0.0 (http://dotnetblogengine.net/)</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://www.iansuttle.com/blog/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Ian Suttle</dc:creator>
    <dc:title>Ian Suttle's Blog</dc:title>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/IanSuttlesBlog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Transactions in Integration Tests</title>
      <description>&lt;p&gt;I was working with some integration tests recently and had an epiphany: Why don't I use transactions in a test to reset data?&amp;#160; I'm referring to a case where an integration test does something like write a new row to a database table.&amp;#160; If I'm running these tests over and over those rows add up unnecessarily.&amp;#160; Wrapping the integration test with something like TransactionScope in .NET makes resetting this data real easy.&lt;/p&gt;  &lt;p&gt;Take this hypothetical test in to consideration:&lt;/p&gt;  &lt;p&gt;[Test]   &lt;br /&gt;public void AddDatabaseRow()    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DataContext data = new DataContext();&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; SomeItem item = data.SaveItem(1, &amp;quot;abcd&amp;quot;);&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Assert.IsNotNull(item, &amp;quot;Return data was null&amp;quot;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(1, item.UserID, &amp;quot;UserID did not match&amp;quot;);    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;If I ran this test over and over again I'd have a duplicate table record added over and over again.&amp;#160; Sometimes that's not even possible when unique constraints are enforced such as having to have a unique email address.&amp;#160; The argument can be made that DataContext should be a mock object and not a live connection I suppose.&amp;#160; For argument's sake let's say there's a valid reason for doing an integration test this way:).&amp;#160; &lt;/p&gt;  &lt;p&gt;Now let's look at a test using a transaction to reset the data when we're done.&lt;/p&gt;  &lt;p&gt;[Test]   &lt;br /&gt;public void AddDatabaseRow()    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DataContext data = new DataContext();&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; using (TransactionScope trans = new TransactionScope())   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SomeItem item = data.SaveItem(1, &amp;quot;abcd&amp;quot;);&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.IsNotNull(item, &amp;quot;Return data was null&amp;quot;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(1, item.UserID, &amp;quot;UserID did not match&amp;quot;);&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;Using TransactionScope here performs a rollback after the assertions have been made and avoids permanently saving the database record to the table.&lt;/p&gt;  &lt;p&gt;What do you think about this?&amp;#160; Is there a better way to go about achieving the same goal of not committing records often?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1vjxhiaswbtUht-wcXZULXZVVP0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1vjxhiaswbtUht-wcXZULXZVVP0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1vjxhiaswbtUht-wcXZULXZVVP0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1vjxhiaswbtUht-wcXZULXZVVP0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/7C_MHAk51yw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/7C_MHAk51yw/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Transactions-in-Integration-Tests.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=2b1f6b17-4c4e-4cc4-8b70-62a0cc3ff7bf</guid>
      <pubDate>Thu, 20 Aug 2009 22:36:00 -0800</pubDate>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=2b1f6b17-4c4e-4cc4-8b70-62a0cc3ff7bf</pingback:target>
      <slash:comments>16</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=2b1f6b17-4c4e-4cc4-8b70-62a0cc3ff7bf</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Transactions-in-Integration-Tests.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=2b1f6b17-4c4e-4cc4-8b70-62a0cc3ff7bf</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=2b1f6b17-4c4e-4cc4-8b70-62a0cc3ff7bf</feedburner:origLink></item>
    <item>
      <title>Work and Life Balance</title>
      <description>&lt;p&gt;CNN.com has an article today called &lt;a href="http://www.cnn.com/2009/LIVING/worklife/05/11/weisure/index.html"&gt;Welcome to the 'weisure' lifestyle&lt;/a&gt;.&amp;#160; It's about the balance between work and life (leisure in the article)... or the lack thereof more precisely.&amp;#160; It's not that people are becoming increasingly chained to their desk at the office but more of their desk is becoming chained to them in life - where ever one goes.&amp;#160; It's the Blackberry, iPhone, and other forms of mobile communication that make this possible.&lt;/p&gt;  &lt;p&gt;Is this bad?&amp;#160; The old dogs might say this is a travesty but personally, I'm digging it.&amp;#160; I'm in this category of working while playing.&amp;#160; Why?&amp;#160; Because it's so darn easy!&amp;#160; If I can answer a few emails over the weekend from my phone I have that much less to do during the dreaded Monday morning and the ball keeps rolling instead of coming to a dead halt.&amp;#160; Of course, I've an advantage because I love what I do.&amp;#160; If you're not passionate about your job then this probably isn't for you.&amp;#160; Then again if it's passion you lack go find a new job right now.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UAcPcHDH5JerMXMY3bIjVKfhAOM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UAcPcHDH5JerMXMY3bIjVKfhAOM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UAcPcHDH5JerMXMY3bIjVKfhAOM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UAcPcHDH5JerMXMY3bIjVKfhAOM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/PsrVgy30g14" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/PsrVgy30g14/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Work-and-Life-Balance.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=3767585d-8a5c-4615-9b00-99517dc99e69</guid>
      <pubDate>Sat, 16 May 2009 13:06:49 -0800</pubDate>
      <category>General</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=3767585d-8a5c-4615-9b00-99517dc99e69</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=3767585d-8a5c-4615-9b00-99517dc99e69</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Work-and-Life-Balance.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=3767585d-8a5c-4615-9b00-99517dc99e69</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=3767585d-8a5c-4615-9b00-99517dc99e69</feedburner:origLink></item>
    <item>
      <title>Save a Buck and Learn Something New</title>
      <description>&lt;p&gt;
This is an exciting moment for me.&amp;nbsp; I&amp;#39;ve been doing software dev for over a decade and I&amp;#39;ve never ventured in to the electronics aspects of assembly.&amp;nbsp; Sure I&amp;#39;ve put my own computers together but that became old hat in the late 90s.&amp;nbsp; Today I broke out of my comfort zone and I replaced a capacitor on the main board of my Panasonic DVP642 DVD player.&amp;nbsp; Slim chance but if you have the &lt;a href="http://tech.groups.yahoo.com/group/philips_dvp642/message/1720"&gt;Panasonic DVP642 with a blinking red light&lt;/a&gt; check out this article for how to repair it.
&lt;/p&gt;
&lt;p&gt;
W00t!
&lt;/p&gt;
&lt;p&gt;
I know, lame for most but it&amp;#39;s new territory for me.&amp;nbsp; I figured I could either purchase a new DVD player or I could fix mine myself therefore saving a few bucks and more importantly learning something new.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
It was easier than I expected although I did make one rookie mistake when I opened the capacitor plastic bag and threw it out of my view... right on to the soldering iron where it instantly melted and smoked up my kitchen counter space.
&lt;/p&gt;
&lt;p&gt;
If you&amp;#39;ve not repaired an electronics device on your own before give it a shot.&amp;nbsp; It was educational and rewarding.
&lt;/p&gt;
&lt;p&gt;
P.S. If you try this at home and notice your colors no longer work right, ensure you plugged in your cables all the way when reconnecting to your TV :).
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7Ko7ajUpr_BOxeORVrnXpRqPk9c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7Ko7ajUpr_BOxeORVrnXpRqPk9c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7Ko7ajUpr_BOxeORVrnXpRqPk9c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7Ko7ajUpr_BOxeORVrnXpRqPk9c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/-nqTGYN4ZAs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/-nqTGYN4ZAs/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Save-a-Buck-and-Learn-Something-New.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=bd205489-1b04-4930-b250-cb1befba9cc5</guid>
      <pubDate>Sun, 03 May 2009 20:00:00 -0800</pubDate>
      <category>Electronics</category>
      <category>General</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=bd205489-1b04-4930-b250-cb1befba9cc5</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=bd205489-1b04-4930-b250-cb1befba9cc5</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Save-a-Buck-and-Learn-Something-New.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=bd205489-1b04-4930-b250-cb1befba9cc5</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=bd205489-1b04-4930-b250-cb1befba9cc5</feedburner:origLink></item>
    <item>
      <title>ASP.NET MVC Action Filter for Localized Sites</title>
      <description>&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This is my first attempt at creating an &lt;strong&gt;ASP.NET MVC Action Filter&lt;/strong&gt; and was developed using the ASP.NET MVC Release Candidate Refresh 1 release.&amp;#160; I doubt things change much on this topic before RTM. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Your mission: to make your site available to multiple cultures and languages by way of ASP.NET MVC localization, globalization, internationalization, or whatever term you prefer to use.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;You’re familiar with cultures right?&amp;#160; It's the combination of language and country, usually identified in software using ISO culture codes.&amp;#160; The ISO culture code for English in the United States is &amp;quot;en-US&amp;quot;, &amp;quot;en-CA&amp;quot; for English in Canada, &amp;quot;fr-CA&amp;quot; for French in Canada, and so on. &lt;/p&gt;  &lt;p&gt;If you've got or want a site which supports multiple cultures using ASP.NET MVC localization you need to be familiar with setting &lt;strong&gt;CultureInfo&lt;/strong&gt; values for the current thread and UI.&amp;#160; The .NET Framework uses this info to do a few key things.&amp;#160; First, if you're using resource files the framework knows which to pick up because the resource file name specifies the culture.&amp;#160; Secondly the culture is used as a formatter argument for various methods such as ToString().&amp;#160; The culture needs to be set for each page request as it's based on the current thread.&amp;#160; For more info on this end of things check out &lt;a href="http://www.ondotnet.com/pub/a/dotnet/2005/08/08/localizingaspnet20.html?page=1"&gt;Localization in ASP.NET 2.0&lt;/a&gt; - I found it quite helpful. &lt;/p&gt;  &lt;p&gt;Once you know which culture the user's experience should use you'll want to persist that somehow.&amp;#160; Maybe it's in a cookie, the session, embedded in the URL, etc.&amp;#160; In ASP.NET web forms you might include this detection in a base page or the global.asax for each page load.&amp;#160; &lt;/p&gt;  &lt;p&gt;ASP.NET MVC provides another nifty trick for handling things on each action call - Action Filters.&amp;#160; I thought it'd be interesting to figure out some ways of doing internationalization in ASP.NET MVC so I came up with an ASP.NET MVC action filter to include on a &lt;strong&gt;controller class&lt;/strong&gt; for setting the culture for each action call.&amp;#160; Currently it supports keeping the culture in a cookie, the querystring, session state, and the URL path. &lt;/p&gt;  &lt;p&gt;Using the filter is simple.&amp;#160; Assuming the SetCultureAttribute class is included in your project you decorate a controller class with it.&amp;#160; You must set the CultureStore&amp;#160; (type of CultureLocation) to indicate where the culture code comes from, and then one or two other properties to provide more hints at getting to the culture code.&amp;#160; Here's an example for storing the culture code in the query string.&amp;#160; In this example the URL would be expected to include a param called &amp;quot;culture&amp;quot; such as in this URL: &amp;quot;http://localhost/?culture=en-GB&amp;quot;. &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[&lt;font color="#0080ff"&gt;HandleError&lt;/font&gt;]       &lt;br /&gt;[&lt;font color="#0080ff"&gt;SetCulture&lt;/font&gt;(CultureStore = &lt;font color="#0080ff"&gt;SetCultureAttribute.CultureLocation&lt;/font&gt;.QueryString, QueryStringParamName = &amp;quot;&lt;font color="#ff0000"&gt;culture&lt;/font&gt;&amp;quot;)]       &lt;br /&gt;&lt;font color="#0000ff"&gt;public class&lt;/font&gt; &lt;font color="#0080ff"&gt;HomeController&lt;/font&gt; : &lt;font color="#0080ff"&gt;Controller&lt;/font&gt;       &lt;br /&gt;{ ... &lt;em&gt;actions&lt;/em&gt; ... }&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;If stored in session you'd modify the SetCulture properties to something similar to: &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[&lt;font color="#0080ff"&gt;SetCulture&lt;/font&gt;(CultureStore = &lt;font color="#0080ff"&gt;SetCultureAttribute.CultureLocation&lt;/font&gt;.Session, SessionParamName = &amp;quot;&lt;font color="#ff0000"&gt;culture&lt;/font&gt;&amp;quot;)]&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;If stored in a cookie you'd modify the SetCulture properties to something similar to: &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[&lt;font color="#0080ff"&gt;SetCulture&lt;/font&gt;(CultureStore = &lt;font color="#0080ff"&gt;SetCultureAttribute.CultureLocation&lt;/font&gt;.Cookie, CookieName = &amp;quot;&lt;font color="#ff0000"&gt;culture&lt;/font&gt;&amp;quot;)]&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;If stored in the URL path your actions will need to expect language and country parameters and your route needs to account for the same.&amp;#160; For my implementation I modified my default route and assumed the &amp;quot;en-US&amp;quot; culture if nothing else was specified.&amp;#160; This code expects a URL formatted like &amp;quot;http://localhost/en/us/home/about&amp;quot;.&amp;#160; There will be some kinks to work out with this one: &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;routes.MapRoute(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Default&amp;quot;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#00ff00"&gt;&lt;font color="#00f000"&gt;// Route name          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;{language}/{country}/{controller}/{action}/{id}&amp;quot;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // URL with parameters&lt;/font&gt;         &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;new&lt;/font&gt; { controller = &amp;quot;&lt;font color="#ff0000"&gt;Home&lt;/font&gt;&amp;quot;, action = &amp;quot;&lt;font color="#ff0000"&gt;Index&lt;/font&gt;&amp;quot;, id = &amp;quot;&amp;quot;, language = &amp;quot;&lt;font color="#ff0000"&gt;en&lt;/font&gt;&amp;quot;, country = &amp;quot;&lt;font color="#ff0000"&gt;US&lt;/font&gt;&amp;quot; }&amp;#160; &lt;font color="#00f000"&gt;// Parameter defaults&lt;/font&gt;       &lt;br /&gt;);&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;Using this updated route you'd modify the SetCulture properties to: &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[&lt;font color="#0080ff"&gt;SetCulture&lt;/font&gt;(CultureStore = &lt;font color="#0080ff"&gt;SetCultureAttribute.CultureLocation&lt;/font&gt;.URL, CountryActionParamName = &amp;quot;&lt;font color="#ff0000"&gt;country&lt;/font&gt;&amp;quot;, LanguageActionParamName = &amp;quot;&lt;font color="#ff0000"&gt;language&lt;/font&gt;&amp;quot;)]&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;... etc. &lt;/p&gt;  &lt;p&gt;Assuming the culture code is found then the thread and UI culture will be automatically set in this fashion: &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0080ff"&gt;CultureInfo&lt;/font&gt; culture = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#0080ff"&gt;CultureInfo&lt;/font&gt; (cultureCode);       &lt;br /&gt;System.Threading.&lt;font color="#0080ff"&gt;Thread&lt;/font&gt;.CurrentThread.CurrentCulture = culture;       &lt;br /&gt;System.Threading.&lt;font color="#0080ff"&gt;Thread&lt;/font&gt;.CurrentThread.CurrentUICulture = culture;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://media.iansuttle.com/blog/files/setcultureattribute.zip"&gt;Click here to get the full SetCultureAttribute class&lt;/a&gt;.&amp;#160; Don't forget to change the namespace to match your own. &lt;/p&gt;  &lt;p&gt;Have you any experience with localized sites in ASP.NET MVC?&amp;#160; How did you approach this topic? &lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.iansuttle.com%2fblog%2fpost%2fASPNET-MVC-Action-Filter-for-Localized-Sites.aspx"&gt;&lt;img height="18" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.iansuttle.com%2fblog%2fpost%2fASPNET-MVC-Action-Filter-for-Localized-Sites.aspx&amp;amp;bgcolor=33FF00&amp;amp;cfgcolor=FFFFFF&amp;amp;cbgcolor=00CC00" width="82" border="0" /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/C6weExAlz62OOSYDh0cyphuQ69A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/C6weExAlz62OOSYDh0cyphuQ69A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/C6weExAlz62OOSYDh0cyphuQ69A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/C6weExAlz62OOSYDh0cyphuQ69A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/z2FOr3EFSw8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/z2FOr3EFSw8/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/ASPNET-MVC-Action-Filter-for-Localized-Sites.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=906af298-5cdd-44be-91c6-0d1fd1b16be9</guid>
      <pubDate>Sat, 21 Feb 2009 01:46:00 -0800</pubDate>
      <category>.NET 3.5</category>
      <category>ASP.Net MVC</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=906af298-5cdd-44be-91c6-0d1fd1b16be9</pingback:target>
      <slash:comments>12</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=906af298-5cdd-44be-91c6-0d1fd1b16be9</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/ASPNET-MVC-Action-Filter-for-Localized-Sites.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=906af298-5cdd-44be-91c6-0d1fd1b16be9</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=906af298-5cdd-44be-91c6-0d1fd1b16be9</feedburner:origLink></item>
    <item>
      <title>Git er Done or Do it Right</title>
      <description>&lt;p&gt;
Programmers are paid to create, fix, and innovate.&amp;nbsp; How you go about these tasks comes in two flavors - the quick and dirty method or doing it right.&amp;nbsp; The typical reaction of a programmer is to strike down the quick and dirty route with eyeball laser beams because they want to have the time to do it right.&amp;nbsp; Who can blame them?&amp;nbsp; Nobody wants to write code they&amp;#39;re not going to be proud of. 
&lt;/p&gt;
&lt;p&gt;
But what about those times when quick and dirty is appropriate?&amp;nbsp; Sure, there are those times such as in prototyping or throwing an idea out there to see if it sticks.&amp;nbsp; Prototyping&amp;#39;s the obvious candidate for speedy delivery.&amp;nbsp; You&amp;#39;re just proving your theory and, in some universe I&amp;#39;ve yet to travel to, you&amp;#39;ll have time to write it &amp;quot;the right way&amp;quot; if the software is going to stick around or evolve.&amp;nbsp; Now the other reason, the &amp;quot;throwing an idea out there&amp;quot; reason, is different than prototyping.&amp;nbsp; In this case I&amp;#39;m talking about something you plan on releasing to the public.&amp;nbsp; This is sort of a super prototype with polish.&amp;nbsp; It has to look right, and act right, but ya don&amp;#39;t have to build it right.&amp;nbsp; Why not?&amp;nbsp; Because the purpose is to just see if it works with real people.&amp;nbsp; Do people use it... is it making money... etc.&amp;nbsp; If all signs point to yes then take the time and do it right. 
&lt;/p&gt;
&lt;p&gt;
&amp;quot;Doing it right&amp;quot; provides for lasting benefit.&amp;nbsp; Build a stable foundation for the house that&amp;#39;s going to be lived in.&amp;nbsp; I&amp;#39;m not saying to ignore the &lt;a href="http://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It"&gt;YAGNI&lt;/a&gt; principles and build everything up front, but I am saying if you&amp;#39;re not doing it for the near-term-test, then do whatever it is you REALLY need to do, and do it right.&amp;nbsp; Say it with me... do - it - right.&amp;nbsp; Your yard stick for what &amp;quot;do it right&amp;quot; means is up to you of course.&amp;nbsp; You&amp;#39;ll know. 
&lt;/p&gt;
&lt;p&gt;
Choosing your method of development is a factor (maybe a major one) in the key to success for your product, business, and team, so think before you act. 
&lt;/p&gt;
&lt;p&gt;
How&amp;#39;s this work in your organization or with previous employers?&amp;nbsp; Is this something you get to decide?&amp;nbsp; If you&amp;#39;re prototyping are you getting to rebuild the software when the time is right? 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/miS4v43xT_HVB2LuhbHFbpHUEeE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/miS4v43xT_HVB2LuhbHFbpHUEeE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/miS4v43xT_HVB2LuhbHFbpHUEeE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/miS4v43xT_HVB2LuhbHFbpHUEeE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/vgzbK0DDsNI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/vgzbK0DDsNI/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Git-er-Done-or-Do-it-Right.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=194f5f34-df66-480d-88a3-f05efbf60689</guid>
      <pubDate>Mon, 09 Feb 2009 00:53:00 -0800</pubDate>
      <category>General</category>
      <category>Process</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=194f5f34-df66-480d-88a3-f05efbf60689</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=194f5f34-df66-480d-88a3-f05efbf60689</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Git-er-Done-or-Do-it-Right.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=194f5f34-df66-480d-88a3-f05efbf60689</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=194f5f34-df66-480d-88a3-f05efbf60689</feedburner:origLink></item>
    <item>
      <title>The Dilemma With Multiple Versions of Source Code</title>
      <description>&lt;!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-alt:"Calisto MT";
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-alt:"Times New Roman";
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1073750139 0 0 159 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
span.EmailStyle15
{mso-style-type:personal;
mso-style-noshow:yes;
mso-style-unhide:no;
mso-ansi-font-size:11.0pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-hansi-font-family:Calibri;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
color:windowtext;
font-weight:normal;
font-style:normal;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.Section1
{page:Section1;}
--&gt;
&lt;p class="MsoNormal"&gt;
We&amp;rsquo;ve been trying to tackle the topic of how to support multiple versions of software safely.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The emphasis has been on ensuring the changes you make to software are the only changes reflected in a build.&lt;span&gt;&amp;nbsp; &lt;/span&gt;This is different than your changes being included with other changes done you&amp;rsquo;re not aware of.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Shared libraries&amp;nbsp;are the most obvious examples I can think of.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Getting in to that situation introduces loads of risk we have no interest in taking on.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Alas, that is the situation we&amp;rsquo;re in today. 
&lt;/p&gt;
&lt;h2&gt;Scenario: Library changes and we need to update an older version&lt;/h2&gt;
&lt;p class="MsoNormal"&gt;
In this scenario consider we have a shared library with a bunch of classes in it.&lt;span&gt;&amp;nbsp; &lt;/span&gt;That shared library is included in a web app we released.&lt;span&gt;&amp;nbsp; &lt;/span&gt;We label the solution as &amp;ldquo;My App 1.0.0&amp;rdquo;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Over time the shared library is modified to the point the it loses backwards compatibility for one reason or another.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The modified solution is known as &amp;ldquo;My App 2.0.0&amp;rdquo;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Suddenly we come across a bug with the &amp;ldquo;My App 1.0.0&amp;rdquo; version which requires emergency resolution in the shared library. 
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
We can&amp;rsquo;t get latest on that library to apply our fix because latest is now &amp;ldquo;My App 2.0.0&amp;rdquo;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;If we get from the label &amp;ldquo;My App 1.0.0&amp;rdquo; we could make our fix and mark it as &amp;ldquo;My App 1.0.1&amp;rdquo;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The problem then is checking that code back in would become &amp;ldquo;latest&amp;rdquo; where in reality &amp;ldquo;My App 2.0.0&amp;rdquo; should continue to be the latest.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Of course, we&amp;rsquo;d want to apply our fix to &amp;ldquo;My App 2.0.0&amp;rdquo; if it still applies.&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;h2&gt;A&amp;nbsp;proposed solution:&lt;/h2&gt;
&lt;p class="MsoNormal"&gt;
1. Get &amp;ldquo;My App 1.0.0&amp;rdquo;&lt;br /&gt;
2. Apply fix&lt;br /&gt;
3. Check in the code and label solution as &amp;ldquo;My App 1.0.1&amp;rdquo;&lt;br /&gt;
4. Get &amp;ldquo;My App 2.0.0&amp;rdquo;&lt;br /&gt;
5. Apply fix&lt;br /&gt;
6. Check in the code and label solution as &amp;ldquo;My App 2.0.0&amp;rdquo; 
&lt;/p&gt;
&lt;h2 class="MsoNormal"&gt;Another proposed solution:&lt;/h2&gt;
&lt;p class="MsoNormal"&gt;
1. On release, &lt;a href="http://en.wikipedia.org/wiki/Branching_(software)" title="branch"&gt;branch&lt;/a&gt; &amp;quot;My App 1.0.0&amp;quot; to a Release area of your repository.&amp;nbsp; The branch would include all libraries necessary to support the application.&lt;br /&gt;
2. Continue developing &amp;quot;My App 2.0.0&amp;quot; in the &lt;a href="http://en.wikipedia.org/wiki/Trunk_(software)" title="trunk"&gt;trunk&lt;/a&gt;&lt;br /&gt;
3. To fix something in &amp;quot;My App 1.0.0&amp;quot; update the &lt;a href="http://en.wikipedia.org/wiki/Branching_(software)" title="branch"&gt;branch&lt;/a&gt; created earlier and apply a label such as &amp;quot;My App 1.0.1&amp;quot;&lt;br /&gt;
4. Merge changes&amp;nbsp;from &amp;quot;My App 1.0.1&amp;quot; in to the &lt;a href="http://en.wikipedia.org/wiki/Trunk_(software)" title="trunk"&gt;trunk&lt;/a&gt; where &amp;quot;My App 2.0.0&amp;quot; is being developed 
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
Both options provide&amp;nbsp;a fix to &amp;ldquo;My App 1.0.0&amp;rdquo; to be tested and released, applies the fix to &amp;ldquo;My App 2.0.0&amp;rdquo;, and leaves &amp;ldquo;My App 2.0.0&amp;rdquo; as &amp;ldquo;latest&amp;rdquo;.&lt;span&gt;&amp;nbsp; &lt;/span&gt;If in the future another fix were needed for &amp;ldquo;My App 1.0.1&amp;rdquo;, we&amp;rsquo;d repeat this process. 
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
How would you normally go about this?&lt;span&gt;&amp;nbsp; &lt;/span&gt;Are we making it too complicated or does this sound reasonable?&amp;nbsp; Does the fact that we&amp;#39;re using Team Foundation Server for our respository offer any advantages or disadvantages? 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EoM0yPwN6oqJgX86b6eDeHBfqIc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EoM0yPwN6oqJgX86b6eDeHBfqIc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EoM0yPwN6oqJgX86b6eDeHBfqIc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EoM0yPwN6oqJgX86b6eDeHBfqIc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/G0umjp7_T-g" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/G0umjp7_T-g/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/The-Dilemma-With-Multiple-Versions-of-Source-Code.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=da15fe17-43be-4683-965a-387964ab20c2</guid>
      <pubDate>Tue, 06 Jan 2009 15:51:00 -0800</pubDate>
      <category>Source Control</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=da15fe17-43be-4683-965a-387964ab20c2</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=da15fe17-43be-4683-965a-387964ab20c2</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/The-Dilemma-With-Multiple-Versions-of-Source-Code.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=da15fe17-43be-4683-965a-387964ab20c2</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=da15fe17-43be-4683-965a-387964ab20c2</feedburner:origLink></item>
    <item>
      <title>IGN Entertainment is Hiring Software Engineers</title>
      <description>&lt;p&gt;
Here at &lt;a href="http://www.ign.com" target="_blank" title="IGN Entertainment"&gt;IGN Entertainment&lt;/a&gt; we&amp;#39;re almost always looking for smart and curious software engineers to join our teams.&amp;nbsp; Whether you&amp;#39;re a .NET (C#), Java, or C++ programmer we&amp;#39;d like to hear from you.&amp;nbsp; We prefer a bit of experience and a degree, but if you&amp;#39;re one of those natural whiz kids continue reading. 
&lt;/p&gt;
&lt;p&gt;
Why might you want to work at IGN?&amp;nbsp; I&amp;#39;m biased of course, but we&amp;#39;re absolutely awesome ;).&amp;nbsp; We work on a variety of applications including ecommerce, media, file distribution... we cater to heavy spikes of demand (our page loads are measured in millions to hundreds of millions per month)... we&amp;#39;re not afraid of new technology... the gaming industry is always changing... flexible schedules, casual dress, competitive pay, good benefits, blah blah blah. 
&lt;/p&gt;
&lt;p&gt;
If you&amp;#39;re not repulsed by such awesomeness feel free to contact me! 
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/b-kqY3Gqv2kLXKUguAYbzpR981c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b-kqY3Gqv2kLXKUguAYbzpR981c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/b-kqY3Gqv2kLXKUguAYbzpR981c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b-kqY3Gqv2kLXKUguAYbzpR981c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/ycsGmLcq7g0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/ycsGmLcq7g0/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/IGN-Entertainment-is-Hiring-Software-Engineers.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=252e2dc9-54d1-4f62-b5b4-e8aaf01c292e</guid>
      <pubDate>Sat, 29 Nov 2008 15:15:00 -0800</pubDate>
      <category>General</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=252e2dc9-54d1-4f62-b5b4-e8aaf01c292e</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=252e2dc9-54d1-4f62-b5b4-e8aaf01c292e</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/IGN-Entertainment-is-Hiring-Software-Engineers.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=252e2dc9-54d1-4f62-b5b4-e8aaf01c292e</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=252e2dc9-54d1-4f62-b5b4-e8aaf01c292e</feedburner:origLink></item>
    <item>
      <title>Betting on Story Points</title>
      <description>&lt;p&gt;Welcome to part four in our ongoing quest to bring an effective &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;agile development&lt;/a&gt; process to &lt;a href="http://www.ign.com"&gt;IGN Entertainment&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Something we're looking at adding to our agile tool belt is estimating stories using &lt;a href="http://en.wikipedia.org/wiki/Story_points"&gt;story points&lt;/a&gt;.&amp;#160; If you're not familiar with story points think of them as an estimation using a relative level of effort/complexity.&lt;/p&gt;  &lt;p&gt;When getting started with &lt;strong&gt;story points&lt;/strong&gt; they don't provide you much benefit beyond understanding how one story's effort compares to another i.e. &amp;quot;this story is a 1 and that story is a 13&amp;quot;.&amp;#160; More on that later.&amp;#160; The real value comes as you make your way through numbers of sprints and releases.&amp;#160; As you progress you can look back and see how many story points a team can accomplish during a sprint.&amp;#160; Naturally, if the team's composition isn't constant the velocity begins to become less accurate.&amp;#160; The measurement of story points completed over a given amount of time is referred to as &lt;strong&gt;velocity&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Velocity = (Story Points Completed / Iterations)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Example: 50 Story Points Completed / 5 Iterations = a velocity of 10 story points&lt;/p&gt;  &lt;p&gt;Velocity is handy as a means of understanding the general capacity of a team.&amp;#160; If a team, on average, can accomplish twenty story points per sprint, then you've established a story points budget, and you'd plan for about twenty story points for the next sprint.&amp;#160; That might be ten stories or that might be just one story depending on the points associated with the stories.&amp;#160; Taking it a bit further, using velocity &lt;strong&gt;allows you to estimate a release timeline&lt;/strong&gt; using some simple math.&amp;#160; Consider the following formula to estimate the number of iterations/sprints before a release:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Estimated Iterations = (Story Points / Velocity)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Example: (100 Story Points Remaining / 20 Story Points Velocity) = estimate of 5 iterations&lt;/p&gt;  &lt;p&gt;In this example, if an iteration was 2 weeks you'd have a good estimate of being 10 weeks out from release.&lt;/p&gt;  &lt;p&gt;There's not a hard-fast rule for how to estimate with story points but we're taking a liking to &lt;a href="http://www.planningpoker.com"&gt;Planning Poker&lt;/a&gt;.&amp;#160; The attraction is the &lt;strong&gt;estimates are done by the team&lt;/strong&gt; and not by individuals.&amp;#160; Making a game out of it doesn't hurt either :).&amp;#160; If people greatly differ in their point estimates the team discusses why and re-estimates until the members of the team are close enough to just take the conservative end of the estimations.&lt;/p&gt;  &lt;p&gt;My favorite form of story points uses numbers from what basically equates to a &lt;a href="http://en.wikipedia.org/wiki/Fibonacci_number"&gt;Fibonacci sequence&lt;/a&gt; (with some reasonable modifications for ease of use):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://iansuttle.com/blog/image.axd?picture=WindowsLiveWriter/892ebc2dcf0f_1AA1/image_2.png"&gt;&lt;img height="118" alt="image" src="http://iansuttle.com/blog/image.axd?picture=WindowsLiveWriter/892ebc2dcf0f_1AA1/image_thumb.png" width="481" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The idea is the higher the estimate the more risk/unknown/general the story is.&amp;#160; It would seem optimal to have story estimates as far left as possible as they require less effort, are more well defined, and as the major bonus, should allow for a more accurate estimate.&lt;/p&gt;  &lt;p&gt;The application of stories points feels very promising to us.&amp;#160; Like everything else we add to our process it's not going to be a silver bullet but does fit in with us always looking to incrementally improve.&lt;/p&gt;  &lt;p&gt;Have you used story points for estimating?&amp;#160; Has your experience been positive or challenging?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0yWSZvEJcsWeWD3KUGAVvIBUGd0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0yWSZvEJcsWeWD3KUGAVvIBUGd0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0yWSZvEJcsWeWD3KUGAVvIBUGd0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0yWSZvEJcsWeWD3KUGAVvIBUGd0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/2MKqSmDkHC4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/2MKqSmDkHC4/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Betting-on-Story-Points.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=dcd437c6-7b56-49d2-afd5-8a89bd4745e9</guid>
      <pubDate>Sat, 15 Nov 2008 00:49:32 -0800</pubDate>
      <category>Agile</category>
      <category>Process</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=dcd437c6-7b56-49d2-afd5-8a89bd4745e9</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=dcd437c6-7b56-49d2-afd5-8a89bd4745e9</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Betting-on-Story-Points.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=dcd437c6-7b56-49d2-afd5-8a89bd4745e9</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=dcd437c6-7b56-49d2-afd5-8a89bd4745e9</feedburner:origLink></item>
    <item>
      <title>Hulu.com is that Cool</title>
      <description>&lt;p&gt;I've heard of &lt;a href="http://www.hulu.com" target="_blank"&gt;Hulu&lt;/a&gt;, but until now I hadn't checked it out.&amp;#160; This TV season started a few weeks ago and I've already had DVR mishaps with the &lt;a href="http://www.hulu.com/terminator-the-sarah-connor-chronicles" target="_blank"&gt;Terminator: The Sarah Connor Chronicles&lt;/a&gt; and &lt;a href="http://www.hulu.com/heroes" target="_blank"&gt;Heroes&lt;/a&gt; series and I needed a way to get caught up.&amp;#160; Hulu allowed me to search for the episodes I've missed, queue them up, and play them in full screen... my hero.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Bn7_yhBwZHoKEPh6Yj6_qfjubgY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bn7_yhBwZHoKEPh6Yj6_qfjubgY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Bn7_yhBwZHoKEPh6Yj6_qfjubgY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bn7_yhBwZHoKEPh6Yj6_qfjubgY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/ZPZAvZP7ZCE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/ZPZAvZP7ZCE/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Hulucom-is-that-Cool.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=713c0150-54cb-4b11-9469-59fa07482017</guid>
      <pubDate>Sun, 05 Oct 2008 00:44:42 -0800</pubDate>
      <category>General</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=713c0150-54cb-4b11-9469-59fa07482017</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=713c0150-54cb-4b11-9469-59fa07482017</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Hulucom-is-that-Cool.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=713c0150-54cb-4b11-9469-59fa07482017</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=713c0150-54cb-4b11-9469-59fa07482017</feedburner:origLink></item>
    <item>
      <title>Google Chart API - Flexible and Free Charting</title>
      <description>&lt;p&gt;Including charts in your applications often adds value and polish.&amp;#160; If you don't have a charting package in your tool belt choosing one can be both confusing and expensive.&amp;#160; &lt;/p&gt;  &lt;p&gt;If you're in this boat check out &lt;a title="Google Charts API" href="http://code.google.com/apis/chart/" target="_blank"&gt;Google Charts&lt;/a&gt;, which offers free charting with lots of options.&amp;#160; And by &amp;quot;free&amp;quot;, I mean free... but Google does ask you let them know if you'll be cranking out more than 250,000 charts a day.&amp;#160; For you Web 2.0 and cloud junkies this option fits the bill perfectly.&amp;#160; &lt;/p&gt;  &lt;p&gt;The API is just a combination of URL querystring parameters.&amp;#160; Here's a basic example:&lt;/p&gt;  &lt;p&gt;This URL: &lt;a title="http://chart.apis.google.com/chart?chs=300x100&amp;amp;chd=t:40,40,10,10&amp;amp;cht=p3&amp;amp;chl=Java|.NET|PHP|Ruby+on+Rails" href="http://chart.apis.google.com/chart?chs=300x100&amp;amp;chd=t:40,40,10,10&amp;amp;cht=p3&amp;amp;chl=Java|.NET|PHP|Ruby+on+Rails"&gt;http://chart.apis.google.com/chart?chs=300x100&amp;amp;chd=t:40,40,10,10&amp;amp;cht=p3&amp;amp;chl=Java|.NET|PHP|Ruby+on+Rails&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Generates this chart:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?chs=300x100&amp;amp;chd=t:40,40,10,10&amp;amp;cht=p3&amp;amp;chl=Java|.NET|PHP|Ruby+on+Rails" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here we add blue as the base color by adding '&amp;amp;chco=0000ff':&lt;/p&gt;  &lt;p&gt;&lt;a title="http://chart.apis.google.com/chart?chs=300x100&amp;amp;chd=t:40,40,10,10&amp;amp;cht=p3&amp;amp;chl=Java|.NET|PHP|Ruby+on+Rails&amp;amp;chco=0000ff" href="http://chart.apis.google.com/chart?chs=300x100&amp;amp;chd=t:40,40,10,10&amp;amp;cht=p3&amp;amp;chl=Java|.NET|PHP|Ruby+on+Rails&amp;amp;chco=0000ff"&gt;http://chart.apis.google.com/chart?chs=300x100&amp;amp;chd=t:40,40,10,10&amp;amp;cht=p3&amp;amp;chl=Java|.NET|PHP|Ruby+on+Rails&amp;amp;chco=0000ff&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?chs=300x100&amp;amp;chd=t:40,40,10,10&amp;amp;cht=p3&amp;amp;chl=Java|.NET|PHP|Ruby+on+Rails&amp;amp;chco=0000ff" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;You can vary the individual colors, chart types, dimensions, etc.&amp;#160; Flexible, fast, and free. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wIvdep2vgSeB9n11K3iFC4qW8zU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wIvdep2vgSeB9n11K3iFC4qW8zU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wIvdep2vgSeB9n11K3iFC4qW8zU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wIvdep2vgSeB9n11K3iFC4qW8zU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/g1QeQyodHjs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/g1QeQyodHjs/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Google-Chart-API---Flexible-and-Free-Charting.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=b43b7a41-d0e2-4cc6-892d-a9999a7dd443</guid>
      <pubDate>Sun, 28 Sep 2008 15:36:34 -0800</pubDate>
      <category>General</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=b43b7a41-d0e2-4cc6-892d-a9999a7dd443</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=b43b7a41-d0e2-4cc6-892d-a9999a7dd443</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Google-Chart-API---Flexible-and-Free-Charting.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=b43b7a41-d0e2-4cc6-892d-a9999a7dd443</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=b43b7a41-d0e2-4cc6-892d-a9999a7dd443</feedburner:origLink></item>
    <item>
      <title>Evangelizing Scrum</title>
      <description>&lt;p&gt;Welcome to part three in our ongoing quest to bring an effective &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;agile development&lt;/a&gt; process to &lt;a href="http://www.ign.com"&gt;IGN Entertainment&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Early on I recognized one piece of criteria critical to us succeeding in bringing Scrum to IGN - everyone had to buy in.&amp;#160; This is a change for us and as has been drilled into our noggins for years, most people don't like change.&amp;#160; The idea isn't to change for the sake of change of course, but to continually improve our team, processes, communication, and company.&amp;#160; I'm sure most people can buy in to that one so we had to show how the change being proposed would accomplish these goals.&amp;#160; We're still in adoption phase (it's been about three weeks) but feel it's going really well.&amp;#160; Here's how we got to today:&lt;/p&gt;  &lt;h2&gt;Early Warning&lt;/h2&gt;  &lt;p&gt;We notified the product and engineering (us) groups we were looking to make some changes to improve how our groups worked together.&amp;#160; We committed to introducing the process and let them know we were going to need their help.&amp;#160; It wasn't the intent but this got their mouths drooling a bit for new ways to improve.&amp;#160; I received numerous emails asking when we were going to &amp;quot;discuss the new process.&amp;quot;&amp;#160; Slow down people we're workin' on it!&lt;/p&gt;  &lt;h2&gt;Introduction to Scrum&lt;/h2&gt;  &lt;p&gt;We held Scrum introduction meetings with multiple product groups to discuss Scrum including key terms, roles, and the flow.&amp;#160; We also thought it'd be good to run through a mock sprint but in hindsight that was a bit redundant with the rest of the introduction.&amp;#160; We also created a Scrum cheat sheet to hand out so people could leave with some reference material.&amp;#160; Lastly we opened the floor for questions.&amp;#160; We certainly didn't have all of the answers but expressed our commitment to work through them together.&lt;/p&gt;  &lt;h2&gt;Working Together&lt;/h2&gt;  &lt;p&gt;Scrum has distinct roles and criteria to fulfill each piece of its process.&amp;#160; The product owner must populate a product backlog and prioritize their items.&amp;#160; A sprint planning meeting is held to review the product backlog and assign sprint backlog items with estimates.&amp;#160; A daily scrum is held to ask the famous three questions of &amp;quot;what did you do yesterday,&amp;quot; &amp;quot;what will you do today,&amp;quot; and &amp;quot;is anything blocking you&amp;quot;.&amp;#160; It goes on and can seem like a lot to rookies like us.&lt;/p&gt;  &lt;p&gt;The fact is in the beginning nobody knows how to actually execute on these things so we dove in head first.&amp;#160; We were committed to giving this a real go and working together to answer questions and solve problems.&amp;#160; We helped create the product backlog, provided access to tools for reviewing and prioritizing, ran the sprint planning meetings, and took the role of getting the answers to whatever needed to be answered.&amp;#160; Learning, team building, and communicating at their best.&lt;/p&gt;  &lt;h2&gt;Delivering the Goods&lt;/h2&gt;  &lt;p&gt;A new process with magical results and innovative ways of getting things done doesn't mean squat if you don't deliver on your commitments.&amp;#160; At the end of our first sprint we did what we promised in a variety of ways.&amp;#160; The product group knew exactly what to expect from us, communication was improved through sprint planning and daily scrum meetings, and the work got done.&amp;#160; In fact the work got done earlier than expected and we started taking more items before the sprint was over!&amp;#160; I guess our estimates were too conservative but better that than too aggressive.&lt;/p&gt;  &lt;p&gt;Delivering on your commitments builds trust in both the process and the people.&lt;/p&gt;  &lt;h2&gt;Marching Ahead&lt;/h2&gt;  &lt;p&gt;Formally holding a sprint retrospective meeting is another piece of the Scrum process.&amp;#160; We did this after our first sprint which revealed a number of things, the most important being to account for &lt;em&gt;everything&lt;/em&gt; you have to do using sprint backlog items: coding, code reviews, documentation, deployments, unit testing, meetings, testing, documentation, etc.&amp;#160; If it needs to be done, add it!&lt;/p&gt;  &lt;p&gt;I'm looking forward to continuing our rollout of Scrum and other agile-esque methods.&amp;#160; Each day we invest reveals more clarity and benefits of the processes which is great because day one it didn't all make complete sense :).&lt;/p&gt;  &lt;p&gt;Have you worked with Scrum and came across pros or cons you hadn't even considered?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ccPRgoyyf59Tj1vDHwV9_9N0vjU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ccPRgoyyf59Tj1vDHwV9_9N0vjU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ccPRgoyyf59Tj1vDHwV9_9N0vjU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ccPRgoyyf59Tj1vDHwV9_9N0vjU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/7XL9Ev52KP0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/7XL9Ev52KP0/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Evangelizing-Scrum.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=1700b747-3c09-42ce-b414-1c2911836653</guid>
      <pubDate>Sat, 09 Aug 2008 20:28:32 -0800</pubDate>
      <category>Agile</category>
      <category>Process</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=1700b747-3c09-42ce-b414-1c2911836653</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=1700b747-3c09-42ce-b414-1c2911836653</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Evangelizing-Scrum.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=1700b747-3c09-42ce-b414-1c2911836653</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=1700b747-3c09-42ce-b414-1c2911836653</feedburner:origLink></item>
    <item>
      <title>Firefox 3.0 released... and demand is killing Mozilla!</title>
      <description>&lt;p&gt;
Go ahead and try to go to &lt;a href="http://www.getfirefox.com/"&gt;www.GetFirefox.com&lt;/a&gt;.&amp;nbsp; I dare you.&amp;nbsp; Insane things will happen like the server won&amp;#39;t respond because it&amp;#39;s being overloaded.&amp;nbsp; Okay, maybe that&amp;#39;s not crazy or insane given the popularity of Firefox, new releases, and open source community backing. 
&lt;/p&gt;
&lt;p&gt;
Fileplanet.com has the file available here: &lt;a href="http://www.fileplanet.com/187938/180000/fileinfo/Mozilla-FireFox-3.0"&gt;http://www.fileplanet.com/187938/180000/fileinfo/Mozilla-FireFox-3.0&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kbNT6L-x7SfAQ0Z8Dmq1ZU8aAj0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kbNT6L-x7SfAQ0Z8Dmq1ZU8aAj0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kbNT6L-x7SfAQ0Z8Dmq1ZU8aAj0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kbNT6L-x7SfAQ0Z8Dmq1ZU8aAj0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/IIBvRR4tSeA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/IIBvRR4tSeA/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Firefox-30-released-and-downloading-is-killing-Mozilla!.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=310eb386-576b-4345-927f-fd0760dabc63</guid>
      <pubDate>Tue, 17 Jun 2008 10:42:00 -0800</pubDate>
      <category>General</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=310eb386-576b-4345-927f-fd0760dabc63</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=310eb386-576b-4345-927f-fd0760dabc63</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Firefox-30-released-and-downloading-is-killing-Mozilla!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=310eb386-576b-4345-927f-fd0760dabc63</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=310eb386-576b-4345-927f-fd0760dabc63</feedburner:origLink></item>
    <item>
      <title>My Agile Development Posse</title>
      <description>&lt;h2&gt;Here Ye! Here Ye!&lt;/h2&gt;  &lt;p&gt;Welcome to post number two in our ongoing journey to bring an effective &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank"&gt;agile development&lt;/a&gt; process to &lt;a href="http://www.ign.com" target="_blank"&gt;IGN Entertainment&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;There are a few staple tools and practices I feel are essential to an effective agile development process.&amp;#160; Some may argue the direct correlation of these to agile development is incorrect... it's perspective.&lt;/p&gt;  &lt;h2&gt;Source Control&lt;/h2&gt;  &lt;p&gt;Love it or hate it source control is a biggie.&amp;#160; There are a variety of &lt;a href="http://www.ericsink.com/scm/source_control.html" target="_blank"&gt;source control&lt;/a&gt; systems available to meet the needs of most organizations.&amp;#160; A few popular choices include &lt;a href="http://subversion.tigris.org" target="_blank"&gt;Subversion&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/vs2005/aa718670.aspx" target="_blank"&gt;Visual SourceSafe&lt;/a&gt;, &lt;a href="http://www.nongnu.org/cvs/" target="_blank"&gt;CVS&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/tfs2008/default.aspx" target="_blank"&gt;Team Foundation Server&lt;/a&gt;, and &lt;a href="http://www.perforce.com/" target="_blank"&gt;Perforce&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I recommend figuring out your source control feature requirements before choosing your flavor.&amp;#160; Try a few before committing.&amp;#160; Not all of them do branching, merging, changesets, etc, in the same fashion, and once you implement one it's likely not convenient to migrate to another.&lt;/p&gt;  &lt;p&gt;Define your source control structure and processes for the team.&amp;#160; Should code be organized by library type such as web apps, windows service, class libraries... or should it be organized by subject such as &lt;a href="http://www.direct2drive.com" target="_blank"&gt;Direct2Drive&lt;/a&gt;, &lt;a href="http://www.fileplanet.com" target="_blank"&gt;Fileplanet&lt;/a&gt;, etc?&amp;#160; When should you branch vs. label?&amp;#160; How do you version your software?&amp;#160; If you forgo being organized up front you will pay the price later.&amp;#160; For those of you who&amp;#160; choose the hard way, it provides you the unique opportunity to write about lessons you've learned later on ;).&lt;/p&gt;  &lt;h2&gt;Unit Testing&lt;/h2&gt;  &lt;p&gt;I've been a part of the development community for about ten years now and if there's anything I've picked up on over the past couple of years &lt;a href="http://en.wikipedia.org/wiki/Unit_test" target="_blank"&gt;unit testing&lt;/a&gt; is a contender for the most valuable.&amp;#160; For those of you who are rookies on the topic or still haven't quite figured out what the hype's about, listen up.&amp;#160; Unit testing provides you a certain level of confidence in your code both when you write the code and when you change your code.&lt;/p&gt;  &lt;p&gt;Consider a monitor watching a website.&amp;#160; Some monitors will watch the site and ensure expected behavior occurs given specific criteria.&amp;#160; In this way a unit test is a lot like that monitor.&amp;#160; You set up a very specific well-controlled scenario for a unit of your code (see method) and fail the check if the result isn't as expected.&amp;#160; Each time you change your code you can rerun your ever-growing library of unit tests and be assured your tests continue to succeed.&amp;#160; If a test is busted ya screwed something up.&amp;#160; Oh, and as an added benefit, your class design changes to be more modular.&amp;#160; That's just a little something extra.&lt;/p&gt;  &lt;p&gt;Unit tests frameworks come in a variety of shiny colors.&amp;#160; For .NET development &lt;a href="http://www.nunit.org" target="_blank"&gt;NUnit&lt;/a&gt; is probably the most used.&amp;#160; You can also check out &lt;a href="http://www.codeplex.com/xunit" target="_blank"&gt;XUnit&lt;/a&gt; and &lt;a href="http://www.mbunit.com/" target="_blank"&gt;MbUnit&lt;/a&gt;.&amp;#160; Lastly, Microsoft has developed their own framework which they've integrated in to VS2008.&amp;#160; Feel free to argue your points but I'm not a fan of the &lt;a href="http://msdn.microsoft.com/en-us/library/ms243147.aspx" target="_blank"&gt;MS Unit Test framework&lt;/a&gt;...&amp;#160; there's too much auto-generated code for me.&amp;#160; The point of unit testing is to know and control your environment.&amp;#160; Code generation tastes bad.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.testdriven.net/" target="_blank"&gt;TestDriven.Net&lt;/a&gt; is a cool add-on to Visual Studio so you can run your NUnit tests (I've not tried with another framework) and get your results in the Output window.&amp;#160; It also comes bundled with &lt;a href="http://www.ncover.com/" target="_blank"&gt;NCover&lt;/a&gt; for code coverage analysis.&amp;#160; Really useful.&lt;/p&gt;  &lt;p&gt;Drink the kool-aid... it's yummy.&lt;/p&gt;  &lt;h2&gt;Continuous Integration&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://martinfowler.com/articles/continuousIntegration.html" target="_blank"&gt;Continuous Integration&lt;/a&gt; in its most basic form is having your code built often on a scheduled or triggered basis.&amp;#160; This is cool because you can know earlier than later if someone's changes are breaking the build (don't be that guy!).&amp;#160; The alternative is having a broken build and when you have more than one person working on the code all participants are effected once they have the latest version.&amp;#160; That's a waste of time for everyone and is frustrating to say the least.&amp;#160; Continuous Integration doesn't prevent this problem but instead is an early warning system.&amp;#160; Now add on automated deployments to an environment such as user acceptance testing and there's constantly a fresh view of the application without an engineering making it happen.&amp;#160; That's cool.&lt;/p&gt;  &lt;p&gt;My team is not using a Continuous Integration solution yet so more to come on this, but if interested, we're checking out &lt;a href="http://msdn.microsoft.com/en-us/library/ms181710(VS.80).aspx" target="_blank"&gt;Team Foundation Build&lt;/a&gt; and &lt;a href="http://www.jetbrains.com/teamcity" target="_blank"&gt;JetBrain's TeamCity&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;How's This Related to Agile Development?&lt;/h2&gt;  &lt;p&gt;Admittedly you can run an agile development shop without any of these tools.&amp;#160; These things I've discussed are just that... tools, not process.&amp;#160; So how are these tools related to agile development?&amp;#160; Everything I've discussed works really well with the iterative, always changing nature of agile practices.&amp;#160; I'd hate to take on this process unprepared.&amp;#160; Give me my armor, sword, and a horse before sending me off in to battle.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EyuM7dVdx7ss8EaYG9sZUgIKdfQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EyuM7dVdx7ss8EaYG9sZUgIKdfQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EyuM7dVdx7ss8EaYG9sZUgIKdfQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EyuM7dVdx7ss8EaYG9sZUgIKdfQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/CpST_5OEHqs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/CpST_5OEHqs/post.aspx</link>
      <author>ian suttle</author>
      <comments>http://www.iansuttle.com/blog/post/My-Agile-Development-Posse.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=3d600116-04db-41a4-a3ff-d9073cb1cdca</guid>
      <pubDate>Sat, 14 Jun 2008 23:21:06 -0800</pubDate>
      <category>Agile</category>
      <category>Process</category>
      <category>Unit Testing</category>
      <dc:publisher>ian suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=3d600116-04db-41a4-a3ff-d9073cb1cdca</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=3d600116-04db-41a4-a3ff-d9073cb1cdca</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/My-Agile-Development-Posse.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=3d600116-04db-41a4-a3ff-d9073cb1cdca</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=3d600116-04db-41a4-a3ff-d9073cb1cdca</feedburner:origLink></item>
    <item>
      <title>Voyage Into an Agile World</title>
      <description>&lt;p&gt;
Here at &lt;a href="http://www.ign.com" target="_blank"&gt;IGN Entertainment&lt;/a&gt; we&amp;#39;re making an effort to follow an &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank"&gt;agile software development&lt;/a&gt; path.&amp;nbsp; It&amp;#39;s a bit of a new world for us.&amp;nbsp; I&amp;#39;ll admit we&amp;#39;ve described our development process to date as &amp;quot;agile/&lt;a href="http://en.wikipedia.org/wiki/Waterfall_model" target="_blank"&gt;waterfall&lt;/a&gt;&amp;quot; or &amp;quot;quasi agile&amp;quot;, neither of which are ultimately efficient.&amp;nbsp; We&amp;#39;ve been digging into agile techniques for a couple of years and simply hadn&amp;#39;t made the commitment.&amp;nbsp; The longer we wait the more clear it is we need to make the move.
&lt;/p&gt;
&lt;p&gt;
Our agile flavor of choice is the all-popular &lt;a href="http://www.mountaingoatsoftware.com/scrum" target="_blank"&gt;Scrum&lt;/a&gt; technique.&amp;nbsp; I&amp;#39;m digging the predictability of feature delivery by defining the &lt;a href="http://www.mountaingoatsoftware.com/sprint_backlog" target="_blank"&gt;sprint backlog&lt;/a&gt; up front, having a known schedule for a sprint, open communication and transparency through &lt;a href="http://www.mountaingoatsoftware.com/sprint_planning_meeting" target="_blank"&gt;sprint planning meetings&lt;/a&gt; and &lt;a href="http://www.mountaingoatsoftware.com/daily_scrum" target="_blank"&gt;daily scrums&lt;/a&gt;, etc.
&lt;/p&gt;
&lt;p&gt;
I&amp;#39;ll continue to post info on our experience as we progress.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8dmpI-t575eQ2lHxBv290Du_7rA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8dmpI-t575eQ2lHxBv290Du_7rA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8dmpI-t575eQ2lHxBv290Du_7rA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8dmpI-t575eQ2lHxBv290Du_7rA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/6KiPnDVKfi0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/6KiPnDVKfi0/post.aspx</link>
      <author>Ian Suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Voyage-Into-an-Agile-World.aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=de9e86f9-9911-4178-ac43-ea28e8292b53</guid>
      <pubDate>Fri, 13 Jun 2008 22:49:00 -0800</pubDate>
      <category>Agile</category>
      <category>Process</category>
      <dc:publisher>Ian Suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=de9e86f9-9911-4178-ac43-ea28e8292b53</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=de9e86f9-9911-4178-ac43-ea28e8292b53</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Voyage-Into-an-Agile-World.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=de9e86f9-9911-4178-ac43-ea28e8292b53</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=de9e86f9-9911-4178-ac43-ea28e8292b53</feedburner:origLink></item>
    <item>
      <title>Finally, a SelectedItems Option (yaaay)</title>
      <description>&lt;p&gt;If you're like me you've often pondered why controls like CheckBoxList don't provide a way to get a collection of selected items.&amp;#160; You've always had the option to iterate the Items collection and evaluate the Selected property, but why should that have to be done over and over again?&amp;#160; I want a quick way to get the selected items from a CheckBoxList, ListBox, DropDownList, and RadioButtonList; all items which inherit from ListControl.&lt;/p&gt;  &lt;p&gt;The excellent creation of extension methods makes it simple to get the selected items from a ListControl.&lt;/p&gt;  &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; ListControlExtensions&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ListExtensions&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ListItem&lt;/span&gt;&amp;gt; SelectedItems(&lt;span style="color: blue"&gt;this&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;ListControl&lt;/span&gt; list)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ListItem&lt;/span&gt;&amp;gt; items = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ListItem&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;ListItem&lt;/span&gt; item &lt;span style="color: blue"&gt;in&lt;/span&gt; list.Items)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (item.Selected)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; items.Add(item);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; items;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Have you found an alternative to getting the selected items from a ListControl without looping through the Items collection?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.iansuttle.com%2fblog%2fpost%2fFinally2c-a-SelectedItems-Option-(yaaay).aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.iansuttle.com%2fblog%2fpost%2fFinally2c-a-SelectedItems-Option-(yaaay).aspx&amp;amp;bgcolor=0099FF&amp;amp;cfgcolor=FFFFFF&amp;amp;cbgcolor=3300CC" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/L4ThP7jO4zwZ3ubrqUjvlP8HsAk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L4ThP7jO4zwZ3ubrqUjvlP8HsAk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/L4ThP7jO4zwZ3ubrqUjvlP8HsAk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L4ThP7jO4zwZ3ubrqUjvlP8HsAk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IanSuttlesBlog/~4/6owRFba7Cc0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IanSuttlesBlog/~3/6owRFba7Cc0/post.aspx</link>
      <author>ian suttle</author>
      <comments>http://www.iansuttle.com/blog/post/Finally2c-a-SelectedItems-Option-(yaaay).aspx#comment</comments>
      <guid isPermaLink="false">http://www.iansuttle.com/blog/post.aspx?id=737dad7c-7d7c-4e76-8990-357b10591ebc</guid>
      <pubDate>Wed, 14 May 2008 09:46:18 -0800</pubDate>
      <category>.NET 3.5</category>
      <category>.Net Framework</category>
      <category>ASP.Net</category>
      <dc:publisher>ian suttle</dc:publisher>
      <pingback:server>http://www.iansuttle.com/blog/pingback.axd</pingback:server>
      <pingback:target>http://www.iansuttle.com/blog/post.aspx?id=737dad7c-7d7c-4e76-8990-357b10591ebc</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://www.iansuttle.com/blog/trackback.axd?id=737dad7c-7d7c-4e76-8990-357b10591ebc</trackback:ping>
      <wfw:comment>http://www.iansuttle.com/blog/post/Finally2c-a-SelectedItems-Option-(yaaay).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.iansuttle.com/blog/syndication.axd?post=737dad7c-7d7c-4e76-8990-357b10591ebc</wfw:commentRss>
    <feedburner:origLink>http://www.iansuttle.com/blog/post.aspx?id=737dad7c-7d7c-4e76-8990-357b10591ebc</feedburner:origLink></item>
  </channel>
</rss>
