<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" 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:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Software</title>
        <link>http://blogs.sftsrc.com/stuart/category/5.aspx</link>
        <description>Software</description>
        <language>en-US</language>
        <copyright>Stuart Thompson</copyright>
        <managingEditor>stuart.thompson@sftsrc.com</managingEditor>
        <generator>Subtext Version 1.9.5.0</generator>
        <item>
            <title>NDepend Part II - Beginning CQL</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2008/08/19/106.aspx</link>
            <description>&lt;p&gt; In my continuing use of &lt;a href="http://www.ndepend.com"&gt;NDepend&lt;/a&gt; on both my work and home projects, I have been investigating CQL more and more, especially from the perspective of use in continuous integration.  NDepend provides some incredibly powerful analysis features and I find the idea that constraints can be applied and warnings reported as part of day 1 builds to be extremely appealing.  I'm all about keeping code clean, constrained, and consistent.  NDepend provides another great tool in my kit to ensure that my own code is marshalled to my standards from the very first line that is written.  As David Muhondro put so eloquently in his blog post, NDepend is &lt;a href="http://www.mohundro.com/blog/2008/03/26/NDependStaticAnalysisOnSteroids.aspx"&gt;static analysis on steroids&lt;/a&gt;.  When most users encounter CQL for the first time, the response is "wow, this looks really powerful, now what does it mean?".  I've started by taking the stock queries that are included in a basic NDepend project and understanding what they mean and the warnings that they are expected to generate.  By understanding the warnings and their purpose in the project, I began to understand how I could tweak those queries and even write my own to enforce the rules I'd like my code to live by. &lt;/p&gt;
&lt;p&gt; Let's start by looking at an example.  After creating a new NDepend project and pointing it at a list of assemblies to analyze, the default CQL queries that are included are grouped into the following categories: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Code Quality&lt;/li&gt;
    &lt;li&gt;Design&lt;/li&gt;
    &lt;li&gt;Unused Code / Dead Code&lt;/li&gt;
    &lt;li&gt;Encapsulation&lt;/li&gt;
    &lt;li&gt;Diff / Changes / Evolution&lt;/li&gt;
    &lt;li&gt;Test Coverage&lt;/li&gt;
    &lt;li&gt;Purity / Immutability / Side-Effects&lt;/li&gt;
    &lt;li&gt;Naming Conventions&lt;/li&gt;
    &lt;li&gt;.NET Framework Usage&lt;/li&gt;
    &lt;li&gt;Statistics&lt;/li&gt;
    &lt;li&gt;Samples of Custom Constraints&lt;/li&gt;
    &lt;li&gt;Constraints extracted from Source Code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;a href="http://www.stuartthompson.net/SubTextBlog/Images/stuartthompson_net/SubTextBlog/08-19-2008-DefaultCQLQueries/08-19-2008-DefaultCQLQueries.JPG"&gt;&lt;img border="0" src="http://www.stuartthompson.net/SubTextBlog/Images/stuartthompson_net/SubTextBlog/08-19-2008-DefaultCQLQueries/08-19-2008-DefaultCQLQueries_Thumbnail.JPG" alt="" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt; I started by looking at the &lt;em&gt;Unused Code / Dead Code&lt;/em&gt; queries, specifically at the &lt;em&gt;Potentially unused methods&lt;/em&gt; query.  By double-clicking on the query it is opened in the CQL query editor and displays the following: &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="border: medium none rgb(136, 136, 136); padding: 3px; background-color: rgb(255, 255, 221); font-family: Courier Sans MS;"&gt; // &amp;lt;Name&amp;gt;Potentially unused methods&amp;lt;/Name&amp;gt;&lt;br /&gt;
