<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Josh Schwartzberg high-fives the CLR</title><link>http://weblogs.asp.net/dotjosh/default.aspx</link><description>and spouts random buzzwords</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>ASP.NET MVC for the php/asp noob</title><link>http://weblogs.asp.net/dotjosh/archive/2010/04/20/asp-net-mvc-for-the-absolute-beginner.aspx</link><pubDate>Tue, 20 Apr 2010 19:37:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7451402</guid><dc:creator>dotjosh</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=7451402</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2010/04/20/asp-net-mvc-for-the-absolute-beginner.aspx#comments</comments><description>&lt;P&gt;I was talking to a friend today, who's foremost a php developer, about his thoughts on Umbraco and he said "Well they're apparently working feverishly on the new version of Umbraco, which will be MVC... which i still don't know what that means, but I know you like it."&lt;/P&gt;
&lt;P&gt;I ended up giving him a ground up explanation of ASP.NET MVC, so I'm posting this so he can link this to his friends and for anyone else who finds it useful.&amp;nbsp; The whole goal was to be as &lt;EM&gt;simple&lt;/EM&gt; as possible, not being focused on proper syntax.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Model-View-Controller (or MVC) is just a pattern&lt;/STRONG&gt;&amp;nbsp;that is used for handling UI interaction with your backend.&amp;nbsp; In a typical web app, you can imagine the *M*odel as your database model, the *V*iew as your HTML page, and the&amp;nbsp;*C*ontroller as the class inbetween.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;MVC handles your web request different than your typical php/asp app.&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;In your php/asp app&lt;/STRONG&gt;, your url maps directly to a php/asp file that contains html, mixed with database access code and redirects.&lt;BR&gt;&lt;STRONG&gt;In an MVC app&lt;/STRONG&gt;, your url route is mapped to a method on a class (the controller).&amp;nbsp; The body of this method can do some database access and THEN decide which *V*iew (html/aspx page) should be displayed;&amp;nbsp; putting the controller in charge and not the view... a clear seperation of concerns&amp;nbsp;that provides better reusibility and generally promotes cleaner code.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Mysite.com, a quick&amp;nbsp;example:&lt;BR&gt;&lt;/STRONG&gt;Let's say you hit the following url in your application:&lt;STRONG&gt; &lt;/STRONG&gt;&lt;A href="http://www.mysite.com/Product/ShowItem?Id=4" mce_href="http://www.mysite.com/Product/ShowItem?Id=4"&gt;http://www.mysite.com/Product/ShowItem?Id=4&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;To avoid tedious configuration, MVC uses a lot of conventions by default. For instance, the above url in your app would automatically make MVC search for a .net class with the name "Product" and a method named "ShowItem" based on the pattern of the url.&amp;nbsp; So if you name things properly, your method would automatically be called when you entered the above url.&amp;nbsp; Additionally, it would automatically map/hydrate the "int id" parameter that was in your querystring, matched by name.&lt;BR&gt;&lt;STRONG&gt;Product.cs&lt;BR&gt;&lt;/STRONG&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium 'Times New Roman'; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: small" class=Apple-style-span&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;class&lt;/SPAN&gt; Product : Controller&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; ViewResult ShowItem(&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;int&lt;/SPAN&gt; id)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;return&lt;/SPAN&gt; View();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;From this point you can write the code in the body of this method to do some database access and then pass a "bag" (also known as the ViewData) of data to your chosen *V*iew (html page) to use for display.&amp;nbsp; The view(html) ONLY needs to be worried about displaying the flattened data that it's been given in the best way it can;&amp;nbsp; this allows the view to be reused throughout your application as *just* a view, and not be coupled to HOW the data for that view get's loaded.. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Product.cs&lt;BR&gt;&lt;/STRONG&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium 'Times New Roman'; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: small" class=Apple-style-span&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;class&lt;/SPAN&gt; Product : Controller&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; ViewResult ShowItem(&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;int&lt;/SPAN&gt; id)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var database = &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;new&lt;/SPAN&gt; Database();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var item = database.GetItem(id);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewData[&lt;SPAN style="COLOR: rgb(0,96,128)" class=str&gt;"TheItem"&lt;/SPAN&gt;] = item;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;return&lt;/SPAN&gt; View();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;P&gt;Again by convention, since the class' method name is "ShowItem", it'll search for a view named "ShowItem.aspx" by default, and pass the ViewData bag to it to use. &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;ShowItem.aspx&lt;BR&gt;&lt;/STRONG&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium 'Times New Roman'; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: small" class=Apple-style-span&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,0,0)" class=html&gt;html&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,0,0)" class=html&gt;body&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="BACKGROUND-COLOR: rgb(255,255,0)" class=asp&gt;&amp;lt;%&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var item =(Item)ViewData[&lt;SPAN style="COLOR: rgb(0,96,128)" class=str&gt;"TheItem"&lt;/SPAN&gt;]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="BACKGROUND-COLOR: rgb(255,255,0)" class=asp&gt;%&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,0,0)" class=html&gt;h1&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(255,255,0)" class=asp&gt;&amp;lt;%&lt;/SPAN&gt;= item.FullProductName &lt;SPAN style="BACKGROUND-COLOR: rgb(255,255,0)" class=asp&gt;%&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,0,0)" class=html&gt;h1&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,0,0)" class=html&gt;body&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,0,0)" class=html&gt;html&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;BUT WAIT! WHY DOES MICROSOFT HAVE TO DO THINGS SO DIFFERENTLY!?&lt;BR&gt;&lt;/STRONG&gt;They aren't... here are some other frameworks you may have heard of that use the same pattern in a their own way:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Ruby On Rails&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Grails&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Spring MVC&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Struts&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Django&lt;BR&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7451402" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/MVC/default.aspx">MVC</category></item><item><title>Monitoring settings in a configsection of your app.config for changes</title><link>http://weblogs.asp.net/dotjosh/archive/2010/03/24/monitoring-settings-in-a-configsection-of-your-app-config-for-changes.aspx</link><pubDate>Wed, 24 Mar 2010 15:08:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7407695</guid><dc:creator>dotjosh</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=7407695</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2010/03/24/monitoring-settings-in-a-configsection-of-your-app-config-for-changes.aspx#comments</comments><description>&lt;P&gt;&lt;B&gt;The usage:&lt;/B&gt;&lt;/P&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium 'Times New Roman'; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: small" class=Apple-style-span&gt;&lt;SPAN id=ctl00_ContentPlaceHolder1_output&gt;&lt;PRE style="BACKGROUND-COLOR: rgb(255,255,255); FONT-FAMILY: Consolas, 'Courier New', Courier, monospace; COLOR: black; FONT-SIZE: small" class=csharpcode&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;void&lt;/SPAN&gt; Main()
{
    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;using&lt;/SPAN&gt;(var configSectionAdapter = &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;new&lt;/SPAN&gt; ConfigurationSectionAdapter&amp;lt;ACISSInstanceConfigSection&amp;gt;(&lt;SPAN style="COLOR: rgb(0,96,128)" class=str&gt;"MyConfigSectionName"&lt;/SPAN&gt;))
    {
        configSectionAdapter.ConfigSectionChanged += () =&amp;gt;
        {
            Console.WriteLine(&lt;SPAN style="COLOR: rgb(0,96,128)" class=str&gt;"File has changed!  New setting is "&lt;/SPAN&gt; + configSectionAdapter.ConfigSection.MyConfigSetting);
        };
        Console.WriteLine(&lt;SPAN style="COLOR: rgb(0,96,128)" class=str&gt;"The initial setting is "&lt;/SPAN&gt; + configSectionAdapter.ConfigSection.MyConfigSetting);
        Console.ReadLine();
    }
}&lt;/PRE&gt;&lt;PRE style="BACKGROUND-COLOR: rgb(255,255,255); FONT-FAMILY: Consolas, 'Courier New', Courier, monospace; COLOR: black; FONT-SIZE: small" class=csharpcode&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;
&lt;P&gt;&lt;B&gt;The meat:&lt;/B&gt; &lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium 'Times New Roman'; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: small" class=Apple-style-span&gt;&lt;/P&gt;&lt;PRE style="BACKGROUND-COLOR: rgb(255,255,255); FONT-FAMILY: Consolas, 'Courier New', Courier, monospace; COLOR: black; FONT-SIZE: small" class=csharpcode&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;&lt;SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium 'Times New Roman'; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: small" class=Apple-style-span&gt;&lt;PRE style="BACKGROUND-COLOR: rgb(255,255,255); FONT-FAMILY: Consolas, 'Courier New', Courier, monospace; COLOR: black; FONT-SIZE: small" class=csharpcode&gt;&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;class&lt;/SPAN&gt; ConfigurationSectionAdapter&amp;lt;T&amp;gt; : IDisposable
    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;where&lt;/SPAN&gt; T : ConfigurationSection
{
    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;readonly&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;string&lt;/SPAN&gt; _configSectionName;
    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;private&lt;/SPAN&gt; FileSystemWatcher _fileWatcher;

    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; ConfigurationSectionAdapter(&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;string&lt;/SPAN&gt; configSectionName)
    {
        _configSectionName = configSectionName;
        StartFileWatcher();
    }

    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;void&lt;/SPAN&gt; StartFileWatcher()
    {
        var configurationFileDirectory = &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;new&lt;/SPAN&gt; FileInfo(Configuration.FilePath).Directory;
        _fileWatcher = &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;new&lt;/SPAN&gt; FileSystemWatcher(configurationFileDirectory.FullName);
        _fileWatcher.Changed += FileWatcherOnChanged; 
        _fileWatcher.EnableRaisingEvents = &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;true&lt;/SPAN&gt;;
    }

    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;void&lt;/SPAN&gt; FileWatcherOnChanged(&lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;object&lt;/SPAN&gt; sender, FileSystemEventArgs args)
    {
        var changedFileIsConfigurationFile = &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;string&lt;/SPAN&gt;.Equals(args.FullPath, Configuration.FilePath, StringComparison.OrdinalIgnoreCase);
        &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;if&lt;/SPAN&gt; (!changedFileIsConfigurationFile)
            &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;return&lt;/SPAN&gt;;

        ClearCache();
        OnConfigSectionChanged();
    }

    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;void&lt;/SPAN&gt; ClearCache()
    {
        ConfigurationManager.RefreshSection(_configSectionName);
    }

    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; T ConfigSection
    {
        get { &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;return&lt;/SPAN&gt; (T)Configuration.GetSection(_configSectionName); }
    }

    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;private&lt;/SPAN&gt; System.Configuration.Configuration Configuration
    {
        get { &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;return&lt;/SPAN&gt; ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); }
    }

    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;delegate&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;void&lt;/SPAN&gt; ConfigChangedHandler();
    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;event&lt;/SPAN&gt; ConfigChangedHandler ConfigSectionChanged;

    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;void&lt;/SPAN&gt; OnConfigSectionChanged()
    {
        &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;if&lt;/SPAN&gt; (ConfigSectionChanged != &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;null&lt;/SPAN&gt;)
            ConfigSectionChanged();
    }

    &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;void&lt;/SPAN&gt; Dispose()
    {
        _fileWatcher.Changed -= FileWatcherOnChanged; 
        _fileWatcher.EnableRaisingEvents = &lt;SPAN style="COLOR: rgb(0,0,255)" class=kwrd&gt;false&lt;/SPAN&gt;;
        _fileWatcher.Dispose();
    }
}&lt;/PRE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7407695" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>"And you wanted to blame NHibernate!?" -Ayende</title><link>http://weblogs.asp.net/dotjosh/archive/2010/01/14/quot-and-you-wanted-to-blame-nhibernate-quot.aspx</link><pubDate>Thu, 14 Jan 2010 05:04:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7310269</guid><dc:creator>dotjosh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=7310269</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2010/01/14/quot-and-you-wanted-to-blame-nhibernate-quot.aspx#comments</comments><description>&lt;P&gt;With permission from Ayende, here is a great sound byte from one of the &lt;A href="http://tekpub.com/" target=_blank mce_href="http://tekpub.com"&gt;TekPub&lt;/A&gt; video series (which I highly recommend) on NHibernate.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Feel free to send it to people who erroneously blame NHibernate, I know I will!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;*MP3 FILE DOWNLOAD: &lt;/STRONG&gt;&lt;A href="http://metalxmas.com/content/music/ayendeblamesnhibernate.mp3" target=_blank mce_href="http://metalxmas.com/content/music/ayendeblamesnhibernate.mp3"&gt;&lt;STRONG&gt;"And you wanted to blame NHibernate?!"&lt;/STRONG&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7310269" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Everything+Else/default.aspx">Everything Else</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Agile/default.aspx">Agile</category></item><item><title>My short answer to "If no other engineering discipline does it first, why should I TDD?"</title><link>http://weblogs.asp.net/dotjosh/archive/2009/12/21/my-answer-to-quot-why-tdd-no-other-engineering-does-it-quot.aspx</link><pubDate>Mon, 21 Dec 2009 18:15:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7287089</guid><dc:creator>dotjosh</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=7287089</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2009/12/21/my-answer-to-quot-why-tdd-no-other-engineering-does-it-quot.aspx#comments</comments><description>&lt;P&gt;I agree Software Development by the truest form of the word, is in fact Engineering, but not all parallels can be made to its hardware counterparts, especially in its current state of maturity.&amp;nbsp;&amp;nbsp; We can build high amounts of complexity with few people in a very short period of time.&amp;nbsp; All of which relies on other systems that are relatively unproven and unstable, it's hard to have a proper engineering process in these conditions.&lt;BR&gt;&lt;BR&gt;This is why we need better code that can safely react to change.&amp;nbsp; In my opinion, "better" code in statically typed languages is inherently easier to test.&amp;nbsp;&amp;nbsp; Its more isolated/abstracted and cohesive for its purpose.. and so are its supporting unit tests.&amp;nbsp;&amp;nbsp; This ensures small and large changes alike have minimum impact on the existing, unrelated code... without a nasty ripple effect.&lt;BR&gt;&lt;BR&gt;TDD is just one ritual to writing code that I loosely term "better", it's definitely not an end-all.&amp;nbsp; Clearly it's easy to assume writing more tests is the only correlation in less buggy software, but what the paper(s) don't show in numbers are the increased agility in the software process as every day brings a new change to the design that can be made more safely.&amp;nbsp; &lt;BR&gt;&lt;BR&gt;There is still a large human aspect to this whole process, and given short-term cost-benefit analysis', many times the code quality suffers; building rigid, new untested features that only cause growing pains and degrades the testing ritual that were initially put in place.&amp;nbsp; That said, the cost-benefit analysis' do have to be made, and I wouldn't say that all bugs are worth fixing or can be fixed for a timely release.&amp;nbsp;&amp;nbsp; But you have to ask what the long-term cost is to a buggy system that becomes difficult to test or change without fear.&lt;/P&gt;
&lt;P&gt;I'd like to hear everyones opinion on the matter.&lt;BR&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7287089" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/General+Software+Development/default.aspx">General Software Development</category></item><item><title>Silverlight BringIntoView() extension method (with OnGotFocus behavior)</title><link>http://weblogs.asp.net/dotjosh/archive/2009/11/05/bringintoview-extension-method-for-silverlight-with-behavior.aspx</link><pubDate>Thu, 05 Nov 2009 14:23:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7247830</guid><dc:creator>dotjosh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=7247830</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2009/11/05/bringintoview-extension-method-for-silverlight-with-behavior.aspx#comments</comments><description>&lt;P&gt;It all started because I couldn't find a way to automatically&amp;nbsp;scroll any element into view in Silverlight (a feature &lt;BR&gt;that&amp;nbsp;&lt;A title="FrameworkElement.BringIntoView Method on MSDN" href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.bringintoview.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.bringintoview.aspx"&gt;exists&lt;/A&gt; in WPF).&amp;nbsp; I take that back, I &lt;EM&gt;could&lt;/EM&gt; get the job done with a ListBox's&amp;nbsp;ScrollIntoView(ListBoxItem item) &lt;BR&gt;method, but I hardly&lt;STRONG&gt; &lt;/STRONG&gt;wanted everything on my screen to be wrapped as a ListBoxItem;&amp;nbsp;it feels as dirty as it sounds. &amp;nbsp;&lt;/P&gt;
&lt;P&gt;Anyways, here is the code.&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=rem&gt;/* Extension Methods */&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; FrameworkElementExtensions
{
    &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;const&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; ScrollPadding = 10;

    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; BringIntoView(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt; FrameworkElement frameworkElement)
    {
        var parent = VisualTreeHelper.GetParent(frameworkElement);
        &lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt;(parent != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
        {
            parent = VisualTreeHelper.GetParent(parent);
            var scrollViewer = parent &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; ScrollViewer;
            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt;(scrollViewer != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
            {
                frameworkElement.BringIntoViewForScrollViewer(scrollViewer);
                &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;
            }
        }
    }

    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; BringIntoViewForScrollViewer(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt; FrameworkElement frameworkElement, ScrollViewer scrollViewer)
    {
        var transform = frameworkElement.TransformToVisual(scrollViewer);
        var positionInScrollViewer = transform.Transform(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Point(0, 0));

        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (positionInScrollViewer.Y &amp;lt; 0 || positionInScrollViewer.Y &amp;gt; scrollViewer.ViewportHeight)
            scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + positionInScrollViewer.Y - ScrollPadding);
    }
} &lt;/PRE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Bonus Behavior!&lt;/STRONG&gt; (Behaviors?!? &lt;A title="Behaviors Intro" href="http://blogs.msdn.com/deviations/archive/2009/06/06/my-first-silverlight-behavior.aspx" target=_blank mce_href="http://blogs.msdn.com/deviations/archive/2009/06/06/my-first-silverlight-behavior.aspx"&gt;Here is an Introduction&lt;/A&gt;).&lt;BR&gt;This behavior was created&amp;nbsp;ensure that as a user tabs through the screen,&amp;nbsp;scrolling automatically takes place.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Note: If you want to use behaviors in Silverlight,&amp;nbsp;install the &lt;A title="Blend 3 SDK Download" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f1ae9a30-4928-411d-970b-e682ab179e17&amp;amp;displaylang=en" target=_blank mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f1ae9a30-4928-411d-970b-e682ab179e17&amp;amp;displaylang=en"&gt;Blend 3 SDK&lt;/A&gt;&amp;nbsp;and reference &lt;BR&gt;Microsoft.Expression.Interactions.dll &lt;/EM&gt;&lt;BR&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=rem&gt;/* Behavior class  */&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; BringIntoViewOnFocusBehavior : Behavior&amp;lt;FrameworkElement&amp;gt;
{
    &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; OnAttached()
    {
        &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.OnAttached();
        AssociatedObject.GotFocus += OnGotFocus;
    }

    &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; OnDetaching()
    {
        &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.OnDetaching();
        AssociatedObject.GotFocus -= OnGotFocus;
    }

    &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; OnGotFocus(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, RoutedEventArgs e1)
    {
        AssociatedObject.BringIntoView();
    }        
}&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=rem&gt;&amp;lt;!-- XAML usage of custom behavior --&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;UserControl&lt;/SPAN&gt; 
    &lt;SPAN class=attr&gt;xmlns:interactivity&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"&lt;/SPAN&gt; 
    &lt;SPAN class=attr&gt;xmlns:behaviors&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="clr-namespace:YourNamespaceToBehaviors.Behaviors"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;        
    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;StackPanel&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;TextBox&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
            &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;interactivity:Interaction.Behaviors&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
                &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;behaviors:BringIntoViewOnFocusBehavior&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;/&amp;gt;&lt;/SPAN&gt;
            &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;interactivity:Interaction.Behaviors&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;TextBox&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;StackPanel&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;    
&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;UserControl&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7247830" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Blend/default.aspx">Blend</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Silverlight 3 quietly released a day early</title><link>http://weblogs.asp.net/dotjosh/archive/2009/07/09/silverlight-3-quietly-so-far-released-a-day-early.aspx</link><pubDate>Thu, 09 Jul 2009 19:56:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7143971</guid><dc:creator>dotjosh</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=7143971</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2009/07/09/silverlight-3-quietly-so-far-released-a-day-early.aspx#comments</comments><description>&lt;P&gt;&lt;IMG style="WIDTH: 300px; HEIGHT: 300px" align=top src="http://weblogs.asp.net/blogs/dotjosh/silverlight3.jpg" width=300 height=300 mce_src="http://weblogs.asp.net/blogs/dotjosh/silverlight3.jpg"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I don't see any official word yet, but here are the links to the binaries:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=9442b0f2-7465-417a-88f3-5e7b5409e9dd" target=_blank mce_href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=9442b0f2-7465-417a-88f3-5e7b5409e9dd"&gt;Microsoft® Silverlight™ 3 Tools for Visual Studio 2008 SP1&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/silverlight/resources/install.aspx" target=_blank mce_href="http://www.microsoft.com/silverlight/resources/install.aspx"&gt;Microsoft Silverlight 3 Client Install Page&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;I'm just hoping that I'll be able to multitarget for Silverlight 2 and Silverlight 3 apps now.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7143971" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Visual Studio "Error of the Day"</title><link>http://weblogs.asp.net/dotjosh/archive/2009/04/06/visual-studio-quot-error-of-the-day-quot.aspx</link><pubDate>Mon, 06 Apr 2009 14:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7029964</guid><dc:creator>dotjosh</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=7029964</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2009/04/06/visual-studio-quot-error-of-the-day-quot.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;&amp;nbsp;Seriously?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://weblogs.asp.net/blogs/dotjosh/vstudio-error.png" mce_src="http://weblogs.asp.net/blogs/dotjosh/vstudio-error.png" width="426" height="315"&gt;&amp;nbsp;&lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7029964" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>MVC/JQuery meets X-Mas Music Project</title><link>http://weblogs.asp.net/dotjosh/archive/2008/12/15/mvc-jquery-meets-x-mas-music-project.aspx</link><pubDate>Tue, 16 Dec 2008 02:26:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6789309</guid><dc:creator>dotjosh</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=6789309</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2008/12/15/mvc-jquery-meets-x-mas-music-project.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;&lt;A title=MetalXmas.com href="http://www.metalxmas.com/" target=_blank mce_href="http://www.metalxmas.com"&gt;&lt;IMG style="WIDTH: 320px; HEIGHT: 303px" title=MetalXmas.com border=0 hspace=15 alt=MetalXmas.com vspace=5 align=right src="http://weblogs.asp.net/blogs/dotjosh/metalxmas_blogpost.jpg" width=320 height=261 mce_src="http://weblogs.asp.net/blogs/dotjosh/metalxmas_blogpost.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;BR&gt;My friend&amp;nbsp;Dave and I embarked on a project a few&amp;nbsp;weeks ago, initially just meant to be an audio CD for our family, that included&amp;nbsp;some rockin' versions of everyone's christmas&amp;nbsp;favorites.&amp;nbsp; As we started to record it, we got more and more excited about how it might turn out.&amp;nbsp; Being the uber code master that I am, I opted to make a website... then in a blink, a friend who is &lt;A title=JoeyShipley.com href="http://www.joeyshipley.com/" target=_blank mce_href="http://www.joeyshipley.com"&gt;incredible&lt;/A&gt; at Flash offered to help. This turned out to be a great experience for all of us, and the feedback has been tremendous.&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;I'm very proud to share with&amp;nbsp;you (make sure your speakers are on)&amp;nbsp;&lt;A href="http://www.metalxmas.com/"&gt;&lt;B&gt;www.metalxmas.com&lt;/B&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;B&gt;The code-behind&lt;BR&gt;&lt;/B&gt;I wanted to have a spot for friends, family, and haters to&amp;nbsp;post their honest ramblings, so&amp;nbsp;I decided to go with the much-loved JQuery/ASP.NET MVC combo; what a joy as always.&amp;nbsp; One bug I ran into, that seems to have been noticed before me, is the ability to cache the root page of your&amp;nbsp;ASP.NET MVC&amp;nbsp;site using&amp;nbsp;the OutputCache attribute.&amp;nbsp; According to &lt;A title="Post on stackoverflow" href="http://stackoverflow.com/questions/323458/aspnet-mvc-outputcache-doesnt-work-for-root-uri" target=_blank mce_href="http://stackoverflow.com/questions/323458/aspnet-mvc-outputcache-doesnt-work-for-root-uri"&gt;this thread&lt;/A&gt;, the mvc team will have a fix soon.&amp;nbsp; For the time-being, I ended up caching at the repository level by just sticking the data response from disk&amp;nbsp;into the HttpContext cache to ensure I only read&amp;nbsp;and parse my xml file every 10 seconds.&lt;BR&gt;&lt;BR&gt;Nothing else too interesting came up. I added&amp;nbsp;some spam protection, input validation (client and server-side), and HtmlEncoding to protect any hijacks.&amp;nbsp; All in all, another great experience.&amp;nbsp; I would share the code, &lt;A href="http://codebetter.com/blogs/karlseguin/archive/2008/12/15/oxite-oh-dear-lord-why.aspx" mce_href="http://codebetter.com/blogs/karlseguin/archive/2008/12/15/oxite-oh-dear-lord-why.aspx"&gt;but I&lt;/A&gt; have a certain&amp;nbsp;&lt;A href="http://blog.wekeroad.com/blog/some-thoughts-on-oxite/" target=_blank mce_href="http://blog.wekeroad.com/blog/some-thoughts-on-oxite/"&gt;Oxitephobia&lt;/A&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;B&gt;Scalability&lt;BR&gt;&lt;/B&gt;In the hopes (and&amp;nbsp;delusions of grandeur) of this thing being picked up as even a semi-viral hit.&amp;nbsp; I wanted to make sure the site wouldn't go down.&amp;nbsp; I placed the flash file, the&amp;nbsp;four mp3 files, the images, and the css file on a CDN.&amp;nbsp; I initially started with Amazon S3... but at 15cents/gig compared to SimpleCDN's 6cents/gig I had to switch.&amp;nbsp; I've been very happy with my experience, and they even include $15 worth of free credit when you first sign-up.&amp;nbsp; A friend of mine suggested I use the YSlow plugin to analyze my site; this ended up with the following configuration:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;HTTP Compression enabled on CDN (via url configuration) and IIS (c'mon, if you haven't done this yourself already, &lt;A title="Google search" href="http://letmegooglethatforyou.com/?q=IIS+gzip+compression" target=_blank mce_href="http://letmegooglethatforyou.com/?q=IIS+gzip+compression"&gt;DO IT NOW&lt;/A&gt;)&lt;/LI&gt;
&lt;LI&gt;Set content expiration on all files on CDN to have 10 year expiration headers (I named the files themselves with version numbers to allow for forcefully expiring if needed)&lt;/LI&gt;
&lt;LI&gt;JQuery and SWFObject scripts&amp;nbsp;hosted via google&lt;/LI&gt;
&lt;LI&gt;All scripts at the bottom&lt;/LI&gt;
&lt;LI&gt;XHTML 1.0 Strict validated by W3&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;This ended me with an &lt;B&gt;A&lt;/B&gt; score with YSlow.&amp;nbsp; I felt accomplished.&lt;/P&gt;
&lt;P&gt;&lt;B&gt;Parting thoughts&lt;BR&gt;&lt;/B&gt;I hope you enjoy it, it's definitely meant to be funny - so don't take it too seriously.&amp;nbsp; Feel free to pass it along to your friends and family!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6789309" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/JQuery/default.aspx">JQuery</category></item><item><title>Hiring! Tampa Bay Developer</title><link>http://weblogs.asp.net/dotjosh/archive/2008/03/31/hiring-tampa-bay-developer.aspx</link><pubDate>Mon, 31 Mar 2008 19:24:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6053079</guid><dc:creator>dotjosh</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=6053079</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2008/03/31/hiring-tampa-bay-developer.aspx#comments</comments><description>&lt;p style="font-weight: bold;"&gt;Are you a highly motivated .NET &lt;span style="text-decoration: line-through;"&gt;code monkey&lt;/span&gt; developer in the Tampa Bay area with a passion for software and the ability to learn quickly?&lt;/p&gt;
&lt;p style="font-weight: bold;"&gt;&amp;nbsp;&lt;a href="http://weblogs.asp.net/blogs/dotjosh/ThinkingMonkey.jpg"&gt;&lt;img src="http://weblogs.asp.net/blogs/dotjosh/ThinkingMonkey.jpg" border="0"&gt;&lt;/a&gt;&lt;a href="http://weblogs.asp.net/blogs/dotjosh/ThinkingMonkey.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;if(not){return;} &lt;br&gt;&lt;/p&gt;&lt;p&gt;Come join our top-notch team of developers who utilize the latest technologies (JQuery, NHibernate, CruiseControl, Nant, Resharper, etc.) to build the essential tools for the nation's largest and fastest-growing audiovisual firm.&lt;/p&gt;&lt;br&gt;&lt;p style="margin: 0in 0in 0pt; font-weight: bold;"&gt;The ideal candidate will have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Minimum 2 years experience developing applications.&lt;/li&gt;
&lt;li&gt;Minimum 1 year experience with C# in ASP.NET and/or Windows Forms.&lt;/li&gt;
&lt;li&gt;Strong experience with MS SQL Server.&lt;/li&gt;
&lt;li&gt;Solid skills and knowledge of HTML/DHTML, JavaScript and XML.&lt;/li&gt;
&lt;li&gt;Excellent written and verbal communication skills.&lt;/li&gt;
&lt;li&gt;Ability to learn quickly, as well as think and work independently.&lt;/li&gt;
&lt;li&gt;Passion for learning new technology and implementation techniques &lt;/li&gt;&lt;/ul&gt;&lt;a href="http://jobsearch.aviinc.careers.monster.com/getjob.asp?JobID=68925538&amp;amp;AVSDM=2008%2D02%2D22+21%3A37%3A33&amp;amp;Logo=0&amp;amp;col=dlt&amp;amp;sort=rv&amp;amp;vw=b&amp;amp;lid=390" title="All your code are belong to us" target="_blank" mce_href="http://jobsearch.aviinc.careers.monster.com/getjob.asp?JobID=68925538&amp;amp;AVSDM=2008%2D02%2D22+21%3A37%3A33&amp;amp;Logo=0&amp;amp;col=dlt&amp;amp;sort=rv&amp;amp;vw=b&amp;amp;lid=390"&gt;Apply now and come play with us&lt;/a&gt;&lt;br&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6053079" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET+Jobs/default.aspx">.NET Jobs</category></item><item><title>NHibernate querying without mapping inverse relationships</title><link>http://weblogs.asp.net/dotjosh/archive/2008/02/28/nhibernate-querying-without-inverse-relationships.aspx</link><pubDate>Thu, 28 Feb 2008 16:00:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5878291</guid><dc:creator>dotjosh</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=5878291</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2008/02/28/nhibernate-querying-without-inverse-relationships.aspx#comments</comments><description>&lt;p mce_keep="true"&gt;In my neverending quest to keep my domain minimal, I ran into a query that I wanted to perform with NHibernate that seems to be impossible without adding an additional property and&amp;nbsp;hbm mapping definition.&lt;/p&gt;
&lt;p mce_keep="true"&gt;Note: I still consider myself rather new to NHibernate, so this might have an obvious answer.&lt;/p&gt;
&lt;p mce_keep="true"&gt;Let's say I have following two classes:&lt;br&gt;&lt;font color="#0000ff" size="1"&gt;public&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;class&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;School : EntityBase&lt;br&gt;&lt;/font&gt;&lt;font size="1"&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font size="1"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;string&lt;/font&gt;&lt;font size="1"&gt; Name { get; set; }&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;public&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;IList&lt;/font&gt;&lt;font size="1"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;Student&lt;/font&gt;&lt;font size="1"&gt;&amp;gt; Students { get; set; }&lt;br&gt;&lt;/font&gt;&lt;font size="1"&gt;}&lt;br&gt;&lt;font color="#0000ff" size="1"&gt;&lt;br&gt;public&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;class&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="1"&gt;Student : EntityBase&lt;br&gt;&lt;/font&gt;&lt;font size="1"&gt;{&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font size="1"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;public&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;string&lt;/font&gt;&lt;font size="1"&gt; Name { get; set; }&lt;br&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;The School.hbm.xml file contains this in the body:&lt;br&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;bag&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;name&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;=&lt;/font&gt;&lt;font size="1"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;Students&lt;/font&gt;&lt;font size="1"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;key&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;column&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;=&lt;/font&gt;&lt;font size="1"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;SchoolId&lt;/font&gt;&lt;font size="1"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;one-to-many&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;class&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;=&lt;/font&gt;&lt;font size="1"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;Student&lt;/font&gt;&lt;font size="1"&gt;"&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;/&amp;gt;&lt;br&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;bag&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;The database representation of the above looks something like this:&lt;br&gt;&lt;img src="http://liquidoptical.com/joshblog/content/DDLScreenie_2-28-2008.png" title="Db representation" style="width: 549px; height: 100px;" alt="Db representation" mce_src="http://liquidoptical.com/joshblog/content/DDLScreenie_2-28-2008.png" height="100" width="549"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;Without making any changes to my classes/mappings,&amp;nbsp;I can perform&amp;nbsp;this&amp;nbsp;&lt;b&gt;SQL &lt;/b&gt;query&amp;nbsp;to retrieve all Students who's name contains 'Powers' that belong to a school who's&amp;nbsp;name contains 'Middle':&lt;br&gt;&lt;font color="#0000ff" size="2"&gt;SELECT&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#808080" size="2"&gt;*&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;FROM&lt;/font&gt;&lt;font size="2"&gt; Students&lt;br&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;WHERE&lt;/font&gt;&lt;font size="2"&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Students&lt;/font&gt;&lt;font color="#808080" size="2"&gt;.&lt;/font&gt;&lt;font size="2"&gt;Name &lt;/font&gt;&lt;font color="#808080" size="2"&gt;LIKE&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;'%Powers%'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#808080" size="2"&gt;AND&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font size="2"&gt;Students&lt;/font&gt;&lt;font color="#808080" size="2"&gt;.&lt;/font&gt;&lt;font size="2"&gt;SchoolId &lt;/font&gt;&lt;font color="#808080" size="2"&gt;IN&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#808080" size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;SELECT&lt;/font&gt;&lt;font size="2"&gt; School&lt;/font&gt;&lt;font color="#808080" size="2"&gt;.&lt;/font&gt;&lt;font size="2"&gt;Id &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;FROM&lt;/font&gt;&lt;font size="2"&gt; Schools &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;WHERE&lt;/font&gt;&lt;font size="2"&gt; Schools&lt;/font&gt;&lt;font color="#808080" size="2"&gt;.&lt;/font&gt;&lt;font size="2"&gt;Name &lt;/font&gt;&lt;font color="#808080" size="2"&gt;LIKE&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="2"&gt;'%Middle%'&lt;/font&gt;&lt;font color="#808080" size="2"&gt;)&lt;/font&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;font size="2"&gt;So - Here is the question, how can I do this in an &lt;b&gt;HQL &lt;/b&gt;query without making any changes to my domain (which would be specifically&amp;nbsp;adding a School property to the Student class and defining the relationship in the Student.hbm.xml file)?&lt;/font&gt;&lt;font color="#808080" size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5878291" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Inheriting code (that smells)</title><link>http://weblogs.asp.net/dotjosh/archive/2007/12/14/inheriting-code-that-smells.aspx</link><pubDate>Fri, 14 Dec 2007 19:23:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5455560</guid><dc:creator>dotjosh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=5455560</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2007/12/14/inheriting-code-that-smells.aspx#comments</comments><description>&lt;span style="font-weight: bold;"&gt;Josh&lt;/span&gt;: I am excited to be furthering the development of your tremendously popular website.&amp;nbsp; How may I gain access to the source control repository?&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Customer&lt;/span&gt;: Give me a second... *You've got mail! - &lt;b&gt;sourcecode.zip&lt;/b&gt;*&lt;p&gt;Wow, this isn't my ideal way of getting my hands dirty in a project.&amp;nbsp; But, this will be easy to fix.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Opening this .NET 1.1 ASP.NET app, I find three projects and no solution file.&amp;nbsp; Confused, I open the projects individually and realize there is a huge circular reference issue that was circumvented by compiling the projects seperately and then referencing their output assemblies. Yuck. There are also heaps of bugs in the code causing all sorts of unneeded memory usage that's causing the application to freeze and recycle several times a day.&amp;nbsp; Finally, I'm told that all of the latest features created for the site have been causing problems everywhere else.&amp;nbsp; I think it's time for a change.&lt;br&gt;&lt;br&gt;After several weeks of &lt;a href="http://www.mbunit.com/" target="_blank" mce_href="http://www.mbunit.com/"&gt;unit tests&lt;/a&gt;, &lt;a href="http://www.jetbrains.com/resharper/" target="_blank" mce_href="http://www.jetbrains.com/resharper/"&gt;refactoring&lt;/a&gt;, &lt;a href="http://subversion.tigris.org/" target="_blank" mce_href="http://subversion.tigris.org/"&gt;SVN&lt;/a&gt;, and &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET" target="_blank" mce_href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CC.NET&lt;/a&gt; configuration. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;The site no longer crashes.&lt;br&gt;&lt;/li&gt;&lt;li&gt;Features can be implemented faster and more effectively.&lt;/li&gt;&lt;li&gt;Source control provides a source history with much safer storage.&lt;/li&gt;&lt;li&gt;A new version of the site can be deployed with the click of a button.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;There is still a lot of work to be done.&amp;nbsp; But, I think this goes to show the power and reason for being agile.&amp;nbsp;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5455560" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Legacy/default.aspx">Legacy</category><category domain="http://weblogs.asp.net/dotjosh/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Windows Live and Windows Media Center are becoming friends.</title><link>http://weblogs.asp.net/dotjosh/archive/2006/01/26/436531.aspx</link><pubDate>Thu, 26 Jan 2006 16:26:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:436531</guid><dc:creator>dotjosh</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=436531</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2006/01/26/436531.aspx#comments</comments><description>It appears that the new Windows Live services portal that Microsoft has been pushing has finally caught my eye.&amp;nbsp; A new service that will allow me to communicate with Windows Media Center over the Internet. The interactions allow users to remotely record television shows, find programming information, and discover viewing preferences from buddies in their MSN Messenger social network.&lt;br /&gt;&lt;br /&gt;Now they aren't saying yet if this service will allow for remote viewing, but lets hope we hear more about that soon. Kris Barton at Microsoft provided &lt;a href="http://www.liquidoptical.com/livemediacenter.jpg"&gt;this screenshot &lt;/a&gt;of this sexy service in action.&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=436531" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Tech/default.aspx">Tech</category></item><item><title>Web Authoring Statistics from Google</title><link>http://weblogs.asp.net/dotjosh/archive/2006/01/25/436468.aspx</link><pubDate>Wed, 25 Jan 2006 21:20:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:436468</guid><dc:creator>dotjosh</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=436468</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2006/01/25/436468.aspx#comments</comments><description>Google has &lt;a href="http://code.google.com/webstats/index.html"&gt;posted&lt;/a&gt; a very interesting analysis of the code/authoring techniques of over one billion documents &lt;a href="http://code.google.com/webstats/index.html"&gt;here&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;It seems much of the data they collected was pretty obvious (ex: the abundance of&amp;nbsp; the "a" and "img" element).&amp;nbsp;&amp;nbsp; But, it's still an interesting read.&lt;br /&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=436468" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Tech/default.aspx">Tech</category></item><item><title>New Vista Website</title><link>http://weblogs.asp.net/dotjosh/archive/2005/09/15/425320.aspx</link><pubDate>Thu, 15 Sep 2005 17:12:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:425320</guid><dc:creator>dotjosh</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=425320</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2005/09/15/425320.aspx#comments</comments><description>I'm liking the new vista website design.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/windowsvista/default.mspx"&gt;http://www.microsoft.com/windowsvista/default.mspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=425320" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dotjosh/archive/tags/Tech/default.aspx">Tech</category></item><item><title>iPod Nano Picture</title><link>http://weblogs.asp.net/dotjosh/archive/2005/09/08/424687.aspx</link><pubDate>Thu, 08 Sep 2005 19:00:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:424687</guid><dc:creator>dotjosh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dotjosh/rsscomments.aspx?PostID=424687</wfw:commentRss><comments>http://weblogs.asp.net/dotjosh/archive/2005/09/08/424687.aspx#comments</comments><description>Wow this thing really is small.&amp;nbsp; But, where is the headphone jack?&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.laist.com/attachments/la_kevin/iPodPica2.jpg" /&gt; &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=424687" width="1" height="1"&gt;</description></item></channel></rss>