<feed version="0.3" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://purl.org/atom/ns#" xml:lang="en-US"><title>Daniel Cazzulino's Blog</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/default.aspx" /><tagline type="text/html">data wants to be free, and xml is the key</tagline><id>http://www.clariusconsulting.net/blogs/kzu/default.aspx</id><author><url>http://www.clariusconsulting.net/blogs/kzu/default.aspx</url></author><generator url="http://communityserver.org" version="1.0.1.50214">Community Server</generator><modified>2008-05-28T14:14:00Z</modified><entry><title>What is all the fuzz about the new common IServiceLocator</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/10/03/WhatisallthefuzzaboutthenewcommonIServiceLocator.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:99008</id><created>2008-10-03T06:35:24Z</created><content type="text/html" mode="escaped">&lt;p&gt;There's been &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/08/16/it-s-time-for-ioc-container-detente.aspx"&gt;some&lt;/a&gt; &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/08/16/it-s-time-for-ioc-container-detente.aspx"&gt;excitement&lt;/a&gt; &lt;a href="http://www.tavaresstudios.com/Blog/post/Announcing-The-IServiceLocator-interface.aspx"&gt;lately&lt;/a&gt; about the introduction of a &lt;a href="http://www.codeplex.com/CommonServiceLocator"&gt;common IServiceLocator&lt;/a&gt; that all major DI containers apparently will provide.&lt;/p&gt; &lt;p&gt;Unless you're building an "&lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/08/16/it-s-time-for-ioc-container-detente.aspx"&gt;extensible framework leveraging framework consumer selectable IoC containers&lt;/a&gt;", don't sweat it too much, the interface was NOT created for you!&lt;/p&gt; &lt;p&gt;Let me reiterate: adding a dependency on IServiceLocator to your classes is NOT a good idea. When you do so, instead of an explicit and self documenting dependency on an external object, you're tunneling this locator that now hides to the class consumers which are its true dependencies. This is BAD, as it requires users to go to your class documentation (and hope it's updated) rather than its constructor to see what it needs to operate. If you've done any kind of work extending VS you know how bad this can get.&lt;/p&gt; &lt;p&gt;I've seen comments that this is just a "purist" view and that the real world ain't like this and you still need it.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Somehow some people seem to think that we (those who have contributed some &lt;a href="http://mockframeworks.com/moq"&gt;open source framework&lt;/a&gt; of sorts) don't work on real projects and live in an ideal world and make frameworks for these ideal situations which don't actually translate to your real world. That we somehow just dream about the ideal conditions and spit a framework accordingly.&lt;/p&gt; &lt;p&gt;Oh that's so wrong ;). I wish it were that way sometimes, though, hehe.&lt;/p&gt; &lt;p&gt;I speak from experience in actual projects (working on two of them simultaneously these days, one of them fairly large), and let me repeat: &lt;strong&gt;YOU DON'T NEED A DEPENDENCY ON IServiceLocator&lt;/strong&gt; in your business objects.&lt;/p&gt; &lt;p&gt;What you might need is to change your DI framework of choice if it doesn't allow you to get rid of that dependency ;).&lt;br&gt;Let me elaborate on some of the situations that supposedly require so:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Named instances: just move the named instance requirement outside the bz class and into the container configuration:&lt;br&gt;&lt;pre&gt;builder.Register&amp;lt;IBar&amp;gt;(c =&amp;gt; new Bar(c.Resolve&amp;lt;IFoo&amp;gt;("a"))); &lt;/pre&gt;
&lt;li&gt;Need all instances of X: again, move the dependency out of your bz class and into configuration!&lt;br&gt;&lt;pre&gt;builder.Register&amp;lt;IBar&amp;gt;(c =&amp;gt; new Bar( /* get an IEnumerable&amp;lt;T&amp;gt; from container, or whatever */&amp;nbsp; )); &lt;/pre&gt;
&lt;li&gt;Need to create new instances of components inside your bz class (that is, you need a factory?): register a Func&amp;lt;T&amp;gt; factory for your component!&lt;br&gt;&lt;pre&gt;builder.RegisterGeneratedFactory&amp;lt;Func&amp;lt;IBar&amp;gt;&amp;gt;();