WARN IF Count &amp;gt; 0 IN SELECT TOP 10 METHODS WHERE&lt;br /&gt;
MethodCa == 0 AND            // Ca=0 -&amp;gt; No Afferent Coupling -&amp;gt; The method is not used in the context of this application.&lt;br /&gt;
!IsPublic AND                // Public methods might be used by client applications of your assemblies.&lt;br /&gt;
!IsEntryPoint AND            // Main() method is not used by-design.&lt;br /&gt;
!IsExplicitInterfaceImpl AND // The IL code never explicitely calls explicit interface methods implementation.&lt;br /&gt;
!IsClassConstructor AND      // The IL code never explicitely calls class constructors.&lt;br /&gt;
!IsFinalizer                 // The IL code never explicitely calls finalizers.&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt; &lt;strong&gt;Breaking it Down&lt;/strong&gt;&lt;br /&gt;
Let's break this down a little.  First of all it is important to realize that this is not SQL, despite any similarities in the syntax.  The first line selects the top 10 methods that satisfy the query and then raises a warning if the total number of methods is greater than 0.  The reason for the seemingly superfluous top 10 selection is that if the count is greater than zero then those top 10 will be displayed as the results of the query.  To avoid swamping with noise the query is restricting to only the first ten offenders.  The next line is the first part of the WHERE clause and looks for methods with an &lt;a ccnet="" display="" confluence.public.thoughtworks.org="" http:="" href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl&lt;/a&gt; to bring these warning and reports into the daily life of your projects.  While static analysis en masse isn't for everyone (not even for me), a small list of CQL queries can help you perform necessary housekeeping without having to do the hard hunting work yourself.  The inevitable question is whether or not this overlaps with FxCop.  There is some overlap, but they are both just tools from which you should pluck the best of the functionality you like and strike down the cruft that gets in the way.  There are some cases where writing an FxCop rule specific to your application is a good thing, however I'm finding that writing CQL queries for warnings lends itself a little better to how I think about static analysis in the first place.  The key is finding that sweet spot in the middle. &lt;/p&gt;&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/106.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2008/08/19/106.aspx</guid>
            <pubDate>Tue, 19 Aug 2008 18:25:12 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2008/08/19/106.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/106.aspx</wfw:commentRss>
        </item>
        <item>
            <title>New Array of Anonymous Objects</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2008/07/09/96.aspx</link>
            <description>&lt;p&gt;While coding up a couple of prototype LINQ queries this morning I came across a rather interesting syntax using anonymous types and object initializers.  I wanted to show an example of using a where clause upon a property of an object but didn’t want to put a bunch of plumbing around it just to set up the example.  In my head an array containing three &lt;em&gt;Person&lt;/em&gt; objects would suffice, with each person object having &lt;em&gt;Name &lt;/em&gt;and &lt;em&gt;Age&lt;/em&gt; properties that I could use in my query.  I wasn’t sure if this would compile but dropped it into the wonderful &lt;a href="http://www.linqpad.net/"&gt;LinqPad&lt;/a&gt; and sure enough found that it compiled right away, giving me exactly the results I was looking for.&lt;/p&gt;
&lt;p style="BORDER-RIGHT: #444444 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: #444444 1px solid; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; BORDER-LEFT: #444444 1px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #444444 1px solid; BACKGROUND-COLOR: #ffffdd"&gt;&lt;font color="#0000ff"&gt;from&lt;/font&gt; person &lt;font color="#0000ff"&gt;in new&lt;/font&gt; [] {&lt;br /&gt;    &lt;font color="#0000ff"&gt;new&lt;/font&gt; { Name=&lt;font color="#993300"&gt;"Bob"&lt;/font&gt;, Age=&lt;font color="#993300"&gt;28&lt;/font&gt; }, &lt;br /&gt;    &lt;font color="#0000ff"&gt;new&lt;/font&gt; { Name=&lt;font color="#993300"&gt;"Ted"&lt;/font&gt;, Age=&lt;font color="#993300"&gt;22&lt;/font&gt; } &lt;br /&gt;    &lt;font color="#0000ff"&gt;new&lt;/font&gt; { Name=&lt;font color="#993300"&gt;"Sally"&lt;/font&gt;, Age=&lt;font color="#993300"&gt;25&lt;/font&gt; } }&lt;br /&gt;&lt;font color="#0000ff"&gt;where&lt;/font&gt; person.Age &amp;lt; &lt;font color="#993300"&gt;26&lt;/font&gt; &lt;br /&gt;&lt;font color="#0000ff"&gt;select&lt;/font&gt; person &lt;/p&gt;I can declare a &lt;font color="#0000ff"&gt;new&lt;/font&gt; [] { &lt;em&gt;&lt;font color="#808080"&gt;&amp;lt;set of anonymous types&amp;gt;&lt;/font&gt;&lt;/em&gt; } right there in the query, saving me the job of creating all of the plumbing around it just for the sake of the sample.  Cool!&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/96.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2008/07/09/96.aspx</guid>
            <pubDate>Wed, 09 Jul 2008 18:08:57 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2008/07/09/96.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/96.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Virtual CDRom Control Panel - Mount Failed</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2008/06/24/93.aspx</link>
            <description>&lt;p&gt;
