<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://bloggingabout.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Erwyn van der Meer</title><subtitle type="html"> </subtitle><id>http://bloggingabout.net/blogs/erwyn/atom.aspx</id><link rel="alternate" type="text/html" href="http://bloggingabout.net/blogs/erwyn/default.aspx" /><link rel="self" type="application/atom+xml" href="http://bloggingabout.net/blogs/erwyn/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.40407.4157">Community Server</generator><updated>2009-05-05T22:33:00Z</updated><entry><title>Trace and TraceSource in the Windows Azure DevFabric UI</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2010/04/22/trace-and-tracesource-in-the-windows-azure-devfabric-ui.aspx" /><id>/blogs/erwyn/archive/2010/04/22/trace-and-tracesource-in-the-windows-azure-devfabric-ui.aspx</id><published>2010-04-22T13:23:00Z</published><updated>2010-04-22T13:23:00Z</updated><content type="html">&lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Windows Azure" border="0" alt="Windows Azure" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/2728.WindowsAzure_5F00_3D9EA2A4.png" width="240" height="43" /&gt; &lt;/p&gt;  &lt;p&gt;The Windows Azure Platform has a rich diagnostics infrastructure to enable logging and performance monitoring in the cloud.&lt;/p&gt;  &lt;p&gt;When you run a cloud app locally in the DevFabric you can view diagnostics trace output in the console window that is part of the DevFabric UI. For example, say I have the line&lt;/p&gt;  &lt;pre class="code"&gt;System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.TraceInformation(&lt;span style="color:#a31515;"&gt;&amp;quot;Old Trace called at {0}.&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;That line gives a result like this in the DevFabric UI:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/3782.image_5F00_562E3FF4.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Screenshot of DevFabric UI" border="0" alt="Screenshot of DevFabric UI" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/4718.image_5F00_thumb_5F00_2EF3F6BF.png" width="861" height="583" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;If you can’t see the DevFabric UI, you can enable it here after starting your cloud app from Visual Studio:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/7416.image_5F00_0ED8EA02.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/5732.image_5F00_thumb_5F00_40D08A8C.png" width="421" height="265" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Using the DevFabric UI is the most basic form of viewing Trace output. Looking at each individual console window doesn’t really scale well if you have many instances and, furthermore, the console window of an instance is not available in the cloud. For this, there is a special TraceListener derived class: &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.diagnostics.diagnosticmonitortracelistener.aspx" target="_blank"&gt;&lt;font face="Courier New"&gt;Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener&lt;/font&gt;&lt;/a&gt;. It sends the trace output to a Windows Azure diagnostics monitor process that is able to store the messages in Windows Azure Storage. Here is a look at a trace message using the &lt;a href="http://azurestorageexplorer.codeplex.com/" target="_blank"&gt;Azure Storage Explorer&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/1541.image_5F00_35A70042.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Screenshot of Azure Storage Explorer" border="0" alt="Screenshot of Azure Storage Explorer" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/0638.image_5F00_thumb_5F00_009A7112.png" width="985" height="535" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;This trace listener is enabled through web.config:&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;system.diagnostics&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;sources&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;source &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Diag&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;listeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;AzureDiagnostics&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;listeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;source&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;sources&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;sharedListeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add &lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&lt;/span&gt;&amp;quot;
          &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;AzureDiagnostics&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;sharedListeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;trace&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;listeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;AzureDiagnostics&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;listeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;trace&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.diagnostics&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;You can also see a message “TraceSource called at …”. This message was output using a TraceSource instance:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private static readonly &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TraceSource &lt;/span&gt;ts = new System.Diagnostics.&lt;span style="color:#2b91af;"&gt;TraceSource&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Diag&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;SourceLevels&lt;/span&gt;.All);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;protected void &lt;/span&gt;TraceMeButton_Click(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
{
    ts.TraceEvent(&lt;span style="color:#2b91af;"&gt;TraceEventType&lt;/span&gt;.Information, 2, &lt;span style="color:#a31515;"&gt;&amp;quot;TraceSource called at {0}.&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now);
    System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.TraceInformation(&lt;span style="color:#a31515;"&gt;&amp;quot;Old Trace called at {0}.&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now);
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;However, note that a similar message “TraceSource called at …” didn’t show up in the DevFabric UI. You might wonder what is going on. And you might wonder why I want to use a TraceSource instead of Trace? Because &lt;a href="http://msdn.microsoft.com/en-us/library/ms228993(VS.80).aspx" target="_blank"&gt;this MSDN article states&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;One of the new features in the .NET Framework version 2.0 is an enhanced tracing system. The basic premise is unchanged: tracing messages are sent through switches to listeners, which report the data to an associated output medium. A primary difference for version 2.0 is that traces can be initiated through instances of the &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource(VS.80).aspx"&gt;TraceSource&lt;/a&gt; class. &lt;b&gt;TraceSource&lt;/b&gt; is intended to function as an enhanced tracing system and can be used in place of the static methods of the older &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.trace(VS.80).aspx"&gt;Trace&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.debug(VS.80).aspx"&gt;Debug&lt;/a&gt; tracing classes. The familiar &lt;b&gt;Trace&lt;/b&gt; and &lt;b&gt;Debug&lt;/b&gt; classes still exist, but the recommended practice is to use the &lt;b&gt;TraceSource&lt;/b&gt; class for tracing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also check out &lt;a href="http://blogs.msdn.com/bclteam/archive/2005/03/15/396431.aspx" target="_blank"&gt;this blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The reason you don’t see the message for the TraceSource in the DevFabric UI is that the DevFabric magically adds a special TraceListener for the “old fashioned” Trace class, but not for your TraceSource instance. I put together a &lt;a title="Download the Visual Studio solution" href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.attachments/0741.DiagnosticsService.zip"&gt;cloud app solution&lt;/a&gt; (Visual Studio 2010) that shows this through a simple web role. This web role has the configuration you see above in its web.config file. If you run this simple web role in the DevFabric you’ll see:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/8272.image_5F00_27688752.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Screenshot of sample web role app" border="0" alt="Screenshot of sample web role app" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/7651.image_5F00_thumb_5F00_7C23F04A.png" width="755" height="488" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Note that Trace has a &lt;font face="Courier New"&gt;Microsoft.ServiceHosting.Tools.DevelopmentFabric.Runtime.DevelopmentFabricTraceListener&lt;/font&gt; instance registered, while the TraceSource hasn’t. To remedy this, I’ve created a small class that adds a DevFabricTraceListener to a TraceSource if it is registered for Trace:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TraceSourceFixer
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;private const string &lt;/span&gt;DevFabricTraceListenerFullName = &lt;span style="color:#a31515;"&gt;&amp;quot;Microsoft.ServiceHosting.Tools.DevelopmentFabric.Runtime.DevelopmentFabricTraceListener&amp;quot;&lt;/span&gt;;

    &lt;span style="color:blue;"&gt;public static void &lt;/span&gt;AddDevFabricTraceListener(&lt;span style="color:#2b91af;"&gt;TraceSource &lt;/span&gt;traceSource)
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;alreadyInTraceSource = GetDevFabricTraceListeners(traceSource.Listeners);

        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(alreadyInTraceSource.Count() &amp;gt; 0)
            &lt;span style="color:blue;"&gt;return&lt;/span&gt;;

        &lt;span style="color:blue;"&gt;var &lt;/span&gt;alreadyInTrace = GetDevFabricTraceListeners(&lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.Listeners);

        &lt;span style="color:blue;"&gt;var &lt;/span&gt;devFabricTraceListener = alreadyInTrace.FirstOrDefault();
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(devFabricTraceListener != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
        {
            traceSource.Listeners.Add(devFabricTraceListener);
        }
    }

    &lt;span style="color:blue;"&gt;private static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;TraceListener&lt;/span&gt;&amp;gt; GetDevFabricTraceListeners(&lt;span style="color:#2b91af;"&gt;TraceListenerCollection &lt;/span&gt;listeners)
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;result = &lt;span style="color:blue;"&gt;from &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TraceListener &lt;/span&gt;listener &lt;span style="color:blue;"&gt;in &lt;/span&gt;listeners.Cast&amp;lt;&lt;span style="color:#2b91af;"&gt;TraceListener&lt;/span&gt;&amp;gt;()
                &lt;span style="color:blue;"&gt;where &lt;/span&gt;IsDevFabricTraceListener(listener)
                &lt;span style="color:blue;"&gt;select &lt;/span&gt;listener;

        &lt;span style="color:blue;"&gt;return &lt;/span&gt;result;
    }

    &lt;span style="color:blue;"&gt;private static bool &lt;/span&gt;IsDevFabricTraceListener(&lt;span style="color:#2b91af;"&gt;TraceListener &lt;/span&gt;listener)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(listener.GetType().FullName == DevFabricTraceListenerFullName);
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;This helper class gets called when you press the &lt;em&gt;Register DevFabric Listener&lt;/em&gt; button. If you click the &lt;em&gt;Trace Me&lt;/em&gt; button after that, you’ll see two trace messages show up in the DevFabric UI:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/5707.image_5F00_4717611A.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Screenshot of DevFabric UI detail" border="0" alt="Screenshot of DevFabric UI detail" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/4503.image_5F00_thumb_5F00_0E008418.png" width="501" height="72" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;You can download my solution &lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.attachments/0741.DiagnosticsService.zip"&gt;DiagnosticsService.zip&lt;/a&gt; to try it yourself.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=483145" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term=".NET" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/.NET/default.aspx" /><category term="Work" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Work/default.aspx" /><category term="Windows Azure" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Windows+Azure/default.aspx" /><category term="Cloud Computing" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Cloud+Computing/default.aspx" /></entry><entry><title>SQL Server 2008 R2 RTM</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2010/04/22/sql-server-2008-r2-rtm.aspx" /><id>/blogs/erwyn/archive/2010/04/22/sql-server-2008-r2-rtm.aspx</id><published>2010-04-21T22:17:00Z</published><updated>2010-04-21T22:17:00Z</updated><content type="html">&lt;p&gt;Wow, April 2010 proves to be a jam-packed month of releases from Microsoft. A short list, that is bound to be incomplete:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;.NET Framework 4&lt;/li&gt;    &lt;li&gt;Visual Studio 2010&lt;/li&gt;    &lt;li&gt;Office 2010&lt;/li&gt;    &lt;li&gt;SharePoint 2010&lt;/li&gt;    &lt;li&gt;Data Protection Manager 2010&lt;/li&gt;    &lt;li&gt;System Center Essentials 2010&lt;/li&gt;    &lt;li&gt;Dynamics GP 2010&lt;/li&gt;    &lt;li&gt;Enterprise Library 5.0&lt;/li&gt;    &lt;li&gt;SQL Server 2008 R2&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.technet.com/www.sqlserverlaunch.com"&gt;&lt;img title="R2 Banner" border="0" alt="R2 Banner" src="http://blogs.technet.com/blogfiles/dataplatforminsider/WindowsLiveWriter/SQLServer2008R2ReleasedtoManufacturing_FF3F/R2%20Banner_3.png" width="517" height="136" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/R2Downloads.aspx" target="_blank"&gt;trial versions of SQL Server 2008 R2 are now available for download&lt;/a&gt;. Here are the highlights of what’s new in 2008 R2:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.powerpivot.com/"&gt;&lt;em&gt;PowerPivot&lt;/em&gt;&lt;/a&gt;&lt;em&gt;:&lt;/em&gt; a managed self-service analysis solution that empowers end users to access, analyze and share data across the enterprise in an IT managed environment using Excel 2010 and SharePoint Sever 2010. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/MDS.aspx"&gt;&lt;i&gt;Master Data Services&lt;/i&gt;&lt;/a&gt;&lt;i&gt;:&lt;/i&gt; helps IT organizations centrally manage critical data assets companywide and across diverse systems, and enables more people to securely manage master data directly, and ensure the integrity of information over time. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/R2-multi-server.aspx"&gt;&lt;i&gt;Application and Multi-server Management&lt;/i&gt;&lt;/a&gt;&lt;i&gt;: &lt;/i&gt;helps organizations proactively manage database environments efficiently at scale through centralized visibility into resource utilization and streamlined consolidation and upgrade initiatives across the application lifecycle. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://download.microsoft.com/download/7/F/D/7FDAA75C-1273-4DFE-8EC6-D9699C3EE47F/SQL_Server_2008_R2_Report_Builder_3_0FAQs.docx"&gt;&lt;i&gt;Report Builder 3.0&lt;/i&gt;&lt;/a&gt;&lt;i&gt;: &lt;/i&gt;report authoring component with support for geospatial visualization. This new release provides capabilities to further increase end user productivity with enhanced wizards, more powerful visualizations, and intuitive authoring. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/R2-complex-event.aspx"&gt;&lt;i&gt;StreamInsight&lt;/i&gt;&lt;/a&gt;&lt;i&gt;: &lt;/i&gt;a low latency complex event processing platform to help IT monitor, analyze and act on the data in motion to make more informed business decisions in near real-time.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;More details about the release can be found &lt;a href="http://blogs.technet.com/dataplatforminsider/archive/2010/04/21/sql-server-2008-r2-released-to-manufacturing.aspx" target="_blank"&gt;on the team blog&lt;/a&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=483143" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term="Work" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Work/default.aspx" /><category term="SQL Server" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/SQL+Server/default.aspx" /><category term="Microsoft" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Microsoft/default.aspx" /></entry><entry><title>Enterprise Library 5.0 Released</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2010/04/21/enterprise-library-5-0-released.aspx" /><id>/blogs/erwyn/archive/2010/04/21/enterprise-library-5-0-released.aspx</id><published>2010-04-21T09:22:00Z</published><updated>2010-04-21T09:22:00Z</updated><content type="html">&lt;p&gt;&lt;img src="http://blogs.msdn.com/blogfiles/agile/WindowsLiveWriter/MicrosoftEnterpriseLibrary5.0Released_ED89/image_2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The Microsoft Enterprise Library has always been one of the most popular things to come out of the patterns &amp;amp; practices team. Yesterday p&amp;amp;p reached a major milestone by releasing version 5.0 of EntLib.&lt;/p&gt;
&lt;p&gt;The improvements are too numerous to sum up here, but let me mention one: this release has full .NET 3.5 SP1 and .NET 4 compatibility and works great from both Visual Studio 2008 SP1 and Visual Studio 2010 RTM.&lt;/p&gt;
&lt;p&gt;Full details can be found in &lt;a target="_blank" href="http://blogs.msdn.com/agile/archive/2010/04/20/microsoft-enterprise-library-5-0-released.aspx"&gt;Grigori Melnik&amp;rsquo;s blog post on this release&lt;/a&gt;. Or you can go straight to the &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=bcb166f7-dd16-448b-a152-9845760d9b4c&amp;amp;displaylang=en"&gt;download page&lt;/a&gt; or &lt;a target="_blank" href="http://entlib.codeplex.com/releases/view/43135"&gt;the documentation&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=483140" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term=".NET" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/.NET/default.aspx" /><category term="Architecture and Design" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Architecture+and+Design/default.aspx" /><category term="Work" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Work/default.aspx" /><category term="Enterprise Library" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Enterprise+Library/default.aspx" /><category term="Microsoft" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Microsoft/default.aspx" /></entry><entry><title>Brad Abrams Leaves Microsoft</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2010/04/20/brad-abrams-leaves-microsoft.aspx" /><id>/blogs/erwyn/archive/2010/04/20/brad-abrams-leaves-microsoft.aspx</id><published>2010-04-20T19:46:00Z</published><updated>2010-04-20T19:46:00Z</updated><content type="html">&lt;p&gt;Long before I joined the company, &lt;a href="http://bradabrams.com/" target="_blank"&gt;Brad Abrams&lt;/a&gt; was one of the first people for me that put a human face on Microsoft.&lt;/p&gt;  &lt;p&gt;I felt sad when I just read his blog post that &lt;a href="http://blogs.msdn.com/brada/archive/2010/04/20/my-last-day-at-microsoft.aspx" target="_blank"&gt;Brad is leaving Microsoft&lt;/a&gt;. But at the same time I feel happy for all that he has accomplished for the company. Check his blog post for all that he has been involved in. Not on the list, but not less important in my mind, is the book &lt;a href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Libraries/dp/0321246756" target="_blank"&gt;Framework Design Guidelines&lt;/a&gt; that he co-authored.&lt;/p&gt;  &lt;p&gt;Brad, I wish you all the best in your next endeavors.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=483135" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term=".NET" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/.NET/default.aspx" /><category term="Personal" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Personal/default.aspx" /><category term="Microsoft" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Microsoft/default.aspx" /></entry><entry><title>Upcoming Support in Windows Azure for .NET Framework 4</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2010/04/07/upcoming-support-in-windows-azure-for-net-framework-4.aspx" /><id>/blogs/erwyn/archive/2010/04/07/upcoming-support-in-windows-azure-for-net-framework-4.aspx</id><published>2010-04-07T10:33:00Z</published><updated>2010-04-07T10:33:00Z</updated><content type="html">&lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title=".NET Framework" border="0" alt=".NET Framework" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/7510.NETFrmwrk_5F00_h_5F00_rgb_5F00_r_5F00_72357070.png" width="120" height="48" /&gt;in &lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/1440.WinAzure_5F00_h_5F00_rgb_5F00_638AC48B.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Windows Azure" border="0" alt="Windows Azure" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/1738.WinAzure_5F00_h_5F00_rgb_5F00_thumb_5F00_110BE44F.png" width="240" height="45" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;As you will probably know, Visual Studio 2010 and .NET Framework 4 will RTM on April 12, 2010 and will be available for download on &lt;a href="http://msdn.microsoft.com/subscriptions/downloads/default.aspx" target="_blank"&gt;MSDN Subscriptions Downloads&lt;/a&gt; the same day.&lt;/p&gt;  &lt;p&gt;The Windows Azure team is committed to making .NET Framework 4 available in &lt;a href="https://windows.azure.com/" target="_blank"&gt;Windows Azure&lt;/a&gt; within 90 days of the RTM date.&lt;/p&gt;  &lt;p&gt;A lesser known fact is that the latest available Windows Azure build already has a .NET 4 version installed, namely the RC bits. Although this version cannot be used to run applications on (because .NET 4 is not yet exposed in the Windows Azure dev tools), you can use this build to test if the presence of .NET 4 has impact on existing .NET 3.5 apps running on Windows Azure.&lt;/p&gt;  &lt;p&gt;Read the &lt;a href="http://blogs.msdn.com/windowsazure/archive/2010/04/07/upcoming-support-in-windows-azure-for-net-framework-4.aspx" target="_blank"&gt;official announcement here&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=483066" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term=".NET" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/.NET/default.aspx" /><category term="Work" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Work/default.aspx" /><category term="Microsoft" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Microsoft/default.aspx" /><category term="Windows Azure" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Windows+Azure/default.aspx" /><category term="Cloud Computing" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Cloud+Computing/default.aspx" /></entry><entry><title>How to fix MSDN Online View for Azure Documentation</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2010/04/06/how-to-fix-msdn-online-view-for-azure-documentation.aspx" /><id>/blogs/erwyn/archive/2010/04/06/how-to-fix-msdn-online-view-for-azure-documentation.aspx</id><published>2010-04-06T08:22:00Z</published><updated>2010-04-06T08:22:00Z</updated><content type="html">&lt;p&gt;[&lt;strong&gt;Updated 2010-04-25&lt;/strong&gt;: The lightweight view for MSDN has been fixed, so the content of this post is no longer relavant]&lt;br /&gt;[&lt;strong&gt;Updated 2010-04-07&lt;/strong&gt;: Updated one screenshot, because the lightweight view has changed]&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/"&gt;MSDN&lt;/a&gt; has recently switched the default online view mode to &amp;ldquo;lightweight view&amp;rdquo;. Although this dramatically improves loading times for the online docs, this currently breaks parts of the Windows Azure Documentation. For example, when you view &lt;a href="http://msdn.microsoft.com/en-us/library/ee393295(v=MSDN.10).aspx" title="http://msdn.microsoft.com/en-us/library/ee393295(v=MSDN.10).aspx"&gt;http://msdn.microsoft.com/en-us/library/ee393295(v=MSDN.10).aspx&lt;/a&gt; in lightweight mode, the namespaces are not hyperlinks and the menu is broken:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/7367.image_5F00_16E6C805.png"&gt;&lt;img height="360" width="634" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/0537.image_5F00_thumb_5F00_4152F922.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;To fix this, you have to click on the &amp;ldquo;Preferences&amp;rdquo; link in the upper right corner of the page:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/4276.image_5F00_59959A50.png"&gt;&lt;img height="104" width="318" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/8787.image_5F00_thumb_5F00_6048A3D3.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Choose &amp;ldquo;Classic&amp;rdquo; on the page that appears:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/6644.image_5F00_556C15AB.png"&gt;&lt;img height="221" width="884" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/4035.image_5F00_thumb_5F00_751AEF73.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Click OK, and you&amp;rsquo;ll get back to a view that actually works:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/5327.image_5F00_66DC7683.png"&gt;&lt;img height="250" width="410" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/0451.image_5F00_thumb_5F00_6D8F8006.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We are working on getting the &amp;ldquo;lightweight view&amp;rdquo; fixed with this part of the Azure documentation.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=483061" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term="Microsoft" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Microsoft/default.aspx" /><category term="Windows Azure" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Windows+Azure/default.aspx" /><category term="MSDN" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/MSDN/default.aspx" /></entry><entry><title>Visual Studio Performance Testing Quick Reference Guide</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2010/04/03/visual-studio-performance-testing-quick-reference-guide.aspx" /><id>/blogs/erwyn/archive/2010/04/03/visual-studio-performance-testing-quick-reference-guide.aspx</id><published>2010-04-03T12:21:00Z</published><updated>2010-04-03T12:21:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/7506.VS2010Ult_5F00_h_5F00_rgb_5F00_3A8D7A2C.png"&gt;&lt;img height="48" width="240" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/1104.VS2010Ult_5F00_h_5F00_rgb_5F00_thumb_5F00_4C6A0DF9.png" alt="VS2010-Ult_h_rgb" border="0" title="VS2010-Ult_h_rgb" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Last week we published a new major version of the &lt;a target="_blank" href="http://vsptqrg.codeplex.com/"&gt;Visual Studio Performance Testing Quick Reference Guide&lt;/a&gt;. The effort of creating this document was lead by Geoff Gray. Geoff is a senior consultant in the Microsoft Services Labs in the US that specializes in performance testing using Visual Studio. I was part of the &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/teamsystem/ee358786.aspx"&gt;Rangers&lt;/a&gt; team that contributed articles to &lt;a target="_blank" href="http://vsptqrg.codeplex.com/releases/view/42484"&gt;this guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From time to time I do performance testing engagements. Last week for example I worked for a customer and load tested their new Internet facing website before it goes live later this month. Performance testing uncovers issues in the software and the infrastructure that might otherwise go unnoticed until the public hits the site. And that is a bad time to discover performance issues.&lt;/p&gt;
&lt;p&gt;Creating and executing real-world performance testing can be a tricky job and this quick reference guide gives lots of tricks &amp;amp; tips from consultants from Microsoft Services and the Visual Studio product team on how to tackle challenges you might encounter.&lt;/p&gt;
&lt;p&gt;Visual Studio has a rich extensibility model for performance testing and that&amp;rsquo;s why it is interesting for development minded people like me. You can create plug-ins in C# to do&amp;nbsp; advanced parameterization of web tests and load tests (&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ms243191(v=VS.100).aspx" title="Example of creating a web performance test plug-in for Visual Studio"&gt;example on MSDN&lt;/a&gt;). The &lt;a target="_blank" href="http://vsptqrg.codeplex.com/releases/view/42484"&gt;QRG&lt;/a&gt; has lots of examples of when and how this is useful.&lt;/p&gt;
&lt;p&gt;Load testing is part of Visual Studio 2008 Team Suite or Test Edition and of &lt;a target="_blank" href="http://www.microsoft.com/visualstudio/en-us/products/2010-editions/ultimate"&gt;Visual Studio 2010 Ultimate&lt;/a&gt;. With VS2010, if you need to simulate more than 1000 users, you can purchase &amp;ldquo;&lt;a target="_blank" href="http://blogs.msdn.com/edglas/archive/2009/10/20/introducing-the-microsoft-visual-studio-load-test-virtual-user-pack-2010.aspx"&gt;virtual user packs&lt;/a&gt;&amp;rdquo;. This will enable you to simulate higher loads using a test rig consisting of one test controller and several test agents. Previously with VS2008 you had to license each agent. You can&amp;rsquo;t be sure in advance how many users you can simulate with one agent because it depends on many factors like hardware and complexity of the application and the test itself.&lt;/p&gt;
&lt;p&gt;Many organizations forego the effort of performance testing and take a &amp;ldquo;wait and see&amp;rdquo; stance. This reactive approach can lead to costly repairs and bad publicity. My advice is to take a proactive stance and be confident about the performance of your application before it goes live. In many cases there are quick wins to improve the performance by enabling better caching (&lt;a target="_blank" href="http://www.sharepointnutsandbolts.com/2009/05/optimization-blob-caching-and-http-304s.html"&gt;blob caching for SharePoint&lt;/a&gt;). Even simple things like enabling &lt;a target="_blank" href="http://www.iis.net/ConfigReference/system.webServer/httpCompression" title="How to enable HTTP compression on IIS 7"&gt;HTTP compression&lt;/a&gt; are still often forgotten.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=483055" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term="Work" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Work/default.aspx" /><category term="Microsoft" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Microsoft/default.aspx" /><category term="Performance Testing" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Performance+Testing/default.aspx" /><category term="Visual Studio" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Article on Cloud Computing in Dutch TechNet Magazine</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2010/03/31/article-on-cloud-computing-in-dutch-technet-magazine.aspx" /><id>/blogs/erwyn/archive/2010/03/31/article-on-cloud-computing-in-dutch-technet-magazine.aspx</id><published>2010-03-31T09:25:00Z</published><updated>2010-03-31T09:25:00Z</updated><content type="html">&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/6521.WinAzure_5F00_h_5F00_rgb_5F00_5BE3FBC4.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="WinAzure_h_rgb" border="0" alt="WinAzure_h_rgb" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/0842.WinAzure_5F00_h_5F00_rgb_5F00_thumb_5F00_35356F77.png" width="240" height="45" /&gt;&lt;/a&gt;  &lt;p&gt;I don’t write much for public consumption these days, i.e., this blog has gone really quiet ;) Most of my work is for clients that don’t like it if I blog about that.&lt;/p&gt;  &lt;p&gt;But I did write an article about cloud computing and Windows Azure for the Dutch TechNet Magazine with my colleague Dennis Mulder. It wasn’t until today that I had an actual hardcopy in my hands.&lt;/p&gt;  &lt;p&gt;The article titled “&lt;a href="http://download.microsoft.com/download/3/9/A/39A101B2-C4ED-4757-A297-61898E9005ED/TN_01_2010_Azure_Cloud_Meer.pdf" target="_blank"&gt;Microsofts Cloud Computing Platform&lt;/a&gt;” (written in Dutch) is available as a PDF. For the entire content of the Februari 2010 issue of the magazine &lt;a href="http://technet.microsoft.com/nl-nl/ff473120.aspx" target="_blank"&gt;check this page&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=483042" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term="Microsoft" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Microsoft/default.aspx" /><category term="Windows Azure" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Windows+Azure/default.aspx" /><category term="Cloud Computing" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Cloud+Computing/default.aspx" /></entry><entry><title>UPC Sucks (2)</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2009/08/18/upc-sucks-2.aspx" /><id>/blogs/erwyn/archive/2009/08/18/upc-sucks-2.aspx</id><published>2009-08-18T20:10:00Z</published><updated>2009-08-18T20:10:00Z</updated><content type="html">&lt;p&gt;My first blog post with the title &lt;a href="http://bloggingabout.net/blogs/erwyn/archive/2006/11/02/UPC-sucks.aspx"&gt;UPC sucks&lt;/a&gt; is the #1 hit on Bing and the #5 hit on Google. Unfortunately it is time to add another such post.&lt;/p&gt;
&lt;p&gt;UPC is a cable company that has a monopoly on cable tv in large parts of the Netherlands. I have two UPC mediaboxes for watching digital tv and using the UPC On Demand service. When they work, the picture quality is great. If they don&amp;rsquo;t work, they cause you major headaches and an endless stream of calls to the UPC helpdesk. You have to dial a paid phone number in order to speak to UPC and the waiting time is between 5 and 10 minutes in my experience.&lt;/p&gt;
&lt;p&gt;Since february 2009, I have two mediaboxes, one is a Philips HD-DVR and the other is a Thompson SD without DVR. On at least three occasions I have had &amp;ldquo;access denied&amp;rdquo; problems on all digital tv channels. Resolving these problems took multiple calls to the helpdesk in each case. The usual chain of recommended trouble shooting is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Recheck the cabling, unless you insist you can see the &amp;ldquo;access denied&amp;rdquo; error message on the screen so there is a working connection between your mediabox and the tv.&lt;/li&gt;
&lt;li&gt;Take the power cable out for 30 seconds and then reinsert it. The reboot takes at least a couple of minutes. Which you pay for of course, because you don&amp;rsquo;t want to hang up the phone and get back to the end of the queue when you need to call again because the problem is not resolved.&lt;/li&gt;
&lt;li&gt;Reset the box to factory settings. You loose all customizations (like favorite channels). This takes about five minutes.&lt;/li&gt;
&lt;li&gt;Press some button on the box while reinserting the power cable (variant of step 2) to force a software update. This takes over five minutes before the box is usable again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am sure these steps resolve 90% of the problems for most customers, because the mediabox is an unstable piece of crap. I try these steps before calling the helpdesk to save some money on the call. But for the remaining 10% of the cases it doesn&amp;rsquo;t work. And actually if the helpdesk had more intelligent scripts or more intelligent people, they could tell in advance what types of problems are not resolved by these steps. The &amp;ldquo;access denied&amp;rdquo; case is such a class of problem. Some helpdesk employees realize this, if you insist you know the problem is on their end. Others just want to send a mechanic to check your cabling for which you have to stay at home for at least half a day.&lt;/p&gt;
&lt;p&gt;What sometimes happens is that the mediabox for unknown reasons looses it authorization to view all channels. The resolution is that the UPC server should push the authorization again to the box. Some employees claim they can&amp;rsquo;t do this and others that this takes up to 24 hours to take effect, but that is rubbish. If you happen to get a decently skilled employee on the phone, they should be able to solve the problem instantly while you wait.&lt;/p&gt;
&lt;p&gt;In May 2009 the On Demand service stopped working on both of my mediaboxes. After selecting a video and pressing OK, error code CU103 or VD103 appeared with the message that I should call the helpdesk. For most cases this symptom can be resolved by rebooting the box (step 2 above). After being online for a couple of days, the box has the tendency to loose its IP-address and is not smart enough to reacquire it. You can check this by pressing the red button on channel 999. This performs a connectivity check. In my case the result was &amp;ldquo;congratulations! you have a connection with the UPC network&amp;rdquo; and the next screen showed all green statuses with IP-addresses and all. After calling the helpdesk they insisted that it must be a coax cabling problem on my end because steps&amp;nbsp;2 to 4 didn&amp;rsquo;t fix the problem. I didn&amp;rsquo;t believe this, because I have good cabling from Hirschmann. Nevertheless, as I was out of options, I agreed to stay at home for a mechanic. The guy (from Centric hired by UPC) was no On Demand expert and repeated steps 2 to 4. He measured the signal strength, which was fine as I expected. He did have one extra trick up his sleeve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After the reset to factory settings enter the wrong region code so you connect with a server in another region. Try to start On Demand. Switch back to original region. Retry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This didn&amp;rsquo;t work. The mediaboxes otherwise seemed to work just fine and the chance of two in one home breaking down at the same day is pretty slim, so they were not replaced. The mechanic left without being able to fix the problem. He concluded that the problem had to be at the UPC server end. I didn&amp;rsquo;t hear back from UPC for a couple of days and called them again. A new case would be opened and I heard something about &amp;ldquo;frequency fine-tuning on the server end&amp;rdquo;. A couple of days later On Demand magically started working, but I never heard if and what was fixed by UPC.&lt;/p&gt;
&lt;p&gt;Fast forward to August 7th, 2009. On Demand stopped working again with the same symptoms as in May. So I called the helpdesk. They always apologize for the inconvenience and claim they will solve your problem. Their script and training includes friendliness. But it turns out that for complex On Demand problems they can only send e-mail messages to a special UPC unit that I dub the &amp;ldquo;black hole&amp;rdquo;. There is only one-way communication from the helpdesk to this unit possible. They promise that the unit will call you back, but they never do. Apparently the workflow is that the customer has to call the help desk again if the issue is not resolved after a couple of days and his/her patience runs out after not hearing anything from UPC. The help desk goes through exactly the same cycle again and just opens a new case for the &amp;ldquo;black hole&amp;rdquo; unit. Some employees have the nerve to claim that the unit will look into the issue the same evening. Others say they cannot state any reasonable time for resolution or feedback: &amp;ldquo;could be longer than a week&amp;rdquo;. There is only one case where the helpdesk called me back (not the black hole unit). The only thing the employee could tell me was that the e-mail had been sent and he would call again after the weekend to give another status update. That call never came.&lt;/p&gt;
&lt;p&gt;Randomly in this endless sequence of calls to the helpdesk an employee will claim again that they need to send a mechanic. After telling them the whole history again, I could oftentimes convince them that the problem is very likely not on my end and I don&amp;rsquo;t want to stay at home for a day for a mechanic who can&amp;rsquo;t fix the problem. My mediaboxes have a proper return signal. UPC can measure this remotely. UPC Interactive works, so the TCP/IP connection is obviously not the problem. &lt;/p&gt;
&lt;p&gt;Tonight I got into this whole discussion with the help desk again. I was ready to give in, so I asked &amp;ldquo;When can you send a mechanic?&amp;rdquo; The first available option was August 26th, so more than a week from now. And that for a problem that started on August 7th. And no compensation what so ever if the mechanic isn&amp;rsquo;t able to fix the problem, because it isn&amp;rsquo;t at my end of the cable. UPC has a cash back policy if they can&amp;rsquo;t fix a problem in 24 hours. But On Demand is not included in this policy, because they claim it is a &amp;ldquo;free&amp;rdquo; service. Of course it isn&amp;rsquo;t free. You can&amp;rsquo;t get it unless you pay money for a digital television pack and mediabox. On Demand is a large part of their marketing and an important motivator for me to pay extra for digital television.&lt;/p&gt;
&lt;p&gt;Tomorrow I am going to call UPC again to file a formal complaint. This blog post serves as a public statement that I can refer to, to add some extra weight to my complaint.&lt;/p&gt;
&lt;p&gt;If you managed to read this far, thanks for bearing with me.&lt;/p&gt;
&lt;p&gt;If you consider becoming a UPC customer, be prepared to buy extra aspirin.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=482081" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term="Personal" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Personal/default.aspx" /></entry><entry><title>Speed improvements in FlickrMetadataSynchr by exploiting parallelism</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2009/08/09/speed-improvements-in-flickrmetadatasynchr-by-exploiting-parallelism.aspx" /><id>/blogs/erwyn/archive/2009/08/09/speed-improvements-in-flickrmetadatasynchr-by-exploiting-parallelism.aspx</id><published>2009-08-09T10:50:00Z</published><updated>2009-08-09T10:50:00Z</updated><content type="html">&lt;p&gt;Yesterday I worked on a new version of &lt;a href="http://flickrmetadatasynchr.codeplex.com/"&gt;my FlickrMetadataSynchr tool&lt;/a&gt; and published the &lt;a href="http://flickrmetadatasynchr.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=31296"&gt;1.3.0.0 version on CodePlex&lt;/a&gt;. I wasn’t really planning on creating a new version, but I was annoyed by the old version in a new usage scenario. When you have an itch you have to scratch it! And it is always good to catch up on some programming if recent assignments at work don’t include any coding. So what caused this itch?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/4064.FlickrMetadataSynchrv1.3.0.0_5F00_2E333DC8.png"&gt;&lt;img style="border-right-width:0px;margin:0px 10px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="FlickrMetadataSynchr-v1.3.0.0" border="0" alt="FlickrMetadataSynchr-v1.3.0.0" align="left" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/5557.FlickrMetadataSynchrv1.3.0.0_5F00_thumb_5F00_7B633753.png" width="376" height="480" /&gt;&lt;/a&gt;About two weeks ago I got back from my holiday in China with about 1,500 pictures on my 16 GB memory card. I always make a first selection immediately after taking a picture, so initially there were lots more. After selection and stitching panoramic photos, I managed to get this down to about 1,200 pictures. Still a lot of pictures. But storage is cheap, tagging makes search easy, so why throw away any more? One of the &lt;a href="http://www.flickr.com/upgrade/"&gt;perks of a Pro account&lt;/a&gt; on &lt;a href="http://www.flickr.com/"&gt;Flickr&lt;/a&gt; is that I have unlimited storage, so I uploaded 1,1173 pictures (5.54 GB). This took over 12 hours because Flickr has limited uploading bandwidth. &lt;/p&gt;  &lt;p&gt;Adding metadata doesn’t stop at tagging pictures. You can add a title, description and geolocation to a picture. Sometimes this is easier to do on your local pictures, and sometimes I prefer to do it on Flickr. The FlickrMetadataSynchr tool that I wrote is a solution to keeping this metadata in sync. You should always try to stay in control of your data, so I keep backups of my e-mail stored in the “cloud” and I store all metadata &lt;em&gt;in&lt;/em&gt; the original picture files on my hard drive. Of course I backup those files too. Even offsite by storing an external hard drive outside my house.&lt;/p&gt;  &lt;p&gt;Back to the problem. Syncing the metadata for 1,1173 pictures took an annoyingly long time. The &lt;a href="http://www.flickr.com/services/api/"&gt;Flickr API&lt;/a&gt; has some batch operations, but for my tool I have to fetch metadata and update metadata for pictures one-by-one. So each fetch and each update uses one HTTP call. Each operation is not unreasonably show, but when adding latency to the mix it adds up to slow performance if you do it sequentially.&lt;/p&gt;  &lt;p&gt;Imperative programming languages like C# promote a sequential way of doing things. It is really hard to exploit multiple processor cores by splitting up work so that it can run in parallel. You run into things like data concurrency for shared memory, coordinating results and exceptions, making operations cancellable, etc. Even with a single processor core, my app would benefit from exploiting parallelism because the processor spends most of its time waiting on the result of the HTTP call. This time can be utilized by creating additional calls or processing results of other calls. Microsoft has realized that this is hard work for a programmer and great new additions are coming in .NET Framework 4.0 and Visual Studio 2010. Things like the &lt;a href="http://msdn.microsoft.com/en-us/library/dd460717(VS.100).aspx"&gt;Task Parallel Library&lt;/a&gt; and &lt;a href="http://channel9.msdn.com/posts/VisualStudio/Debugging-Parallel-Applications-with-Visual-Studio-2010/"&gt;making debugging parallel applications easier&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;However, these improvements are still in the beta stage and not usable yet for production software like my tool. I am not the only user of my application and “xcopy deployability” remains a very important goal to me. For example, the tool does not use .NET 3.5 features and only depends on .NET 3.0, This is&amp;#160; because Windows Vista comes with .NET 3.0 out of the box and .NET 3.5 requires an additional hefty install. I might make the transition to .NET 3.5 SP1 soon, because it is now pushed out to all users of .NET 2.0 and higher through Windows Update.&lt;/p&gt;  &lt;p&gt;So I added parallelism the old-fashioned way, by manually spinning up threads, locking shared data structures appropriately, propagate exception information through callbacks, making asynchronous processes cancellable, waiting on all worker threads to finish using &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx"&gt;WaitHandles&lt;/a&gt;, etc. I don’t use the standard .NET threadpool for queing work because it is tuned for CPU bound operations. I want to have fine grained control over the number of HTTP connections that I open to Flickr. A reasonable number is a maximum of 10 concurrent connections. This gives me almost 10 ten times the original speed for the Flickr fetch and update steps in the sync process. Going any higher puts me at risk of being seen as launching a denial-of-service attack against the Flickr web services.&lt;/p&gt;  &lt;p&gt;If you want to take a look at my &lt;a href="http://flickrmetadatasynchr.codeplex.com/SourceControl/ListDownloadableCommits.aspx"&gt;source code, you can find it at CodePlex&lt;/a&gt;. The app was already nicely factored, so I didn’t have to rearchitect it to add parallelism. The sync process was already done on a background thread (albeit sequentially) in a helper class, because you should never block the UI thread in WinForms or WPF applications. The app already contained quite a bit of thread synchronization stuff. The new machinery is contained in the abstract generic class &lt;a href="http://flickrmetadatasynchr.codeplex.com/SourceControl/changeset/view/28406#583148"&gt;AsyncFlickerWorker&amp;lt;TIn, Tout&amp;gt; class&lt;/a&gt;. Its signature is&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/span&gt;&lt;span style="color:green;"&gt;Abstract class that implements the machinery to asynchronously process metadata on Flickr. This can either be fetching metadata
&lt;/span&gt;&lt;span style="color:gray;"&gt;/// &lt;/span&gt;&lt;span style="color:green;"&gt;or updating metadata.
&lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
/// &amp;lt;typeparam name=&amp;quot;TIn&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of metadata that is processed.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
/// &amp;lt;typeparam name=&amp;quot;TOut&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of metadata that is the result of the processing.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;internal abstract class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;AsyncFlickrWorker&lt;/span&gt;&amp;lt;TIn, TOut&amp;gt;&lt;/pre&gt;