ctor Foo(Func&amp;lt;IBar&amp;gt; barFactory);

// Foo needs a new bar?&lt;br&gt;var b = barFactory();&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;br&gt;If you can come up with a real world scenario (which does NOT involve authoring a framework such as ASP.NET MVC, MonoRail, etc.) where a good DI container cannot save you from having that dependency, only then I'll believe you need IServiceLocator. &lt;/p&gt;
&lt;p&gt;I'd argue that people that should care/use such a thing is even less than 1%. That's why I wouldn't go about publicizing this thing so much, and you should hardly care about it. I can see it applied by (non-DI) framework authors to enable different DI frameworks to be plugged-in, but I hardly see how anyone doing "real world" work would benefit rather than detriment from its use.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There you have my rant too :)&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=99008" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=99008</wfw:commentRss></entry><entry><title>Developing orientation and resolution aware Windows Mobile applications just got a TON easier</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/09/03/DevelopingorientationandresolutionawareWindowsMobileapplicationsjustgotaTONeasier.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:81848</id><created>2008-09-03T08:40:10Z</created><content type="text/html" mode="escaped">&lt;p&gt;Quite some time ago I posted about how we (&lt;a href="http://clariusconsulting.net"&gt;Clarius Consulting&lt;/a&gt; with &lt;a href="http://msdn.microsoft.com/practices"&gt;Microsoft Patterns &amp;amp; Practices&lt;/a&gt;) &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2006/05/09/OrientationAwareIntroduction.aspx"&gt;solved the multiple resolution/orientation problem&lt;/a&gt; for Windows Mobile developers by introducing the &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2006/07/05/ZeroCodeAdaptiveUIs.aspx"&gt;Orientation Aware Control&lt;/a&gt; (OAC) as part of the &lt;a href="http://msdn.microsoft.com/mobileclientfactory"&gt;Mobile Client Software Factory&lt;/a&gt;. As any 6-month project, there were a number of features that had to be left out because of time constraints. Also, being two years old also shows: that version does not support smartphone project types, neither Windows Mobile 6, nor VS2008, etc. A few bugs were also discovered after being released.&lt;/p&gt; &lt;p&gt;So we took the original version, and improved it substantially, adding highly requested features and keeping it up to date with the new platforms. Just take a look at the &lt;a href="http://orientationaware.net/features.html"&gt;features and a comparison with the original p&amp;amp;p OAC&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;You can now design your mobile applications that support multiple languages, resolutions and orientations in VS2008, and take advantage of the insanely cool VS integration the OAC provides:&lt;/p&gt; &lt;p&gt;&lt;a title="Multiple Screen Designs for a Single Control" href="http://amz.orientationaware.net/img/features/ftr-03_ZOOM.gif"&gt;&lt;img src="http://amz.orientationaware.net/img/features/ftr-03.gif"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;img src="http://amz.orientationaware.net/img/videos/scr-01.gif"&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;Last weekend the OAC reached another important milestone with its 2008 RTM version! Just go and look at the &lt;a href="http://www.orientationaware.net/videos.html"&gt;screenshots and videos&lt;/a&gt; to see it in action. I'm quite proud of this particular project, as it involved quite a bit of spelunking with VS designer infrastructure, design-time location internals, run-time location behavior, etc. &lt;/p&gt; &lt;p&gt;My friend and OAC Lead &lt;a href="http://www.mobilepractices.com/"&gt;Joe&lt;/a&gt; has blogged more about &lt;a href="http://www.mobilepractices.com/2008/09/orientation-aware-control-2008-released.html"&gt;the release and why it's important to you&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=81848" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=81848</wfw:commentRss></entry><entry><title>Weirdest SQL Server 2005 installation on a Vista x64 machine</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/08/25/WeirdestSQLServer2005installationonaVistax64machine.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:81438</id><created>2008-08-25T12:35:24Z</created><content type="text/html" mode="escaped">&lt;p&gt;While attempting to install SQL Server x64 I got a number of errors, so I ended up uninstalling all components I could find in the control panel, and reinstalling x32. &lt;/p&gt; &lt;p&gt;Now it was time for SP2, I ended having to download BOTH x64 and x32 versions as half my components are in each platform :S. Miraculously enough, it works just fine.&lt;/p&gt; &lt;p&gt;Here's what I ended with:&lt;/p&gt; &lt;p&gt;Database Services x32&lt;br&gt;SQL Server Native Client x64&lt;br&gt;Client Components x32&lt;br&gt;Backward Compatibility x64&lt;br&gt;Microsoft SQL Server VSS Writer x64 &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I installed first the x64 SP2, and then x32, and everything went smooth (aside from the 2x download size).&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=81438" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=81438</wfw:commentRss></entry><entry><title>How to get ASP.NET MVC Preview 4 to run with .NET SP1</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/08/24/81380.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:81380</id><created>2008-08-24T09:03:24Z</created><content type="text/html" mode="escaped">&lt;p&gt;As you probably know by now (i.e. from &lt;a title="ASP.NET MVC Is Not Part of ASP.NET 3.5 SP1" href="http://haacked.com/archive/2008/08/14/aspnetmvc-not-in-sp1.aspx"&gt;Phill's blog&lt;/a&gt;), however both &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.routing.aspx"&gt;Routing&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase.aspx"&gt;Abstractions&lt;/a&gt; are. &lt;a href="http://www.asp.net/mvc/"&gt;MVC Preview 4&lt;/a&gt;, however, has its own version of both assemblies.&lt;/p&gt; &lt;p&gt;In order to get MVC to use the new RTM bits of both assemblies (and avoid weird side-by-side errors), you just need to add the following binding redirect to the web.config file:&lt;/p&gt;&lt;pre class="code"&gt;    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;runtime&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;assemblyBinding &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;urn:schemas-microsoft-com:asm.v1&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;assemblyIdentity &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;System.Web.Abstractions&lt;/span&gt;" &lt;span style="color: red"&gt;publicKeyToken&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;31bf3856ad364e35&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;bindingRedirect &lt;/span&gt;&lt;span style="color: red"&gt;oldVersion&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;0.0.0.0&lt;/span&gt;" &lt;span style="color: red"&gt;newVersion&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;3.5.0.0&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;assemblyIdentity &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;System.Web.Routing&lt;/span&gt;" &lt;span style="color: red"&gt;publicKeyToken&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;31bf3856ad364e35&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;bindingRedirect &lt;/span&gt;&lt;span style="color: red"&gt;oldVersion&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;0.0.0.0&lt;/span&gt;" &lt;span style="color: red"&gt;newVersion&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;3.5.0.0&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;assemblyIdentity &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;System.Web.Extensions&lt;/span&gt;" &lt;span style="color: red"&gt;publicKeyToken&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;31bf3856ad364e35&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;bindingRedirect &lt;/span&gt;&lt;span style="color: red"&gt;oldVersion&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;1.0.0.0-1.1.0.0&lt;/span&gt;" &lt;span style="color: red"&gt;newVersion&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;3.5.0.0&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;assemblyIdentity &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;System.Web.Extensions.Design&lt;/span&gt;" &lt;span style="color: red"&gt;publicKeyToken&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;31bf3856ad364e35&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;bindingRedirect &lt;/span&gt;&lt;span style="color: red"&gt;oldVersion&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;1.0.0.0-1.1.0.0&lt;/span&gt;" &lt;span style="color: red"&gt;newVersion&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;3.5.0.0&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;assemblyBinding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;runtime&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The other two redirects are added automatically by a Dynamic Data website, so I figured out it's better to put them there too :)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=81380" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=81380</wfw:commentRss></entry><entry><title>How to diagnose Linq to SQL easily and production-ready</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/08/22/81319.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:81319</id><created>2008-08-22T16:08:05Z</created><content type="text/html" mode="escaped">&lt;p&gt;Here's what we're currently doing: we add an InitializeContext method to all DataContext-derived classes, which is called from all ctors:&lt;/p&gt;&lt;pre class="code"&gt;    &lt;span style="color: blue"&gt;private void &lt;/span&gt;InitializeContext()
    {
&lt;span style="color: blue"&gt;#if &lt;/span&gt;DEBUG
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Debugger&lt;/span&gt;.IsAttached)
        {
            &lt;span style="color: blue"&gt;this&lt;/span&gt;.Log = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DebuggerTextWriter&lt;/span&gt;();
        }