I use the Windows XP Virtual CDRom Control Panel regularly.  It's a great utility for mounting .iso files to a virtual cd rom drive to avoid having to burn them to an actual disk.  Many large development tools (especially from MSDN) are distributed in .iso format for download.  However, one of the most frustrating errors with the tool is the ambiguous "Mount Failed" exception that is sometimes thrown.
&lt;/p&gt;
&lt;p&gt;
I received that error this morning while trying to mount the Visual Studio 2008 Pro image.  I remembered running into this exception on numerous other occasions but couldn't remember the exact cause.  After a small amount of googling and experimentation I found that my problem was caused by whitespace in the file path to the .iso I was attempting to mount.
&lt;/p&gt;
&lt;p&gt;
Removing the whitespace from the file path (I just copied the .iso to the root of my C:\ drive) fixed the problem, so this time I decided to blog it in case I run into the problem again in the future.
&lt;/p&gt;&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/93.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2008/06/24/93.aspx</guid>
            <pubDate>Tue, 24 Jun 2008 18:25:20 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2008/06/24/93.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/93.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Count &gt; 0 vs Count != 0</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2008/06/24/91.aspx</link>
            <description>&lt;p&gt;I came across an issue today that I think perfectly exhibits the principal of forward thinking in coding.  Consider the following block of code: &lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;IList&amp;lt;MyObject&amp;gt; myList = myAdapter.Read();&lt;br /&gt;
if (myList.Count != 0)&lt;br /&gt;
{&lt;br /&gt;
    &lt;em&gt;... do some work ...&lt;/em&gt;&lt;br /&gt;
} &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;The if statement is only executing its contents if the count of objects in the list is &lt;u&gt;not&lt;/u&gt; zero.  This seems pretty harmless on the surface.  We're taking an IList&amp;lt;T&amp;gt; after all and we know that List&amp;lt;T&amp;gt;.Count returns zero if the list is empty.  Therein lies the trap.  We're not necessarily talking about List&amp;lt;T&amp;gt; here, we're talking about any class that implements the IList&amp;lt;T&amp;gt; interface.  You can see the facepalm coming a mile away. &lt;/p&gt;
&lt;p&gt;What if a class implements IList&amp;lt;T&amp;gt; and decides to return -1 for .Count to represent an empty collection.  This is actually more common than you'd think as there seem to be a large number of people out there who still use -1 as a return code for anything that is empty or not initialized.  The solution here would be to instead check for:&lt;br /&gt;
&lt;font face="Courier New"&gt;if (myList.Count &amp;gt; 0)&lt;/font&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Instead of checking for Count != 0, we instead check if Count is &lt;u&gt;greater than&lt;/u&gt; zero.  It doesn't matter now whether the IList&amp;lt;T&amp;gt; implementation returns 0, -1, or -999 for Count to indicate an empty collection, the assertion that the if block should only run on a non-empty list still stands. &lt;/p&gt;&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/91.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2008/06/24/91.aspx</guid>
            <pubDate>Tue, 24 Jun 2008 14:59:38 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2008/06/24/91.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/91.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Yield - Enumeration Candy</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2008/06/24/90.aspx</link>
            <description>&lt;p&gt; As we all know, I'm a little slow on the uptake.  This time I managed to miss a really great keyword in C#: &lt;span style="color: rgb(0, 0, 255);"&gt;yield&lt;/span&gt;.  The combination &lt;span style="color: rgb(0, 0, 255);"&gt;yield return&lt;/span&gt; is a lovely piece of C# candy that can be used to simplify a common function.  Consider the following section of code: &lt;/p&gt;