&lt;p&gt;It has the following public method&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/span&gt;&lt;span style="color:green;"&gt;Starts the async process. This method should not be called when the asychronous process is already in progress.
&lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name=&amp;quot;metadataList&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The list with &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;typeparamref name=&amp;quot;TIn&amp;quot;/&amp;gt; &lt;/span&gt;&lt;span style="color:green;"&gt;instances of metadata that should
&lt;/span&gt;&lt;span style="color:gray;"&gt;/// &lt;/span&gt;&lt;span style="color:green;"&gt;be processed on Flickr.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
/// &amp;lt;param name=&amp;quot;resultCallback&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;A callback that receives the result. Is not allowed to be null.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
/// &amp;lt;typeparam name=&amp;quot;TIn&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of metadata that is processed.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
/// &amp;lt;typeparam name=&amp;quot;TOut&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The type of metadata that is the result of the processing.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
/// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Returns a &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;see cref=&amp;quot;WaitHandle&amp;quot;/&amp;gt; &lt;/span&gt;&lt;span style="color:green;"&gt;that can be used for synchronization purposes. It will be signaled when
&lt;/span&gt;&lt;span style="color:gray;"&gt;/// &lt;/span&gt;&lt;span style="color:green;"&gt;the async process is done.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;WaitHandle &lt;/span&gt;BeginWork(&lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;TIn&amp;gt; metadataList, &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;AsyncFlickrWorkerEventArgs&lt;/span&gt;&amp;lt;TOut&amp;gt;&amp;gt; resultCallback)&lt;/pre&gt;