&lt;span style="color: blue"&gt;#endif
    &lt;/span&gt;}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Note that the logger will only be set if a debugger is attached, so that it doesn't pollute the output on a console app while you're running it. &lt;/p&gt;
&lt;p&gt;The DebuggerTextWriter is trivial too:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;#if &lt;/span&gt;DEBUG
    &lt;span style="color: blue"&gt;internal class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DebuggerTextWriter &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;TextWriter
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public override void &lt;/span&gt;Write(&lt;span style="color: blue"&gt;string &lt;/span&gt;value)
        {
            &lt;span style="color: #2b91af"&gt;Debugger&lt;/span&gt;.Log(0, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;, value);
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(value);
        }

        &lt;span style="color: blue"&gt;public override void &lt;/span&gt;WriteLine(&lt;span style="color: blue"&gt;string &lt;/span&gt;value)
        {
            &lt;span style="color: #2b91af"&gt;Debugger&lt;/span&gt;.Log(0, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;, value + &lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.NewLine);
            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(value);
        }

        &lt;span style="color: blue"&gt;public override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Encoding &lt;/span&gt;Encoding
        {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;System.Text.&lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;.UTF8; }
        }
    }
&lt;span style="color: blue"&gt;#endif
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In both cases I'm wrapping the code in &lt;span style="color: blue"&gt;#if &lt;/span&gt;DEBUG so that it doesn't even go to production code. The debugger writer will write to the console output as well as the VS debugger output window.&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=81319" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=81319</wfw:commentRss></entry><entry><title>Does CUIL search engine really work?</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/08/02/79701.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:79701</id><created>2008-08-02T05:55:28Z</created><content type="text/html" mode="escaped">&lt;p&gt;Query: "how to replace ipod touch boot screen"&lt;br&gt;Cuil: 1 result, completely unrelated to what I'm looking for&lt;br&gt;Google: 140k results, including the one I was looking for in the first 10&lt;br&gt;MS Live: 423k results, the actual answer nowhere to be found in the first 40 results (so, for practical purposes I guess it's the same as Cuil useless result too :))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Query: "how to locate active item in solution explorer vs"&lt;br&gt;Cuil: 0 results&lt;br&gt;Google: 2M+ results, VERY relevant to the search&lt;br&gt;MS Live: 177k results, first couple links VERY relevant, following ones somewhat related&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Maybe it's because they are geeky questions, but for me, Google is still king, and all the fuss about the &lt;a href="http://www.cuil.com"&gt;"the world's biggest search engine"&lt;/a&gt; is totally bogus.&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=79701" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=79701</wfw:commentRss></entry><entry><title>Donut Oriented Programming</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/07/24/DonutOrientedProgramming.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:79265</id><created>2008-07-24T20:17:52Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;strong&gt;Donut Oriented Programming&lt;/strong&gt;: DOP is a required discipline that you need to adhere to when your app will use VERY slow internet connection, such as in Cambodia and some other developing countries. Every action on the application that requires a roundrip to a server on the internet, should result in a donut being displayed to indicate that something is going on.&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=79265" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=79265</wfw:commentRss></entry><entry><title>The need for nullable reference types to advertise optional constructor dependencies</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/07/18/Theneedfornullablereferencetypestoadvertiseoptionalconstructordependencies.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:78620</id><created>2008-07-18T02:42:44Z</created><content type="text/html" mode="escaped">&lt;p&gt;In "traditional" OOP, you advertise your class required dependencies via constructor arguments:&lt;/p&gt;&lt;pre&gt;public Foo(IOutput output, ILogger logger, ...)&lt;/pre&gt;
&lt;p&gt;Typically, the first few lines of code will check that these dependencies are not null. &lt;/p&gt;
&lt;p&gt;Optional dependencies may be provided as properties, which you can leave unset (null). &lt;/p&gt;
&lt;p&gt;Internally, in order to avoid a multitude of conditionals checking for nulls, you might have your own &lt;a href="http://en.wikipedia.org/wiki/Null_Object_pattern"&gt;"null" implementations&lt;/a&gt; of the dependencies' interfaces (i.e. NullLogger which does nothing). This way the code is more readable, and you can always assume the dependencies are non-null and you'll never get a NullReferenceException ;)&lt;/p&gt;
&lt;p&gt;One problem with property dependency injection is that you can't readily tell which properties are dependencies, and with constructor arguments, you cannot specify which ones are optional (can be passed null OK). &lt;/p&gt;
&lt;p&gt;I think a much more consistent approach, and one that would integrate very well with the &lt;a href="http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx"&gt;nullable value types&lt;/a&gt; functionality in .NET, is to introduce the concept of a nullable reference type:&lt;/p&gt;&lt;pre&gt;public Foo(IOutput output, ILogger? logger, ...)&lt;/pre&gt;
&lt;p&gt;What this tells the caller, is that the first argument is a required dependency, while the second can be null. I believe the .NET framework should go one step further and give the implementer a null implementation of the interface or abstract class if the argument is null. This way, you get rid of all nulls in your apps.&lt;/p&gt;
&lt;p&gt;You can also avoid depending on properties to advertise optional dependencies (and an associated custom attribute such as &lt;a href="http://blogs.msdn.com/kcwalina/archive/2008/04/25/MEF.aspx"&gt;MEF&lt;/a&gt; in order to indicate it's a dependency and not a regular property).&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=78620" width="1" height="1"&gt;</content><slash:comments>2</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=78620</wfw:commentRss></entry><entry><title>Do you really care about Stub vs Mock?</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/07/05/77747.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:77747</id><created>2008-07-05T11:49:48Z</created><content type="text/html" mode="escaped">&lt;p&gt;I've argued in the past that this &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2007/12/27/48594.aspx"&gt;theoretical discussion is utterly useless&lt;/a&gt;. In my experience you need slightly different things from your &lt;a href="http://www.martinfowler.com/bliki/TestDouble.html"&gt;test doubles&lt;/a&gt; at different times and depending on the scenarios and what you care about testing in a particular test. &lt;/p&gt; &lt;p&gt;If you're not using any mock/stub framework, you're typically creating manual test aids that morph (so that you can reuse them) as your tests evolve, and end up encompassing a mixture of a fake (i.e. you might put in an in-memory implementation), a stub (flags to tell you whether given members were called) and a mock (you might provide delegates to execute when members are executed, so that you can throw/callback/whatever). I've done this countless times before jumping to a framework/library to help me with this, and I know this is the &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2007/12/21/47152.aspx"&gt;continuum most developers live in&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Yet, we still see discussions like &lt;a href="http://www.ayende.com/Blog/archive/2008/06/29/Rhino-Mocks-3.5-Design-Decisions-The-role-of-Stub-vs.aspx"&gt;Rhino Mocks 3.5 Design Decisions: The role of Stub vs. Mock&lt;/a&gt;, were the user is asked to make a choice that he will seldom understand without reading the theoretical background. This is counter-productive IMO.&lt;/p&gt; &lt;p&gt;Compare the original two versions with &lt;a href="http://www.mockframeworks.com/moq"&gt;Moq&lt;/a&gt;'s version:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;When_user_forgot_password_should_save_user()
{
    &lt;span style="color: blue"&gt;var &lt;/span&gt;userRepository = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IUserRepository&lt;/span&gt;&amp;gt;();
    &lt;span style="color: blue"&gt;var &lt;/span&gt;smsSender = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ISmsSender&lt;/span&gt;&amp;gt;();

    &lt;span style="color: blue"&gt;var &lt;/span&gt;theUser = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;User &lt;/span&gt;{ HashedPassword = &lt;span style="color: #a31515"&gt;"this is not hashed password" &lt;/span&gt;};

    userRepository.Expect(x =&amp;gt; x.GetUserByName(&lt;span style="color: #a31515"&gt;"ayende"&lt;/span&gt;)).Returns(theUser);

    &lt;span style="color: blue"&gt;var &lt;/span&gt;controllerUnderTest = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;LoginController&lt;/span&gt;(userRepository.Object, smsSender.Object);

    controllerUnderTest.ForgotMyPassword(&lt;span style="color: #a31515"&gt;"ayende"&lt;/span&gt;);

    userRepository.Verify(x =&amp;gt; x.Save(theUser));
}
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;As you see, the way you use the "mock" is what makes it look more like a stub or a "true" mock (i.e. you verify all expectations, and you create it with &lt;a href="http://www.clariusconsulting.net/labs/moq/html/90760C57.htm"&gt;MockBehavior.Strict&lt;/a&gt;). You don't have to pick a Stub vs Mock.&lt;/p&gt;
&lt;p&gt;This simplifies the learning curve on the framework, and basically allows you to set intuitive options that don't force you entirely in one way or the other (the combination of Expect...Verifiable...Verify allows for VERY flexible usage).&lt;/p&gt;
&lt;p&gt;I hope just like everyone's now seeing the value of NOT having an explicit record-reply model, we'll move past this rigid theoretical frame and into a more pragmatic and flexible view of mocking in general.&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=77747" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=77747</wfw:commentRss></entry><entry><title>Mocking protected members with Moq</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/07/05/MockingprotectedmemberswithMoq.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:77737</id><created>2008-07-05T10:09:15Z</created><content type="text/html" mode="escaped">&lt;p&gt;If you're familiar with &lt;a href="http://www.mockframeworks.com/moq"&gt;Moq&lt;/a&gt;, you know that it relies on lambda expressions heavily. This is very good as you get full support from intellisense and refactoring features in Visual Studio. However, it also means you're for the most part restricted to setting expectations on things that your code has access too (public or internal members). &lt;/p&gt; &lt;p&gt;This is especially annoying with protected members, which are very common in template method pattern, factory methods, etc. In this case, you can't simply set an expectation with a lambda expression, as you have no access from the "outside" to the protected member. Being an important scenario, though, we wanted to add support for it.&lt;/p&gt; &lt;p&gt;We could have just extend the core Mock&amp;lt;T&amp;gt; API and add loosely-typed members that received strings (i.e. &lt;code&gt;mock.Expect("Foo")&lt;/code&gt;). This would have been bad from the guidance point of view, as it would make for an easy path to "hell" for people not familiar with lambda expression ("mmm... I could use this overload with that lambda thinghy, or just use the simpler string-based overload..."). We'd much rather keep people using strong-typed, lambda-based expectations rather than jumping at the ease of strings.&lt;/p&gt; &lt;p&gt;So, we reached a compromise: we implemented protected expectations using strings, but it will only work for non-public members :). We also didn't want to make this functionality too easy to discover, so we expose it as an extension method that you enable by importing the &lt;code&gt;Moq.Protected&lt;/code&gt; namespace:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;Moq.Protected;&lt;/pre&gt;
&lt;p&gt;then you use the &lt;code&gt;Protected&lt;/code&gt; "extension point":&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;mock = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;CommandBase&lt;/span&gt;&amp;gt;();
mock.Protected()
     .Expect&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;"Execute"&lt;/span&gt;)
     .Returns(5);
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;Expect&lt;/code&gt; overload receiving a type parameter specifies the return value from the invocation. You also have &lt;code&gt;ExpectGet/Set&lt;/code&gt; members, which expose the same functionality of the strong-typed lambda versions.&lt;/p&gt;
&lt;p&gt;Note how rather than polluting the main API with extension overloads receiving strings, we hang all members from the &lt;code&gt;IProtectedMock&lt;/code&gt; returned from the &lt;code&gt;Protected()&lt;/code&gt; method call. That's an interesting use of extension methods I think, which you also get to see quite a lot in newer C# 3.5 libraries such as &lt;a href="http://autofac.googlecode.com/"&gt;Autofac&lt;/a&gt; and &lt;a href="http://www.codeplex.com/umbrella"&gt;Umbrella&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Another difference in the invocation style for expectations is the argument matching. Here, I couldn't find an easier way to specify then than using a separate class, &lt;a href="http://www.clariusconsulting.net/labs/moq/html/169D5A34.htm"&gt;ItExpr&lt;/a&gt; to specify them:&lt;/p&gt;&lt;pre class="code"&gt;mock.Protected()
    .Expect&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;"Execute"&lt;/span&gt;,
        &lt;span style="color: #2b91af"&gt;ItExpr&lt;/span&gt;.IsAny&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;())
    .Returns(&lt;span style="color: blue"&gt;true&lt;/span&gt;);
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The need for this is subtle, and lies in the fact that the Expect method is not receiving a lambda expression, unlike the strong-typed version, and the alternatives were far worse. So basically &lt;a href="http://www.clariusconsulting.net/labs/moq/html/169D5A34.htm"&gt;ItExpr&lt;/a&gt; is an expression-returning version of the &lt;a href="http://www.clariusconsulting.net/labs/moq/html/FBE0FFA5.htm"&gt;It&lt;/a&gt; class. I still haven't figured out how you would use custom matchers in this scenario. I guess it would involve building the expression trees just like we do to reconstruct the same expression that would result from using the matcher in the lambda Expect.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you want to play with it, just go ahead and get the &lt;a href="http://code.google.com/p/moq/downloads/list"&gt;latest version from Google Code&lt;/a&gt;. 
&lt;p&gt;Don't forget to give us feedback through the &lt;a href="http://groups.google.com/group/moqdisc/"&gt;discussion list&lt;/a&gt; or &lt;a href="http://code.google.com/p/moq/issues/list"&gt;issue tracker&lt;/a&gt;.
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=77737" width="1" height="1"&gt;</content><slash:comments>2</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=77737</wfw:commentRss></entry><entry><title>Moq 2.5 shipped: lots of good news!</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/07/04/77643.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:77643</id><created>2008-07-04T19:10:52Z</created><content type="text/html" mode="escaped">&lt;p&gt;Today we shipped Moq v2.5. It's been a while since RC1 (a month or so feels&amp;nbsp; so long for an open source agile project!) and we god very good feedback and suggestions for the final release. I'm pretty happy with the current drop and felt it was time for a new stable release. &lt;/p&gt; &lt;p&gt;The change log is quite extensive and yet there are quite a few fixes and improvements here and there that are not reflected in it. Over the next few posts I'll be showcasing the various new features. For now, here's the log:&lt;/p&gt; &lt;p&gt;Version 2.5&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Added support for mocking protected members  &lt;li&gt;Added new way of extending argument matchers which is now very straightforward  &lt;li&gt;Added support for mocking events  &lt;li&gt;Added support for firing events from expectations  &lt;li&gt;Removed usage of MBROs which caused inconsistencies in mocking features  &lt;li&gt;Added ExpectGet and ExpectSet to better support properties, and provide better intellisense.  &lt;li&gt;Added verification with expressions, which better supports Arrange-Act-Assert testing model (can do Verify(m =&amp;gt; m.Do(...)))  &lt;li&gt;Added Throws&amp;lt;TException&amp;gt;  &lt;li&gt;Added mock.CallBase property to specify whether the virtual members base implementation should be called  &lt;li&gt;Added support for implementing, setting expectations and verifying additional interfaces in the mock, via the new mock.As&amp;lt;TInterface&amp;gt;() method (thanks Fernando Simonazzi!)  &lt;li&gt;Improved argument type matching for Is/IsAny&amp;nbsp; (thanks Jeremy.Skinner!)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;My personal favorites: streamlined custom matchers (you can completely replace the built-in It.IsXXX matchers), mocking events and adding interfaces to a mock (I'll expand on those soon).&lt;/p&gt; &lt;p&gt;Go ahead and get the &lt;a href="http://code.google.com/p/moq/downloads/list"&gt;latest version from Google Code&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;As usual, we'd love to hear your feedback at the &lt;a href="http://groups.google.com/group/moqdisc/"&gt;discussion list&lt;/a&gt; or &lt;a href="http://code.google.com/p/moq/issues/list"&gt;issue tracker&lt;/a&gt;, and patches are always welcome :)&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=77643" width="1" height="1"&gt;</content><slash:comments>2</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=77643</wfw:commentRss></entry><entry><title>Cool ajax loader image generator</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/07/03/Coolajaxloaderimagegenerator.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:77392</id><created>2008-07-03T10:58:13Z</created><content type="text/html" mode="escaped">&lt;p&gt;Just found (via &lt;a href="http://weblogs.manas.com.ar/bcardiff/"&gt;Brian&lt;/a&gt;) about this cool site to &lt;a href="http://www.ajaxload.info/"&gt;generate ajax-like loading donnuts&lt;/a&gt; like this one:&lt;/p&gt; &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="ajax-loader" src="http://www.clariusconsulting.net/images/blogs/kzu/Coolajaxloaderimagegenerator_D293/ajaxloader.gif"&gt;&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=77392" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=77392</wfw:commentRss></entry><entry><title>June 18-2008 can be a great day for the Web</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/06/17/74687.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:74687</id><created>2008-06-17T20:54:59Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;a href="http://www.spreadfirefox.com/en-US/worldrecord/"&gt;And you can be part of it&lt;/a&gt;. The latest and greatest browser ever can make history and &lt;a href="http://www.spreadfirefox.com/en-US/worldrecord/"&gt;you can help&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=74687" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=74687</wfw:commentRss></entry><entry><title>VS2008 SP1 Beta: DON'T install without first backing up your settings!</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/06/05/73321.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:73321</id><created>2008-06-05T07:21:13Z</created><content type="text/html" mode="escaped">&lt;p&gt;I lost them all in the process :((((&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=73321" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=73321</wfw:commentRss></entry><entry><title>Mesh synchronization of KML files through FeedSync</title><link rel="alternate" type="text/html" href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/05/28/MeshsynchronizationofKMLfilesthroughFeedSync.aspx" /><id>e6de741d-39cb-46fc-b8ae-6ce6880bcef9:70812</id><created>2008-05-28T14:14:23Z</created><content type="text/html" mode="escaped">
		&lt;p&gt;We've been working for the past few days on a &lt;a href="http://mesh4x.org"&gt;mesh4x&lt;/a&gt; adapter that can synchronize a potentially big KML file at a very granular level (styles, placemarks, folders, etc.) so that you can collaboratively edit these large files without having to resolve spurious "conflicts".&lt;/p&gt;
		&lt;p&gt;From &lt;a href="http://edjez.instedd.org/2008/05/build-maps-collaboratively-with-new.html"&gt;Ed's blog post&lt;/a&gt;: &lt;/p&gt;
		&lt;blockquote&gt;
				&lt;p&gt;This could be synchronized peer-to-peer (a KML on your disk to a KML on a USB drive or someone else's box) as well as via a 'cloud' web service. Note this is changing the data inside the KML, it is &lt;strong&gt;not just 'file sharing'&lt;/strong&gt;. The adapter knows about KML and keeps track of versions of fine-grained elements (pushpins, placemarks, polygons) inside the same file. It is an example of how a data mesh could be used to synchronize fine-grained data between applications.&lt;/p&gt;
		&lt;/blockquote&gt;
		&lt;p&gt;
				&lt;b&gt;Update&lt;/b&gt;: Read more &lt;a href="http://feeds.feedburner.com/%7Er/edjez/%7E3/297090861/improvements-to-mesh4x-kml-adapter.html"&gt;about the latest version&lt;/a&gt; (including single-file storage, KMZ support, etc.).&lt;br /&gt;&lt;/p&gt;
		&lt;p&gt;I believe this is one of the first instances of a mesh-style synchronization that really proves the point and possibilities of &lt;a href="http://feedsync.org"&gt;FeedSync&lt;/a&gt; and also &lt;a href="http://mesh.com"&gt;Live Mesh&lt;/a&gt;. Something that &lt;a href="http://www.joelonsoftware.com/items/2008/05/01.html"&gt;Joel Spolsky clearly didn't get&lt;/a&gt;.&lt;/p&gt;
		&lt;p&gt;This technology is going to change the way we think about applications, data ownership and sharing. It's actually a pity that some people is focusing on the one *&lt;strong&gt;sample&lt;/strong&gt;* application that Microsoft is showing (file/folder sharing) to evaluate it.&lt;/p&gt;&lt;img src="http://www.clariusconsulting.net/aggbug.aspx?PostID=70812" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://www.clariusconsulting.net/blogs/kzu/commentrss.aspx?PostID=70812</wfw:commentRss></entry></feed>