&lt;p&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-family: Courier;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(0, 128, 128);"&gt;MyObject&lt;/span&gt;&amp;gt; FindObjectsWithThreeChildren(&lt;span style="color: rgb(0, 128, 128);"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;MyObject&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt; sourceList)&lt;br /&gt;
{&lt;br /&gt;
    &lt;span style="color: rgb(0, 128, 128);"&gt;IList&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;MyObject&lt;/span&gt;&lt;/span&gt;&amp;gt; results = &lt;span style="color: rgb(0, 0, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;List&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;MyObject&lt;/span&gt;&amp;gt;();&lt;br /&gt;
    &lt;span style="color: rgb(0, 0, 255);"&gt;foreach &lt;/span&gt;(&lt;span style="color: rgb(0, 128, 128);"&gt;MyObject &lt;/span&gt;obj in sourceList)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;span style="color: rgb(0, 0, 255);"&gt;if &lt;/span&gt;(obj.Children.Count == 3)&lt;br /&gt;
            results.Add(obj);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;span style="color: rgb(0, 0, 255);"&gt;return &lt;/span&gt;results;&lt;br /&gt;
}&lt;/span&gt; &lt;/p&gt;
&lt;p&gt; We've all written something along those lines before.  Build a collection up based upon some predicate and then return it.  Now yes, this could actually be solved much more cleanly using a lambda expression with LINQ, but it could also be simplified using &lt;span style="color: rgb(0, 0, 255);"&gt;yield return&lt;/span&gt;.  The following is the same method written to take advantage of this new keyword: &lt;/p&gt;
&lt;p&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="font-family: Courier;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(0, 128, 128);"&gt;MyObject&lt;/span&gt;&amp;gt; FindObjectsWithThreeChildren(&lt;span style="color: rgb(0, 128, 128);"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;MyObject&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt; sourceList)&lt;br /&gt;
{&lt;br /&gt;
    &lt;strike style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;IList&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;MyObject&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt; results =&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;List&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;MyObject&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;();&lt;/span&gt;&lt;/strike&gt;&lt;br /&gt;
    &lt;span style="color: rgb(0, 0, 255);"&gt;foreach &lt;/span&gt;(&lt;span style="color: rgb(0, 128, 128);"&gt;MyObject &lt;/span&gt;obj in sourceList)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;span style="color: rgb(0, 0, 255);"&gt;if &lt;/span&gt;(obj.Children.Count == 3)&lt;br /&gt;
&lt;/span&gt; &lt;span style="font-family: Courier;"&gt;            &lt;strike style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;results.Add(obj);&lt;/span&gt;&lt;/strike&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier;"&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;yield return&lt;/span&gt; obj;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier;"&gt;    }&lt;br /&gt;
    &lt;strike style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;return &lt;span style="color: rgb(0, 0, 0);"&gt;results;&lt;/span&gt;&lt;/span&gt;&lt;/strike&gt;&lt;br /&gt;
}&lt;/span&gt; &lt;/p&gt;
&lt;p&gt; The difference between &lt;span style="color: rgb(0, 0, 255);"&gt;yield return&lt;/span&gt; and a regular &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; is that with the &lt;span style="color: rgb(0, 0, 255);"&gt;yield&lt;/span&gt; keyword the method does not exit.  Instead the returned result is simply added into the collection to be returned. &lt;/p&gt;
&lt;p&gt; For obvious reasons, this can only be used for methods that return enumerations.  It doesn't do anything spectacular but it does make the source code a little bit cleaner and clearer, which can only be a good thing! &lt;/p&gt;&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/90.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2008/06/24/90.aspx</guid>
            <pubDate>Tue, 24 Jun 2008 14:54:00 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2008/06/24/90.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/90.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Top 3 TFS Peeves</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2007/12/07/88.aspx</link>
            <description>&lt;p&gt;I've been using TFS for a little over six months now and despite having its good sides, it also rears several quite ugly ones.  I'm not going to harp on the obvious feature deficiencies such as branch and merge because we all know they aren't in there and that comes down to a technology choice.  No, the things that really get under my skin about TFS are things that should be basic to any piece of software.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;1) Check In, Lose Comments&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;
      * This is an extremely frustrating flaw in TFS for me.  If you check in, but a later version of the project or file you're working on exists on the server (common in larger teams) then the project must be reloaded.  After the project is reloaded, selecting CheckIn displays the exact same dialog you were in thirty seconds ago &lt;em&gt;sans&lt;/em&gt; comments.  Urrggghhh!  I now &lt;strong&gt;always&lt;/strong&gt; copy my comments to a clipboard or write them in textpad prior to nervously clicking the CheckIn button.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;2) Updating list of changesets and work items - Please wait while we waste your time&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;
      * Does anyone else remember when a build took less than ten seconds to complete?  I know that I do.  If I press Ctrl+Shift+B in Visual Studio, the entire solution is built in about three seconds.  If I right-click the solution and select Run Test(s) then all of the unit tests run in about thirty seconds.  Why then, please educate me dear reader, does it take a full three minutes for a TFS build to do the same things!?!?  Sigh.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;3) Working Offline - I just need to edit this one file .... rrgghhh ... come one ... rrggh ... oh screw it!&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;
      * Perhaps in happy TFS land there is a place where internet connections are never lost and even the clouds come fitted with wireless network bridges.  However, that is a far cry from where I live and work.  We've all been there.  You're offline, you need to make one small change and...nope...you've been sent to TFS connection jail.  Enjoy your stay! &lt;/p&gt;&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/88.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2007/12/07/88.aspx</guid>
            <pubDate>Fri, 07 Dec 2007 18:27:56 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2007/12/07/88.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/88.aspx</wfw:commentRss>
        </item>
        <item>
            <title>VSLive! Conference Schedule</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2007/10/29/82.aspx</link>
            <description>&lt;p&gt;In all my cross-posting, I forgot to include the conference schedule indicating which classes and workshops we attended.  Here it is for reference.&lt;/p&gt;