&lt;p&gt;It uses the generic class &lt;a href="http://flickrmetadatasynchr.codeplex.com/SourceControl/changeset/view/28406#583149"&gt;AsyncrFlickrWorkerEventArgs&amp;lt;TOut&amp;gt;&lt;/a&gt; to report the results:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/span&gt;&lt;span style="color:green;"&gt;Class with event arguments for reporting the results of asynchronously processing metadata on Flickr.
&lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
/// &amp;lt;typeparam name=&amp;quot;TOut&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The &amp;quot;out&amp;quot; metadata type that is the result of the asynchronous processing.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;AsyncFlickrWorkerEventArgs&lt;/span&gt;&amp;lt;TOut&amp;gt; : &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;The subclass &lt;a href="http://flickrmetadatasynchr.codeplex.com/SourceControl/changeset/view/28406#581443"&gt;AsyncPhotoInfoFetcher&lt;/a&gt; is one of its implementations. &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/span&gt;&lt;span style="color:green;"&gt;Class that asynchronously fetches photo information from Flickr.
&lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;internal sealed class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;AsyncPhotoInfoFetcher&lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;AsyncFlickrWorker&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Photo&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;PhotoInfo&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;These async workers are used by the &lt;a href="http://flickrmetadatasynchr.codeplex.com/SourceControl/changeset/view/28406#50489"&gt;FlickrHelper class&lt;/a&gt; (BTW: this class has grown a bit too big, so it is a likely candidate for future refactoring). Its method that calls async workers is generic and has this signature:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/span&gt;&lt;span style="color:green;"&gt;Processes a list of photos with multiple async workers and returns the result.
&lt;/span&gt;&lt;span style="color:gray;"&gt;/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name=&amp;quot;metadataInList&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The list with metadata of photos that should be processed.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
/// &amp;lt;param name=&amp;quot;progressCallback&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;A callback to receive progress information.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
/// &amp;lt;param name=&amp;quot;workerFactoryMethod&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;A factory method that can be used to create a worker instance.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;
/// &amp;lt;typeparam name=&amp;quot;TIn&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The &amp;quot;in&amp;quot; metadata type for the worker.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
/// &amp;lt;typeparam name=&amp;quot;TOut&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The &amp;quot;out&amp;quot; metadata type for the worker.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/typeparam&amp;gt;
/// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;A list with the metadata result of processing &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;paramref name=&amp;quot;metadataInList&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;TOut&amp;gt; ProcessMetadataWithMultipleWorkers&amp;lt;TIn, TOut&amp;gt;(
    &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;TIn&amp;gt; metadataInList,
    &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;PictureProgressEventArgs&lt;/span&gt;&amp;gt; progressCallback,
    &lt;span style="color:#2b91af;"&gt;CreateAsyncFlickrWorker&lt;/span&gt;&amp;lt;TIn, TOut&amp;gt; workerFactoryMethod)&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This method contains an anonymous delegate that acts as the result callback for the async workers. Generics and anonymous delegates make multithreaded life bearable in C# 2.0. Anonymous delegates allow you to use local variables and fields of the containing method and class in the callback method and thus easily access and change those to store the result of the worker thread. Of course, make sure you lock access to shared data appropriately because multiple threads might callback simultaneously to report their results.&lt;/p&gt;