&lt;p&gt;The following table details the schedule for the conference.  I've highlighted the talks and workshops that &lt;span style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Laura attended&lt;/span&gt; as well as &lt;span style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;those I attended&lt;/span&gt; to show our coverage of the available material. &lt;/p&gt;
&lt;table style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" cellspacing="1"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: black" colspan="5"&gt;&lt;span style="COLOR: white"&gt;Pre-Conference Workshops - Monday, October 15th 2007&lt;/span&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;9:00am-&lt;br /&gt;
            6:00pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Architecting ASP.NET Applications&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Paul Sheriff&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;SQL Server 2005:&lt;br /&gt;
            Power to the Developer&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Brian Randell&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Making the Tough Choices: Selecting the Right Techniques for Your App&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Deborah Kurata&lt;/span&gt;&lt;/td&gt;
            &lt;td&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: black" colspan="5"&gt;&lt;span style="COLOR: white"&gt;Conference Day 1 - Tuesday, October 16th 2007&lt;/span&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;9:00am &lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; FONT-WEIGHT: bold; BORDER-LEFT: black 1px solid; COLOR: darkred; BORDER-BOTTOM: black 1px solid" colspan="2"&gt;Keynote: The Trusted Platform for Your Business:&lt;br /&gt;
            Windows Server, SQL Server, and Visual Studio &lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" colspan="2"&gt;D. Britton Johnston, Product Unit Manager, SQL Server,&lt;br /&gt;
            Joseph Landes, Director, Windows Server,&lt;br /&gt;
            Dave Mendlen, Director, Visual Studio &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt; &lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: lightblue" colspan="2"&gt;ASP Live!&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: lightblue"&gt;TFS Live!&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: lightblue"&gt;.NET 3.0 Live!&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;10:30am&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Creating a Custom ASP.NET DataSource Control&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Rocky Lhotka&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Understanding the Update Panel&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Scott Cate&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Managing Software Releases with Visual Studio Team System&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Chris Menegay&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Beyond .NET 3.0: Vista and the Managed Developer&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Brian Randell&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;11:45am&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;What ASP.NET Developers Should Know about JavaScript&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Scott Allen&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Building ASP.NET Database Applications with Nhibernate&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Benjamin Day&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Customizing Team System Projects&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Brian Randell&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Implementing SOA Design Patterns With WCF&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Rob Daigneau&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;12:45pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" align="left" colspan="4"&gt;Lunch&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;2:00pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Using ASP.NET AJAX Extenders to Enhance Existing Sites&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Miguel Castro&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Using Windows Workflow Foundation in ASP.NET&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Michiel Van Otegem&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Serious Team Foundation Server Customization&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Benjamin Day&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Windows Presentation Foundation: Making It Real&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Billy Hollis&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;3:15pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Build a 3-tier Data Driven Website&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Chris Franz&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Debugging MS Ajax&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Scott Cate&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Team System Futures&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Chris Menegay&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Windows Communication Foundation (WCF) for .ASMX and Remoting Developers&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Richard Hale Shaw&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;4:30pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;MS Ajax Under the Hood&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Scott Cate&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Create Scalable Apps with Asynchronous Processing&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Michiel Van Otegem&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Serious Team Foundation Server Source Control&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Benjamin Day&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Introduction to Microsoft Windows Workflow Foundation&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Michael Stiefel&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;5:45pm-&lt;br /&gt;
            7:30pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; FONT-WEIGHT: bold; BORDER-LEFT: black 1px solid; COLOR: darkred; BORDER-BOTTOM: black 1px solid" colspan="4"&gt;Exhibitor Reception - on the exhibit floor (Brasilia)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: black" colspan="5"&gt;&lt;span style="COLOR: white"&gt;Conference Day 2 - Wednesday, October 17th 2007&lt;/span&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;9:00am&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; FONT-WEIGHT: bold; BORDER-LEFT: black 1px solid; COLOR: darkred; BORDER-BOTTOM: black 1px solid" colspan="2"&gt;KEYNOTE: The Microsoft Data Platform and the&lt;br /&gt;
            Data Programmer Experience &lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" colspan="2"&gt;D. Britton Johnston, Product Unit Manager,&lt;br /&gt;
            Data Programmability Tools, Microsoft &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt; &lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: lightblue" colspan="2"&gt;ASP Live!&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: lightblue"&gt;TFS Live!&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: lightblue"&gt;.NET 3.0 Live!&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;10:30am&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Building Smart Tags &amp;amp; Property Builders for Your Windows or Web Controls&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Miguel Castro&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;AJAX at Scale&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Mark D'Urso &amp;amp;&lt;br /&gt;
            Allen Wagner&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Making Attributes and Reflection Work for You&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Ken Getz&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Creating Custom WCF Behaviors&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Rob Daigneau&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;11:45am&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;ASP.NET Master Pages - Tips, Tricks and Traps&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Scott Allen&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Move over Flash, here comes Silverlight - Lush UI for ASP.NET Developers&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Walt Ritscher&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;How to Do a Code Review&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Billy Hollis&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Building Custom Controls in WPF&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Mark Miller&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;12:45pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" align="left" colspan="4"&gt;Lunch&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;2:00pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Serious ASP.NET WebPart Customization&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Benjamin Day&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Configuration Files for ASP.NET 2.0&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Robert Boedigheimer&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Understanding Delegates and Events&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Ken Getz&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Using the Windows Workflow Foundation Rules Engine as a Stand-alone Rules Engine&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Michael Stiefel&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;3:15pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Exploiting the ASP.NET Adapter Architecture&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Robert Boedigheimer&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Real World Exception Handling in ASP.NET&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Walt Ritscher&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;More Best Kept Secrets in .NET&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Deborah Kurata&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;WPF with Expression Interactive Designer and Visual Studio&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Billy Hollis&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;4:30pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;ASP.NET 2.0's Data Binding Features&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Ken Getz&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;IIS 7 for Web Developers&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Robert Boedigheimer&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Best Practice Architecture: Layering Your Applications&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Rocky Lhotka&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Best Practices for Designing and Building SOA Applications with WCF&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Richard Hale Shaw&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: black" colspan="5"&gt;&lt;span style="COLOR: white"&gt;Post-Conference Workshops - Thursday, October 18th 2007&lt;/span&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;9:00am-&lt;br /&gt;
            6:00pm&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid"&gt;Advanced C#: Moving up to LINQ, WCF and Framework 3.5&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Richard Hale Shaw&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #bbffbb"&gt;Getting the Most Mileage out of Team System&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Benjamin Day&lt;/span&gt;&lt;/td&gt;
            &lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; WIDTH: 180px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffffbb"&gt;Build Distributed Object-oriented Apps in .NET 3.0&lt;br /&gt;
            &lt;span style="COLOR: darkblue"&gt;Rocky Lhotka&lt;/span&gt;&lt;/td&gt;
            &lt;td&gt; &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/82.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2007/10/29/82.aspx</guid>
            <pubDate>Mon, 29 Oct 2007 18:21:35 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2007/10/29/82.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/82.aspx</wfw:commentRss>
        </item>
        <item>
            <title>VSLive! Notes</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2007/10/17/73.aspx</link>
            <description>&lt;p&gt;Disclaimer: The series of notes that I have posted from the sessions I attended at VSLive! are just that: notes.  I have tried where possible to turn them into posts that have some cohesion but having attended nine hours of talks per day for four days, editing time was falling a little sparse.  As I fill out these notes and write sample projects in some of the new technologies I have learned, I will update these posts accordingly.  For now I wanted to get them posted and out there in a timely fashion to avoid the ideas and thoughts falling into the void.  Please enjoy and use at your own risk, these notes mean a lot to me because I can pair them in my mind with the experience of the conference.  Your mileage may vary.&lt;/p&gt;
&lt;p&gt;I still have the post-conference workshop to look forward to tomorrow and will post my notes from that session as soon as I get the chance.  However, I wanted to take the chance to post this disclaimer first.&lt;/p&gt;
&lt;p&gt;Mark Miller and Rob Daigneau rock!  I'm really impressed with .NET 3.0 and what the WinFX guys managed to create.  I only wish that the evangelism and information sharing about those platforms had got through to me more clearly and a lot earlier.  In particular, the platforms required for .NET 3.0/3.5 as well as the virtual lack of backward compatibility concerns with the 2.0 .NET framework were things that I had massive amounts of misinformation about.  Sure, part of that is me not keeping up with everything as keenly as I should, but at the end of the day I found that a lot of other developers at the conference had the same misinformation.  Great technology, vastly underinformed about how easily it could be applied.&lt;/p&gt;
&lt;p&gt;Have fun and hope you've had a great week!&lt;/p&gt;&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/73.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2007/10/17/73.aspx</guid>
            <pubDate>Thu, 18 Oct 2007 00:20:34 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2007/10/17/73.aspx#feedback</comments>
            <slash:comments>776</slash:comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/73.aspx</wfw:commentRss>
        </item>
        <item>
            <title>VSLive! Day Three - Creating Custom WCF Behaviors</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2007/10/17/72.aspx</link>
            <description>&lt;p&gt;