&lt;p&gt;And somewhere in 2010 when .NET 4.0 is released, I could potentially remove all this manual threading stuff and just exploit Parallel.For ;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=482020" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term=".NET" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/.NET/default.aspx" /><category term="Personal" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Personal/default.aspx" /><category term="Photography" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Photography/default.aspx" /><category term="FlickrMetadataSynchr" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/FlickrMetadataSynchr/default.aspx" /></entry><entry><title>Windows Azure DevTableGen.exe issue with x86 assemblies on 64-bit Windows</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2009/06/23/windows-azure-devtablegen-exe-issue-with-x86-assemblies-on-64-bit-windows.aspx" /><id>/blogs/erwyn/archive/2009/06/23/windows-azure-devtablegen-exe-issue-with-x86-assemblies-on-64-bit-windows.aspx</id><published>2009-06-23T21:28:00Z</published><updated>2009-06-23T21:28:00Z</updated><content type="html">&lt;p&gt;I ran into an issue with a Windows Azure project created from scratch in Visual Studio 2010 Beta 1 with the May CTP of the &lt;a href="http://msdn.microsoft.com/en-us/azure/cc994380.aspx"&gt;Windows Azure Tools&lt;/a&gt;.&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/8420.Azure_5F00_Logo_5F00_64BA1313.png"&gt;&lt;img height="112" width="90" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/0825.Azure_5F00_Logo_5F00_thumb_5F00_644DE01E.png" align="right" alt="Azure_Logo" border="0" title="Azure_Logo" style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;When trying to create tables in the local development storage, I got the error &amp;ldquo;Invalid image format&amp;rdquo;. This issue occurred both from VS (using the Create Test Storage Tables option) and when running &lt;a href="http://msdn.microsoft.com/en-us/library/dd179373.aspx"&gt;DevTableGen.exe&lt;/a&gt; manually from a command prompt. It didn&amp;rsquo;t occur when doing the same in VS2008.&lt;/p&gt;
&lt;p&gt;DevTableGen.exe is a tool from the Windows Azure SDK. This tools loads an assembly, reflects over it and then tries to create tables in the local development storage.&lt;/p&gt;
&lt;p&gt;After some head scratching I figured out the cause: in Dev10 the default target platform for executables was changed from &lt;a href="http://msdn.microsoft.com/en-us/library/zekwfyz4(VS.80).aspx"&gt;&lt;em&gt;AnyCPU&lt;/em&gt;&lt;/a&gt; to &lt;em&gt;x86&lt;/em&gt;. In Beta 1 a bug snuck in, so that &lt;em&gt;x86&lt;/em&gt; is also the default for class libraries (DLLs). This will be changed back to &lt;em&gt;AnyCPU&lt;/em&gt; in Beta 2. &lt;a href="http://blogs.msdn.com/rmbyers/archive/2009/06/08/anycpu-exes-are-usually-more-trouble-then-they-re-worth.aspx"&gt;This blog post from Rick Byers&lt;/a&gt; has a lot of detail on why the default has changed.&lt;/p&gt;
&lt;p&gt;DevTableGen.exe is an &lt;em&gt;AnyCPU&lt;/em&gt; executable, so it will run as a 64-bit process on an 64-bit version of Windows. As such it cannot load assemblies marked as 32-bit only when run on 64-bit Windows. The solution was to change the assembly to &lt;em&gt;AnyCPU&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This issue would have been prevented if DevTableGen.exe was marked as 32-bit only. That way it would always run in a 32-bit process and could load &lt;em&gt;x86&lt;/em&gt; and &lt;em&gt;AnyCPU&lt;/em&gt; assemblies. According to the blog post linked to above, it is now considered best practice to explicitly mark an executable as &lt;em&gt;x86&lt;/em&gt; or &lt;em&gt;x64&lt;/em&gt;. For most applications &lt;em&gt;x86&lt;/em&gt; is the best option.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve suggested this change to the product team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I&amp;#39;ve been informed that DevTableGen.exe will not be changed. This is because this issue is temporary and will go away when VS2010 Beta 2 is released. Also the web role and worker role processes in Windows Azure are&amp;nbsp;64-bit, so trying to load &lt;em&gt;x86&lt;/em&gt; assemblies will fail anyway. So if you use Beta 1 make sure you explicitly change the platform for any assemblies you create&amp;nbsp;for the cloud to &lt;em&gt;AnyCPU&lt;/em&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=481845" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term=".NET" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/.NET/default.aspx" /><category term="Work" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Work/default.aspx" /><category term="Windows Azure" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Windows+Azure/default.aspx" /></entry><entry><title>Improving the CIA Pickup Sample App for Windows Azure</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2009/06/20/improving-the-cia-pickup-sample-app-for-windows-azure.aspx" /><id>/blogs/erwyn/archive/2009/06/20/improving-the-cia-pickup-sample-app-for-windows-azure.aspx</id><published>2009-06-20T10:06:00Z</published><updated>2009-06-20T10:06:00Z</updated><content type="html">&lt;p&gt;Ever since the internal unveiling of &lt;a href="http://www.microsoft.com/azure/windowsazure.mspx"&gt;Windows Azure&lt;/a&gt; as project “&lt;a href="http://blogs.zdnet.com/microsoft/?p=2098&amp;amp;tag=nl.e539"&gt;Red Dog&lt;/a&gt;” at our internal &lt;a href="http://en.wikipedia.org/wiki/Techready"&gt;TechReady&lt;/a&gt; conference in July 2008, I’ve been very interested in this Software+Services platform.&lt;/p&gt;  &lt;p&gt;Technical strategist &lt;a href="http://blog.smarx.com/"&gt;Steve Marx&lt;/a&gt; from the Windows Azure team recently released a cool sample app called &lt;a href="http://www.theciapickup.com/"&gt;The CIA Pickup&lt;/a&gt;. He put up a &lt;a href="http://blog.smarx.com/posts/actually-i-m-a-cia-agent"&gt;demonstration video and a nice architecture drawing of this app&lt;/a&gt; up on his blog.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/2744.TheCiaPickup_5F00_Logo_5F00_6A8EE4CE.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="TheCiaPickup_Logo" border="0" alt="TheCiaPickup_Logo" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/5672.TheCiaPickup_5F00_Logo_5F00_thumb_5F00_14FB15EC.png" width="374" height="45" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Using the app you can pretend to be a CIA agent and hand out a phone number and your agent id to someone. When this person calls this number, they are greeted by an automated message that says they are connected to the CIA automated phone system and are requested to enter your agent id. After they have entered your id, you will receive their caller id via e-mail.&lt;/p&gt;  &lt;p&gt;Seeing that 90% of the IT population seems to be male of which probably 95% is straight, I can see why the app is slightly biased in helping &lt;em&gt;men&lt;/em&gt; picking up phone numbers of &lt;em&gt;women&lt;/em&gt;. But if you don’t like this, you can always &lt;a href="http://smarxblogstorage.blob.core.windows.net/files/TheCIAPickup_source.zip"&gt;pick up the source&lt;/a&gt; and change the text. Which I did. Not to change the text, but to make some improvements so that I could run the app in my own Windows Azure playground in the cloud. &lt;/p&gt;  &lt;p&gt;For example, the SMTP port of my e-mail service is not the standard port 25. I made this port configurable and in the process I found out that the app has to be deployed with full trust in order to be able to use the non standard port. I added logging to trouble shoot issues like this and made some security improvements.&lt;/p&gt;  &lt;p&gt;I contributed these improvements back to Steve and he has gracefully credited me in &lt;a href="http://blog.smarx.com/posts/update-to-the-cia-pickup-source"&gt;his second blog post&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The CIA Pickup app is a great example of the power of combining different off-the-shelf services like &lt;a href="http://en.wikipedia.org/wiki/SMTP"&gt;SMTP&lt;/a&gt; providers, telephony service &lt;a href="http://www.twilio.com/"&gt;Twilio&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/azure/cc994380.aspx"&gt;Azure Table and Queue Storage&lt;/a&gt;, &lt;a href="http://dev.live.com/liveid/"&gt;Windows Live ID Authentication&lt;/a&gt; with custom code, C# and &lt;a href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt;, running in the cloud. You can literally have this up-and-running within a couple of hours, including the creation of all necessary accounts.&lt;/p&gt;  &lt;p&gt;So go &lt;a href="http://www.theciapickup.com/"&gt;try it out&lt;/a&gt;! You don’t need to deploy the app yourself to do this. You can use Steve’s deployment for this. Although it uses the US phone number &lt;strong&gt;+1 (866) 961-1673&lt;/strong&gt;, it works when dialing from the Netherlands. If you want to get in touch, use my agent id &lt;strong&gt;86674&lt;/strong&gt; ;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=481830" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term=".NET" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/.NET/default.aspx" /><category term="Personal" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Personal/default.aspx" /><category term="Microsoft" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Microsoft/default.aspx" /><category term="Software+Services" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Software_2B00_Services/default.aspx" /><category term="Windows Azure" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Windows+Azure/default.aspx" /></entry><entry><title>Analyzing FlickrMetadataSynchr With NDepend</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2009/06/18/analyzing-flickrmetadatasynchr-with-ndepend.aspx" /><id>/blogs/erwyn/archive/2009/06/18/analyzing-flickrmetadatasynchr-with-ndepend.aspx</id><published>2009-06-17T22:23:00Z</published><updated>2009-06-17T22:23:00Z</updated><content type="html">&lt;p&gt;A couple of months ago I received a license for &lt;a href="http://www.ndepend.com/"&gt;NDepend&lt;/a&gt; to evaluate its usefulness. I was already convinced that NDepend is a very useful tool. But up to now, I hadn’t put NDepend to good use in a way that I could blog about it.&lt;/p&gt;  &lt;p&gt;Today I decided to bite the bullet and put my own pet project &lt;a href="http://flickrmetadatasynchr.codeplex.com/"&gt;FlickrMetadataSynchr&lt;/a&gt; up for analysis. Its source code is available on &lt;a href="http://flickrmetadatasynchr.codeplex.com/"&gt;CodePlex&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;NDepend analyses managed code for several quality aspects, like cyclomatic complexity, coupling and unused code. In a way it resembles FxCop, but it also does a lot more in terms of reporting. NDepend also is a lot more flexible in letting you query your code base. For this it uses its own SQL variant called Code Query Language (CQL). For example, you could enter this query into the tool&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;SELECT METHODS WHERE NbLinesOfCode &amp;gt; &lt;b&gt;30&lt;/b&gt; AND IsPublic&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;and NDepend will show you all public methods whose number of lines of code exceeds 30.&lt;/p&gt;  &lt;p&gt;Just by using the standard settings, NDepend gives you truckloads of information that point to areas with potential code smell. The report has inline comments that explain why it selects stuff and points out possible false positives for which it is okay to ignore the warning.&lt;/p&gt;  &lt;p&gt;You can find my &lt;a href="http://flickrmetadatasynchr.codeplex.com/Project/Download/AttachmentDownload.ashx?ProjectName=FlickrMetadataSynchr&amp;amp;WorkItemId=10156&amp;amp;FileAttachmentId=3153"&gt;NDepend results here&lt;/a&gt; if you want to see what such a report looks like.&lt;/p&gt;  &lt;p&gt;Starting with those results from top to bottom, I started refactoring my code to improve the quality. For example, splitting up methods to: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Reduce cyclomatic complexity &lt;/li&gt;    &lt;li&gt;Reduce the number of IL instructions in a method &lt;/li&gt;    &lt;li&gt;Reduce the number of local variables in a method&lt;/li&gt;    &lt;li&gt;Increase the comment to code ratio &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This should increase maintainability of the code.&lt;/p&gt;  &lt;p&gt;Go check out &lt;a href="http://www.ndepend.com/"&gt;this tool&lt;/a&gt; if you are interested in improving the quality of your .NET code or if you are tasked with reviewing somebody else’s code.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=481817" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term=".NET" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/.NET/default.aspx" /><category term="Architecture and Design" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Architecture+and+Design/default.aspx" /><category term="NDepend" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/NDepend/default.aspx" /><category term="FlickrMetadataSynchr" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/FlickrMetadataSynchr/default.aspx" /></entry><entry><title>It’s The Little Things: PNG Transparency In Win7 Explorer</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2009/05/23/it-s-the-little-things-png-transparency-in-win7-explorer.aspx" /><id>/blogs/erwyn/archive/2009/05/23/it-s-the-little-things-png-transparency-in-win7-explorer.aspx</id><published>2009-05-23T13:43:00Z</published><updated>2009-05-23T13:43:00Z</updated><content type="html">&lt;p&gt;Sometimes it’s attention to detail that excites me the most. I just noticed the beautiful rendering of PNGs with transparency in the &lt;a href="http://windowsteamblog.com/blogs/developers/archive/2009/04/06/understanding-windows-7-libraries.aspx"&gt;Pictures Library&lt;/a&gt; view in Explorer in Windows 7 (&lt;a href="http://www.microsoft.com/Windows/Windows-7/download.aspx"&gt;RC build&lt;/a&gt;):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/7840.PNGTransparencyinPicturesLibraryView_5F00_748F68F2.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="PNG Transparency in Pictures Library View" border="0" alt="PNG Transparency in Pictures Library View" src="http://bloggingabout.net/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/erwyn.metablogapi/0842.PNGTransparencyinPicturesLibraryView_5F00_thumb_5F00_4635E345.png" width="492" height="241" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can get this view by selecting Arrange by Month in the upper right-hand corner of the Pictures library view. The RC build has been pretty stable for me and I use it for “production” purposes on my work laptop. I have both Visual Studio 2008 SP1 and Visual Studio 2010 Beta 1 installed on it and this works fine.&lt;/p&gt;  &lt;p&gt;These images you see above do not reside on my Win7 laptop, but on my &lt;a href="http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx"&gt;Windows Home Server&lt;/a&gt; (WHS) box. I’ve included the &lt;a&gt;\\server\photos&lt;/a&gt; share in my Win7 Pictures Library. This pulls some 20,000 pictures into my library without any ill effect. I run Windows Search 4.0 on my WHS, so searching the library is still very snappy. This is possible because the search box in Explorer uses Remote Index Discovery and my laptop doesn’t have to index those pictures by itself.&lt;/p&gt;  &lt;p&gt;You can code against the new Library feature in Win7 using &lt;a href="http://windowsteamblog.com/blogs/developers/archive/2009/05/08/windows-7-libraries-ishellfolder.aspx"&gt;C++ as explained on the Windows 7 Blog for Developers&lt;/a&gt;. If you are slightly less masochistic and want to use C# or VB, I suggest you use the &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack"&gt;Windows API Code Pack for Microsoft .NET Framework&lt;/a&gt;. It’s essentially a bunch of wrapper classes around new unmanaged code APIs in Windows that are not yet covered by the .NET Framework itself.&lt;/p&gt;  &lt;p&gt;PS: If you are still on Windows Vista, &lt;a href="http://msdn.microsoft.com/en-us/subscriptions/downloads/default.aspx?PV=36:146:CDR:en:---"&gt;SP2 has just been released on MSDN Subscriber Downloads&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;PS2: I lied a bit. Those images you see on the left are actually beautiful 2048x2048 pixel TIFF files with transparency. You can &lt;a href="http://earthobservatory.nasa.gov/Features/BlueMarble/BlueMarble_2002.php"&gt;download those so-called Blue Marble pictures&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=481687" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term=".NET" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/.NET/default.aspx" /><category term="Personal" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Personal/default.aspx" /><category term="Windows 7" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Windows+7/default.aspx" /></entry><entry><title>IIS Smooth Streaming Experience</title><link rel="alternate" type="text/html" href="/blogs/erwyn/archive/2009/05/05/iis-smooth-streaming-experience.aspx" /><id>/blogs/erwyn/archive/2009/05/05/iis-smooth-streaming-experience.aspx</id><published>2009-05-05T20:33:00Z</published><updated>2009-05-05T20:33:00Z</updated><content type="html">&lt;p&gt;I had read some blogs posts about the new smooth streaming capabilities for IIS 7.0, but I never actually experienced them myself. IIS Smooth Streaming is a technology that works with Silverlight in delivering a smooth video playback experience from Microsoft Internet Information Server in circumstances with varying network bandwidth.&lt;/p&gt;
&lt;p&gt;It is really easy to try it out for yourself via &lt;a href="http://www.iis.net/media/experiencesmoothstreaming" title="http://www.iis.net/media/experiencesmoothstreaming"&gt;http://www.iis.net/media/experiencesmoothstreaming&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You get some controls to play with to artificially throttle the bandwidth available to Silverlight for downloading the video stream. If you throttle it down you can see how the stream smoothly switches to a lower bitrate version of the video without too much glitches in the playback experience. If you give Silverlight full bandwidth again, the bitrate gradually climbs up till you get real HD quality again (assuming your maximum bandwidth allows for that). A picture says more than a thousand words:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/erwyn/3505653196/sizes/o/" title="Experience Smooth Streaming  The Official Microsoft IIS Site"&gt;&lt;img src="http://farm4.static.flickr.com/3329/3505653196_e9f231318a.jpg" alt="Experience Smooth Streaming  The Official Microsoft IIS Site" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It also works with the Linux variant of Silverlight called Moonlight. Check out &lt;a href="http://tirania.org/blog/archive/2009/May-05.html"&gt;Miguel de Icaza&amp;rsquo;s blog&lt;/a&gt; for that.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://bloggingabout.net/aggbug.aspx?PostID=481604" width="1" height="1"&gt;</content><author><name>Erwyn van der Meer</name><uri>http://bloggingabout.net/members/Erwyn-van-der-Meer/default.aspx</uri></author><category term="Silverlight" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/Silverlight/default.aspx" /><category term="IIS" scheme="http://bloggingabout.net/blogs/erwyn/archive/tags/IIS/default.aspx" /></entry></feed>