Presenter: Rob Daigneau&lt;br /&gt;
Code: &lt;a href="http://www.designpatternsfor.net"&gt;http://www.designpatternsfor.net&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
I think it must either be Rob Daigneau or the topic of Windows Communication Foundation because this was yet again another superb talk.  WCF was of little interest to me when I first arrived at this conference, however now I found myself extremely interested in learning more about how it might improve the architecture of my projects.  It doesn't feel, like so many unfortunately do, like a technological solution in search of a problem.  I can already see where I could apply WCF to bring a robust communication framework into the design of my applications.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Aspect-Oriented Programming&lt;/b&gt;&lt;br /&gt;
Aspects encapsulate the handling of a particular concern.  The aspects can intercept the flow of program execution to inject their code and perform work.  Custom behaviors in WCF borrow a lot of concepts from the aspect-oriented programming field of thought.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Why Custom Behaviors&lt;/b&gt;&lt;br /&gt;
There are several reasons for defining custom behaviors using interception logic:&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Validate parameters and messages&lt;/li&gt;
&lt;li&gt;Alter or Transform parameters and message&lt;/li&gt;
&lt;li&gt;Log information about messages&lt;/li&gt;
&lt;li&gt;Redirect operations to invoke - change the Action that is called based upon some part of the message body&lt;/li&gt;
&lt;li&gt;Custom Error Handling&lt;/li&gt;
&lt;li&gt;Custom Authorization&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;b&gt;WCF Behaviors&lt;/b&gt;&lt;br /&gt;
&lt;u&gt;Extensibility&lt;/u&gt;&lt;br /&gt;
The WCF runtime provides hooks for extensibility at the Sevice Model Layer and the Channel Layer.
&lt;br /&gt;&lt;br /&gt;
&lt;u&gt;Service Model Layer&lt;/u&gt;&lt;br /&gt;
Proxy and Dispatcher
&lt;br /&gt;&lt;br /&gt;
&lt;u&gt;Channel Layer&lt;/u&gt;&lt;br /&gt;
Client or Service Side
&lt;br /&gt;&lt;br /&gt;
Behaviors are injected in the Service Model Layer.  Extensions are added in the Channel Layer.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Framework Requirements&lt;/b&gt;&lt;br /&gt;
In order for custom behaviors to function, the .NET framework and WCF will need to be installed on the client because otherwise the .NET specific injection hooks on the client side will not function.
&lt;/p&gt;


&lt;p&gt;
&lt;b&gt;Interceptors&lt;/b&gt;&lt;br /&gt;
Interceptors are a means to extend the WCF runtime.  The System.ServiceModel.Dispatcher contains a number of interfaces that, if implemented, can be used to define custom behaviors.  By intercepting the ServiceHost.Open (on the service side) and ChannelFactory.Open (on the client side), the behaviors can be added to the WCF runtime.  In this way, the flow of program execution will be intercepted at known join-points and the code within your custom behavior classes will be executed.  Interceptors can also be injected at specific points on the dispatcher.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Potential Scenarios&lt;/b&gt;&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;IParameterInspector&lt;/li&gt;
&lt;li&gt;IClientMessageFormatter&lt;/li&gt;
&lt;li&gt;IClientMessageInspector&lt;/li&gt;
&lt;li&gt;IDispatchMessageInspector&lt;/li&gt;
&lt;li&gt;IDispatchOperationsSelector&lt;/li&gt;
&lt;li&gt;IDispatchMessageFormatter&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;b&gt;Loading the Behaviors into the WCF Runtime&lt;/b&gt;&lt;br /&gt;
In order to inject behaviors, their exist interfaces in the &lt;span style="font-family:Courier,New"&gt;System.ServiceModel.Description&lt;/span&gt; namespace.
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;IServiceBehavior&lt;/li&gt;
&lt;li&gt;IEndpointBehavior&lt;/li&gt;
&lt;li&gt;IContractBehavior&lt;/li&gt;
&lt;li&gt;IOperationBehavior&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;u&gt;Scoping&lt;/u&gt;&lt;br /&gt;
Each of these is scope within the other, with the IServiceBehavior implementations having the power to inject behaviors on services, endpoints, contracts, and operations.  Each tier down can inject behaviors on a smaller scope than the previous interface implementation, meaning that IOperationBehavior implementations can only inject behaviors on operations.
&lt;br /&gt;&lt;br /&gt;
&lt;u&gt;Means on Injection&lt;/u&gt;&lt;br /&gt;
Behaviors may be injected through configuration, attributes, or programmatic means.  All behaviors can be applied programmatically.  Only certain behaviors can be applied via configuration or through the use of attributes.
&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/72.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2007/10/17/72.aspx</guid>
            <pubDate>Thu, 18 Oct 2007 00:10:17 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2007/10/17/72.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/72.aspx</wfw:commentRss>
        </item>
        <item>
            <title>VSLive! Day Three - Using the Windows Workflow Rules Engine Standalone</title>
            <link>http://blogs.sftsrc.com/stuart/archive/2007/10/17/71.aspx</link>
            <description>&lt;p&gt;Presenter: Michael Stiefel &lt;/p&gt;
&lt;p&gt;Windows Workflow Foundation contains a very powerful rules engine.  However, the applications for such a rules engine do not always lend themselves to a Windows Workflow implementation.  In this talk, Michael was able to show how the rules engine can used outside of the WWF framework.  These notes will be updated in future posts as I work through the development of a custom wrapper and service class for abstracting the use of the rules engine. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Policy Activities&lt;/strong&gt;&lt;br /&gt;
Policy activities contain rule sets.  It is these rule sets that are processed when this policy activity is executed. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule Sets&lt;/strong&gt;&lt;br /&gt;
A rule set consists of a collection of individual rules.  Each rule is essentially an &lt;span style="FONT-FAMILY: Courier,New"&gt;if...then...else&lt;/span&gt; construct.  The then actions and else actions can modify properties and also invoke methods. &lt;/p&gt;
&lt;p&gt;&lt;u&gt;Chaining&lt;/u&gt;&lt;br /&gt;
There are three modes of chaining that can be selected for a particular rule set: Full Chaining, Sequential, or Explicit Update Only.  Full chaining means that if one rule modifies a value that was used by a different rule that had already been run, the original rule can be re-evaluated taking into account the updated value. &lt;/p&gt;
&lt;p&gt;&lt;u&gt;Rule Priority&lt;/u&gt;&lt;br /&gt;
Rules have an explicit priority which is stored as a number.  The higher the priority value, the higher the priority of the rule.  If several rules have the same priority, they are run in alphabetical order. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Invoking the Rules Engine outside of Windows Workflow Foundation&lt;/strong&gt;&lt;br /&gt;
&lt;u&gt;.rules file&lt;/u&gt;&lt;br /&gt;
The rules definition file is compiled into the workflow project as a resource.  Despite the fact that the rules file exists as xml on disk, replacing the file will not update the rules to be used because the WWF engine extracts the rules resource from the compiled dll at run time. &lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;WorkflowMarkupSerializer&lt;/u&gt;&lt;br /&gt;
The WorkflowMarkupSerializer is used to deserialize an xml rules file into a RuleSet object. &lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;RuleValidation&lt;/u&gt;&lt;br /&gt;
The RuleValidation class is used to validate a deserialized rule set to ensure that the rule set itself is valid. &lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;RuleExecution&lt;/u&gt;&lt;br /&gt;
The RuleExecution object can be used to execute the rules against the object that will be operated upon. &lt;/p&gt;&lt;img src="http://blogs.sftsrc.com/stuart/aggbug/71.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stuart Thompson</dc:creator>
            <guid>http://blogs.sftsrc.com/stuart/archive/2007/10/17/71.aspx</guid>
            <pubDate>Thu, 18 Oct 2007 00:09:01 GMT</pubDate>
            <comments>http://blogs.sftsrc.com/stuart/archive/2007/10/17/71.aspx#feedback</comments>
            <slash:comments>69</slash:comments>
            <wfw:commentRss>http://blogs.sftsrc.com/stuart/comments/commentRss/71.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>