<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Jon Galloway</title><link>http://weblogs.asp.net/jgalloway/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology/Tech News</media:category><itunes:explicit>no</itunes:explicit><itunes:subtitle></itunes:subtitle><itunes:category text="Technology"><itunes:category text="Tech News" /></itunes:category><geo:lat>32.761801</geo:lat><geo:long>-117.012737</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.0/</creativeCommons:license><image><url>http://farm1.static.flickr.com/175/buddyicons/36836555@N00.jpg?1169797019</url><title>Jon Galloway</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/jongalloway" type="application/rss+xml" /><feedburner:emailServiceId>jongalloway</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Troubleshooting an Intermittent .NET High CPU problem</title><link>http://feedproxy.google.com/~r/jongalloway/~3/URZ-zkOCJKg/troubleshooting-an-intermittent-net-high-cpu-problem.aspx</link><pubDate>Thu, 09 Apr 2009 09:02:49 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7036566</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=7036566</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2009/04/09/troubleshooting-an-intermittent-net-high-cpu-problem.aspx#comments</comments><description>&lt;p&gt;We’d been getting sporadic reports of high CPU usage in &lt;a href="http://code.google.com/p/wittytwitter/"&gt;Witty&lt;/a&gt; (a WPF Twitter client). I’d tried running the application in debug mode for a while and could never get it to occur, but finally I saw it happening while I was running a release build (keep in mind that 53% is indicating that one of my two CPU cores was saturated):&lt;/p&gt;  &lt;p&gt;&lt;a title="Witty - High CPU - Task Manager" href="http://www.flickr.com/photos/36836555@N00/3425448169/"&gt;&lt;img alt="Witty - High CPU - Task Manager" src="http://farm4.static.flickr.com/3649/3425448169_395daf6c80.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Great, let’s attach a debugger to see what’s going on:&lt;/p&gt;  &lt;p&gt;&lt;a title="Witty - High CPU - Attach Process" href="http://www.flickr.com/photos/36836555@N00/3426257358/"&gt;&lt;img alt="Witty - High CPU - Attach Process" src="http://farm4.static.flickr.com/3416/3426257358_29ab20cf5b.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Troubleshooting high CPU use often leads to chasing &lt;a href="http://en.wikipedia.org/wiki/Unusual_software_bug#Heisenbug"&gt;heisenbugs&lt;/a&gt;, since the CPU usage of course drops when you break into the code. But, I could at least step through the current code a bit to get an idea of the current state. Doing that showed a lot of time at System.Threading.WaitHandle.WaitOne, which made me suspect at threading issue. &lt;/p&gt; &lt;a title="Witty - High CPU - Threading Suspected" href="http://www.flickr.com/photos/36836555@N00/3426257378/"&gt;&lt;img alt="Witty - High CPU - Threading Suspected" src="http://farm4.static.flickr.com/3377/3426257378_464aaf9fee.jpg" border="0" /&gt;&lt;/a&gt;   &lt;p&gt;On the other hand, breaking into a multithreaded app could have caused that, too. We need more information – let’s take a look at the current threads:&lt;/p&gt;  &lt;p&gt;&lt;a title="Witty - High CPU - View Threads" href="http://www.flickr.com/photos/36836555@N00/3426257420/"&gt;&lt;img alt="Witty - High CPU - View Threads" src="http://farm4.static.flickr.com/3609/3426257420_bb56af0193.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note to self: should have named the threads so I’d have a better idea of what they’re all doing. I’ll talk more about that in a little bit.&lt;/p&gt;  &lt;p&gt;Now, there are probably two ways to go from here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Smart, systematic debugging &lt;/li&gt;    &lt;li&gt;Brute force hacking &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In this case case, since we don’t have that many threads to deal with, I think starting with some brute force interrogation is a good way to get started. If we don’t find anything, we’ll cool off and do the whole Sherlock Holmes contemplation thing, complete with pipe and violin.&lt;/p&gt;  &lt;h3&gt;First Guess: The Red Herring&lt;/h3&gt;  &lt;p&gt;This is not the real problem, it’s a wrong guess. I’m including this for two reasons: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;It’s the truth. It’s what I really did. I’m not going to edit out my stupidity… this time. &lt;/li&gt;    &lt;li&gt;It shows a little interesting information on loading symbols from the Microsoft symbol servers to step into and debug .NET framework code &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;That said, if you want to skip over this bit, I won’t be offended in the least.&lt;/p&gt;  &lt;p&gt;So at this point, I started just looking through the thread list. When we activate a thread, even in disassembly, we can get a pretty good idea of what it’s doing. There’s a current call stack, and the disassembly view shows us the current executing method:&lt;/p&gt;  &lt;p&gt;&lt;a title="Witty - High CPU - Red Herring" href="http://www.flickr.com/photos/36836555@N00/3426257476/"&gt;&lt;img alt="Witty - High CPU - Red Herring" src="http://farm4.static.flickr.com/3627/3426257476_c19c16c861_o.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Well, our current hunch is that the System.Threading.WaitHandle.WaitOne call has to do with the problem, and it’s showing up as the current executing method, so it’s worth looking at for a bit. But that disassembly is over my head. We need to get the actual source… fortunately, that’s not tough. We can load the source from the Microsoft Symbol Servers:&lt;/p&gt;  &lt;p&gt;&lt;a title="Witty - High CPU - Loading Symbols" href="http://www.flickr.com/photos/36836555@N00/3426257496/"&gt;&lt;img alt="Witty - High CPU - Loading Symbols" src="http://farm4.static.flickr.com/3596/3426257496_b25f4909dd_o.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And a few seconds later, we’re interactively debugging framework code. Paging Dr. Awesome…&lt;/p&gt;  &lt;p&gt;&lt;a title="Witty - High CPU - Debugging Framework Code" href="http://www.flickr.com/photos/36836555@N00/3426257532/"&gt;&lt;img alt="Witty - High CPU - Debugging Framework Code" src="http://farm4.static.flickr.com/3590/3426257532_a4ef7ea63b_o.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note: If you’re not able to see the framework code in the call stack, you’ll need to turn off the “Just My Code” debugger option:&lt;/p&gt;  &lt;p&gt;&lt;a title="Witty - High CPU - Just My Code" href="http://www.flickr.com/photos/36836555@N00/3425448281/"&gt;&lt;img alt="Witty - High CPU - Just My Code" src="http://farm4.static.flickr.com/3580/3425448281_a3b6355068.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I’ll spare you the embarrassment of watching me wander around the WPF code which pulls down databound images from internet addresses. It’s interesting code, but after poking around for a bit I convinced myself that this wasn’t the source of the high CPU issues.&lt;/p&gt;  &lt;h3&gt;Wising Up: Freezing Threads To Find The Culprit&lt;/h3&gt;  &lt;p&gt;At this point, I realized that I needed to get a little smarter. Instead of just browsing through all these threads just hoping to find the problem, I needed a smarter way to determine which one was actually the problem. Well, how about this?&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Break into the debugger &lt;/li&gt;    &lt;li&gt;Freeze one of the threads &lt;/li&gt;    &lt;li&gt;Resume the app &lt;/li&gt;    &lt;li&gt;See if the CPU usage has dropped – if so, we’ve found the bad thread, so we can debug it &lt;/li&gt;    &lt;li&gt;If not, repeat &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Simple enough. You can right click any of the threads in the list and freeze it:&lt;/p&gt;  &lt;p&gt;&lt;a title="Witty - High CPU - Freezing A Thread" href="http://www.flickr.com/photos/36836555@N00/3426257538/"&gt;&lt;img alt="Witty - High CPU - Freezing A Thread" src="http://farm4.static.flickr.com/3550/3426257538_cc03968c89.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now, this is still kind of voodoo troubleshooting at this point, since there’s a possibility that the problem’s caused by the interaction of two different threads, or something else that’s going to be masked by a one-at-a-time approach. I’m playing another hunch here – I know enough about this application to assume that most of the threads are independent.&lt;/p&gt;  &lt;h3&gt;Intermission: Play Along At Home with this Simple Runaway Thread Demo&lt;/h3&gt;  &lt;p&gt;This may be a little tough to follow since there are a lot of moving parts. Let’s step back and look at a very simple application with one runaway thread. Create a new console application and add the following code:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Threading;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; RunawayThreadSample
{
    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program
    {
        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
        {
            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; niceThreads = 1; niceThreads &amp;lt;= 10; niceThreads++)
                &lt;span class="kwrd"&gt;new&lt;/span&gt; Thread(() =&amp;gt;
                   {
                       &lt;span class="kwrd"&gt;while&lt;/span&gt; (&lt;span class="kwrd"&gt;true&lt;/span&gt;)
                           Thread.Sleep(500);
                   }) { Name = &lt;span class="str"&gt;&amp;quot;Thread &amp;quot;&lt;/span&gt; + niceThreads }.Start();

            &lt;span class="kwrd"&gt;new&lt;/span&gt; Thread(() =&amp;gt;
               {
                   &lt;span class="kwrd"&gt;while&lt;/span&gt; (&lt;span class="kwrd"&gt;true&lt;/span&gt;)
                   { }
               }) { Name = &lt;span class="str"&gt;&amp;quot;Evil Thread&amp;quot;&lt;/span&gt; }.Start();
        }
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;A few things to notice here:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We’re naming our threads this time. With &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/03/08/new-c-orcas-language-features-automatic-properties-object-initializers-and-collection-initializers.aspx"&gt;.NET 3.5’s object initializer syntax&lt;/a&gt;, we can set the name when it’s created. &lt;/li&gt;

  &lt;li&gt;We’re using lambda syntax to define the anonymous thread delegates – that’s the “() =&amp;gt; {…}” stuff. Karl Seguin covered that pretty well in his &lt;a href="http://codebetter.com/blogs/karlseguin/archive/2008/11/27/back-to-basics-delegates-anonymous-methods-and-lambda-expressions.aspx"&gt;Back To Basics series&lt;/a&gt;. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start up Task Manager (or run &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx"&gt;ProcMon&lt;/a&gt;), then run the application. You should see your CPU use pegged at around 100%, as the “Evil Thread” spins in a tight loop. Now break into the debugger – you should see your CPU usage drop as all the threads are suspended. Freeze the Evil Thread (right-click, freeze):&lt;/p&gt;

&lt;p&gt;&lt;a title="Witty - High CPU - Evil Thread Sample" href="http://www.flickr.com/photos/36836555@N00/3426257556/"&gt;&lt;img alt="Witty - High CPU - Evil Thread Sample" src="http://farm4.static.flickr.com/3648/3426257556_3a6725d535.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then resume the application (by hitting F5) and you should see your CPU usage stays low.&lt;/p&gt;

&lt;h3&gt;Returning To Our Regularly Scheduled Program…&lt;/h3&gt;

&lt;p&gt;Sure enough, freezing and thawing threads in turn points me to a single thread which is causing the high CPU usage – one that’s spending a lot of time in Witty.SingleInstanceManager.WaitForSignal(). Interesting… a little searching lets me know that this class came from &lt;a href="http://www.codeproject.com/KB/threads/SingleInstance.aspx"&gt;a CodeProject article about how to enforce a single instance for an application&lt;/a&gt;. &lt;strong&gt;So that explains why this bug was hard to reproduce – it only happened when the application was already running and you tried to start a second instance.&lt;/strong&gt; That’s not something you’d normally do on purpose, so the bug just appeared to happen randomly.&lt;/p&gt;

&lt;p&gt;But why didn’t we ever see it in debug mode? Let’s look at the code that sets up the single instance manager:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Enforce single instance for release mode&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetupSingleInstance()
{
&lt;span class="preproc"&gt;#if&lt;/span&gt; !DEBUG
    Application.Current.Exit += &lt;span class="kwrd"&gt;new&lt;/span&gt; ExitEventHandler(Current_Exit);
    _instanceManager = &lt;span class="kwrd"&gt;new&lt;/span&gt; SingleInstanceManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;, ShowApplication);
&lt;span class="preproc"&gt;#endif&lt;/span&gt;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;And there we go – the single instance manager only runs in release mode. Heisenbug magnet! Removing the #if pragma command lets us debug the single instance manager, so now it’s time to take a look at that WaitForSignal() method:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// thread method will wait on the event, which will signal&lt;/span&gt;
&lt;span class="rem"&gt;// if another instance tries to start&lt;/span&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WaitForSignal()
{
    &lt;span class="kwrd"&gt;while&lt;/span&gt; (&lt;span class="kwrd"&gt;true&lt;/span&gt;)
    {
        &lt;span class="kwrd"&gt;uint&lt;/span&gt; result = WaitForSingleObject(m_EventHandle, INFINITE);

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (result == 0)
        {
            m_Instance.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, m_callback);
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;strong&gt;There’s the bug&lt;/strong&gt; - if you know the answer, just keep quiet so you don’t spoil it for the rest of the class.&lt;/p&gt;

&lt;p&gt;Let’s take a look at how that &lt;a href="http://msdn.microsoft.com/en-us/library/ms687032(VS.85).aspx"&gt;WaitForSingleObject&lt;/a&gt; thing is working. First, when the application starts, we’re grabbing an Event Handle with &lt;a href="http://msdn.microsoft.com/en-us/library/ms684305(VS.85).aspx"&gt;OpenEvent&lt;/a&gt;, then spinning off a thread that calls WaitForSignal (code above):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; SingleInstanceManager(Window instance, ShowApplicationCallback callback)
{
    m_Instance = instance;
    m_callback = callback;

    &lt;span class="rem"&gt;//try to our event&lt;/span&gt;
    m_EventHandle = OpenEvent(EVENT_MODIFY_STATE | SYNCHRONIZE, &lt;span class="kwrd"&gt;false&lt;/span&gt;, EVENT_NAME);
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (m_EventHandle == IntPtr.Zero) &lt;span class="rem"&gt;//if it doesn't exist&lt;/span&gt;
    {
        &lt;span class="rem"&gt;//create our event&lt;/span&gt;
        m_EventHandle = CreateEvent(IntPtr.Zero, &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;, EVENT_NAME);
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (m_EventHandle != IntPtr.Zero) &lt;span class="rem"&gt;//if successfull&lt;/span&gt;
        {
            Thread thread = &lt;span class="kwrd"&gt;new&lt;/span&gt; Thread(&lt;span class="kwrd"&gt;new&lt;/span&gt; ThreadStart(WaitForSignal));
            thread.Start();
        }
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        SetEvent(m_EventHandle);
        MessageBox.Show(&lt;span class="str"&gt;&amp;quot;There is already an instance of Witty&amp;quot;&lt;/span&gt;);
        Environment.Exit(0);
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;So, here’s how it’s working – the OpenEvent is getting a handle, and the WaitForSignal method calls &lt;a href="http://msdn.microsoft.com/en-us/library/ms687032(VS.85).aspx"&gt;WaitForSingleObject&lt;/a&gt;, which will return 0 when signaled (that is, when another instance of the same handle is detected). Note – it looks like we’re running a tight loop with while(true), but when WaitForSingleObject is called with an INFINITE timeout, it won’t return until the object is signaled, meaning that the loop will never complete a single run unless a second instance is run.&lt;/p&gt;

&lt;p&gt;But what happens when a second instance is started? Well, WaitForSingleObject returns 0, and we invoke the callback method, which just shows the application. No problem…&lt;/p&gt;

&lt;p&gt;Except that now we’re in a tight loop. We’ll complete the loop, call WaitForSingleInstance, which will now immediately return 0 because it’s been signaled. There’s our high CPU bug. The solution is to call ResetEvent once we’ve shown the application, so that WaitForSingleObject won’t fire off again the next time through:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// thread method will wait on the event, which will signal&lt;/span&gt;
&lt;span class="rem"&gt;// if another instance tries to start&lt;/span&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WaitForSignal()
{
    &lt;span class="kwrd"&gt;while&lt;/span&gt; (&lt;span class="kwrd"&gt;true&lt;/span&gt;)
    {
        &lt;span class="kwrd"&gt;uint&lt;/span&gt; result = WaitForSingleObject(m_EventHandle, INFINITE);

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (result == 0)
        {
            m_Instance.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, m_callback);
            &lt;font color="#0000ff"&gt;&lt;strong&gt;ResetEvent(m_EventHandle);&lt;/strong&gt;&lt;/font&gt;
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Now that we’re calling ResetEvent, we stay out of that tight invocation loop and we’ve licked this CPU bug. To be honest, &lt;a href="http://www.zuneboards.com/forums/zune-news/38143-cause-zune-30-leapyear-problem-isolated.html"&gt;unnecessary loops are a common source of bugs&lt;/a&gt;, and this one still kind of freaks me out even if the timeout on WaitForSingleObject is infinite. Given given time I’d like to look at &lt;a href="http://pietschsoft.com/post/2009/01/Single-Instance-WPF-Application-in-NET-3.aspx"&gt;some other single-instance solutions&lt;/a&gt;, but there’s no real performance driver for that.&lt;/p&gt;

&lt;h3&gt;Just Hacking Here&lt;/h3&gt;

&lt;p&gt;This has pretty much been “&lt;a href="http://codebetter.com/blogs/jay.kimble/archive/2007/06/22/quot-git-r-done-quot-coding.aspx"&gt;Git ‘R Done&lt;/a&gt;” debugging. It’s hacking. Hopefully it’s helpful to you, but I know that there are f&lt;a href="http://blogs.msdn.com/tess/"&gt;olks out there with some real skill at diagnosing application performance issues&lt;/a&gt;, and there are &lt;a href="http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx"&gt;better debugging tools available&lt;/a&gt;, too. How would you go about diagnosing something like this?&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7036566" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jongalloway?a=URZ-zkOCJKg:AQ8AcbJPGOU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jongalloway?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jongalloway?a=URZ-zkOCJKg:AQ8AcbJPGOU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jongalloway?i=URZ-zkOCJKg:AQ8AcbJPGOU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jongalloway?a=URZ-zkOCJKg:AQ8AcbJPGOU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jongalloway?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jongalloway?a=URZ-zkOCJKg:AQ8AcbJPGOU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jongalloway?i=URZ-zkOCJKg:AQ8AcbJPGOU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/URZ-zkOCJKg" height="1" width="1"/&gt;</description><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2009/04/09/troubleshooting-an-intermittent-net-high-cpu-problem.aspx</feedburner:origLink></item><item><title>Windows 7 Betta</title><link>http://feedproxy.google.com/~r/jongalloway/~3/gxAIi4rPlVI/windows-7-betta.aspx</link><pubDate>Mon, 19 Jan 2009 05:58:48 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6844381</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>9</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6844381</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2009/01/18/windows-7-betta.aspx#comments</comments><description>&lt;p&gt;I’ve been running Windows 7 Beta 1 for a week now and really like it. But I’d been looking at desktop for a few days before someone pointed out the little “desktop Easter egg”. &lt;/p&gt;  &lt;p&gt;Here’s the desktop:&lt;/p&gt;  &lt;p&gt;&lt;a title="Windows 7 Beta Default Desktop" href="http://www.flickr.com/photos/36836555@N00/3198850663/"&gt;&lt;img alt="Windows 7 Beta Default Desktop" src="http://static.flickr.com/3443/3198850663_90929410c4.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;See it? &lt;a href="http://www.geekswithblogs.net/kirstinj"&gt;Kirstin Juhl&lt;/a&gt; pointed it out &lt;a href="http://twitter.com/kirstinj/status/1108042948"&gt;on Twitter&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;OK.... I just &amp;quot;got&amp;quot; the fish on Windows 7... it's a beta fish. I never would have put it together.... my 5year-old saw the screen and asked, &amp;quot;Is that a beta fish mom?&amp;quot; I looked and said &amp;quot;Ohhhh!!!&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Technically, it’s a &lt;a href="http://en.wikipedia.org/wiki/Betta"&gt;betta fish&lt;/a&gt;, but I’m not going to quibble about that. So, enjoy the betta!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6844381" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=qRyjWO21"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=QqGd5qgO"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=QqGd5qgO" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=U8DAXjfM"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=qLVnveuA"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=qLVnveuA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/gxAIi4rPlVI" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Windows+7/default.aspx">Windows 7</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2009/01/18/windows-7-betta.aspx</feedburner:origLink></item><item><title>Time released content in ASP.NET</title><link>http://feedproxy.google.com/~r/jongalloway/~3/tU22KyYHd5U/time-released-content-in-asp-net.aspx</link><pubDate>Thu, 15 Jan 2009 09:46:58 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6835978</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>12</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6835978</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2009/01/15/time-released-content-in-asp-net.aspx#comments</comments><description>&lt;p&gt;While working on the PDC2008 website, we had several time-critical updates. There were some announcements that needed to go live on the website at specific times to coincide with other marketing, there were updates to the list of of software being given to attendees that needed to go live right after the keynotes in which they were announced, etc. While some of the site ran on RSS feeds, on some pages we needed the flexibility of static HTML and CSS. While there were plenty of times where I made that sort of deployment by hitting upload in Filezilla at just the right time, there were other times where that wasn’t possible.&lt;/p&gt;  &lt;p&gt;The first time that hit was in August, several months before the conference, when we needed a site update to go live while I was scheduled to be in the middle of a flight. Clearly, a technological solution was needed.&lt;/p&gt;  &lt;h3&gt;Extending The ASP:Placeholder Control&lt;/h3&gt;  &lt;p&gt;Yes, all you ASP.NET MVC hipsters can wander off now – this is an ASP.NET Webforms solution, since the site initially went live when ASP.NET MVC was at Preview 3 (5 months before hitting Beta). But – wait – please leave a comment on how you’d approach this with ASP.NET MVC, would you?&lt;/p&gt;  &lt;p&gt;The ASP.NET Placeholder control is a simple control that renders no markup of its own, it just holds content. It’s great for holding blocks of content which is either displayed or hidden, among other things. So in this case, I inherited from Placeholder and created TimedContentPlaceholder, adding a Start and End property. That let me do this kind of thing:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;PDC:TimedContentPlaceholder&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Start&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10/28/2008 10:30 AM&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="rem"&gt;/* &lt;/span&gt;
&lt;span class="rem"&gt;    Phase 3 (to go live Monday, October 28 – following Keynote 2) : Please add &lt;/span&gt;
&lt;span class="rem"&gt;    as a block at the top of the page under a heading reading, &amp;quot;BITS UPDATE 02&amp;quot;&lt;/span&gt;
&lt;span class="rem"&gt;*/&lt;/span&gt; &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;BITS UPDATE 02&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Windows 7 Ultimate ISO&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h3&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    Burn your own Windows 7 Ultimate DVD using these 32bit &lt;span class="attr"&gt;&amp;amp;amp;&lt;/span&gt; 64bit ISO files.&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;PDC:TimedContentPlaceholder&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;So that content needed to be prestaged, but shouldn’t go live until the specified date and time. Here’s the control which handled that:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TimedContentPlaceholder : System.Web.UI.WebControls.PlaceHolder
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; DateTime? Start { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; DateTime? End { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Uri Redirect { get; set; }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Visible
    {
        get
        { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;base&lt;/span&gt;.Visible &amp;amp;&amp;amp; isInTimeRange(); }
        set
        { &lt;span class="kwrd"&gt;base&lt;/span&gt;.Visible = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
    }

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnInit(EventArgs e)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (Redirect != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (isInTimeRange())
                Page.Response.Redirect(Redirect.AbsoluteUri);
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; isInTimeRange()
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (Start != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; Utility.GetCurrentDateTime() &amp;lt; Start)
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (End != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; Utility.GetCurrentDateTime() &amp;gt;= End)
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;






.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h3&gt;Redirection&lt;/h3&gt;

&lt;p&gt;Most of that’s pretty straightforward, but there are a few extra things there. First of all, there’s the Redirect property. That’s useful when you’ve got a basic page in place which will later redirect to an application or even another server later. For instance, we used that to redirect to the server hosting the session information on the cutover date using something like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;PDC:TimedContentPlaceholder&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Redirect&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;https://sessions.microsoftpdc.com/&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Start&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;8/15/2008 12:00 AM&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h3&gt;Time Machine&lt;/h3&gt;

&lt;p&gt;The second thing is a bigger deal – we weren’t just using DateTime.Now in our time checks, we called out to a function. There were two reasons for that – the simple reason was to provide a central place to handle the timezone conversion between the conference location and the server location. But the main reason was to allow specifying a test time, which allowed us to see how the site would look at any time by passing in querystring arguments. Here’s how Utility.GetCurrentDateTime() worked:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; DateTime GetCurrentDateTime()
{
    &lt;span class="rem"&gt;//Compensate for server being on the east coast&lt;/span&gt;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (IsProduction())
        &lt;span class="kwrd"&gt;return&lt;/span&gt; DateTime.Now.Subtract(&lt;span class="kwrd"&gt;new&lt;/span&gt; TimeSpan(3, 0, 0));

    DateTime testDate;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (HttpContext.Current.Session[&lt;span class="str"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;] == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        &lt;span class="kwrd"&gt;return&lt;/span&gt; DateTime.Now;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (DateTime.TryParse(HttpContext.Current.Session[&lt;span class="str"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;].ToString(), &lt;span class="kwrd"&gt;out&lt;/span&gt; testDate))
        &lt;span class="kwrd"&gt;return&lt;/span&gt; testDate;
    &lt;span class="kwrd"&gt;return&lt;/span&gt; DateTime.Now;
}&lt;/pre&gt;

&lt;p&gt;There was separate code in the masterpage which took a querystring variable and set a session variable with the test date. We also pulled that session variable in Silverlight elements as well, so we could step through the site evolution as the conference approached, each keynote completed, and the conference ended.&lt;/p&gt;

&lt;p&gt;Not rocket science, but it worked for us. How would you have solved this?&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6835978" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=BSSDnqFb"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=p3pNQvRZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=p3pNQvRZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=RDs12sY2"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=XlRLyKzE"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=XlRLyKzE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/tU22KyYHd5U" height="1" width="1"/&gt;</description><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2009/01/15/time-released-content-in-asp-net.aspx</feedburner:origLink></item><item><title>Silverlight Crossdomain Access Workarounds</title><link>http://feedproxy.google.com/~r/jongalloway/~3/JyVscAq3R5Q/silverlight-crossdomain-access-workarounds.aspx</link><pubDate>Fri, 12 Dec 2008 22:41:54 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6780046</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>11</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6780046</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/12/12/silverlight-crossdomain-access-workarounds.aspx#comments</comments><description>&lt;p&gt;I was testing out some typography with Silverlight and figured I’d try grab some text from Wikipedia. I started with the naive approach:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetText()
{
    WebClient webClient = &lt;span class="kwrd"&gt;new&lt;/span&gt; WebClient();
    webClient.DownloadStringCompleted += &lt;span class="kwrd"&gt;new&lt;/span&gt; DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
    webClient.DownloadStringAsync(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;&amp;quot;http://en.wikipedia.org/wiki/george_washington/&amp;quot;&lt;/span&gt;));
}

&lt;span class="kwrd"&gt;void&lt;/span&gt; webClient_DownloadStringCompleted(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, DownloadStringCompletedEventArgs e)
{&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;    //This next line throws an exception&lt;/span&gt; 
    &lt;span class="kwrd"&gt;string&lt;/span&gt; fullText = e.Result;&lt;br /&gt;
    &lt;span class="rem"&gt;//Do some neat stuff...&lt;/span&gt;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;






.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;That throws a pretty ambiguous exception: 'e.Result' threw an exception of type 'System.Reflection.TargetInvocationException'. The InnerException just shows “Security Error.” The source of the Security Error is that Wikipedia doesn’t have a Crossdomain ( crossdomain.xml) policy file.&lt;/p&gt;

&lt;h2&gt;Best Case: Site supports crossdomain.xml or clientaccesspolicy.xml&lt;/h2&gt;

&lt;p&gt;A lot’s been written about the Site Of Origin policy for both browsers and RIA clients like Silverlight and Flash, so I won’t rehash them in too much detail. The idea is that, for security reasons, code running in a webpage (Javascript, Silverlight, or Flash) should generally only be able to access the domain that hosts the webpage. Silverlight followed Flash’s lead and allows for cross-domain calls if the site it’s accessing has a crossdomain.xml file which permits it. This doesn’t really protect against cross-site scripting (XSS) attacks, since – &lt;a href="http://www.west-wind.com/weblog/posts/279929.aspx"&gt;as Rick Strahl noted&lt;/a&gt; – any malicious site can post a crossdomain.xml file (e.g. &lt;a href="http://evilsite.com/crossdomain.xml"&gt;http://evilsite.com/crossdomain.xml&lt;/a&gt;) and RIA’s will then be allowed to pass information home. Rather, this is a safeguard against &lt;a href="http://www.codinghorror.com/blog/archives/001171.html"&gt;cross-site request forgery (XSRF) attacks&lt;/a&gt;. I think &lt;a href="http://www.west-wind.com/weblog/posts/279929.aspx#281028"&gt;Steve Sanderson’s comment&lt;/a&gt; sums this up pretty well:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What you're missing is the CRSF scenario. Current browsers prohibit me, from &lt;a href="http://www.pirate.com"&gt;www.pirate.com&lt;/a&gt;, using script to cause a GET or POST request to &lt;a href="http://www.bank.com"&gt;www.bank.com&lt;/a&gt; and actually reading the response data back in my script that I host on&lt;a href="http://www.pirate.com"&gt;www.pirate.com&lt;/a&gt;. This is important because requests sent to &lt;a href="http://www.bank.com"&gt;www.bank.com&lt;/a&gt; will include the cookies for that domain and may therefore be treated as authenticated requests, for which the server will return sensitive information. You don't want that sensitive information to be retrievable by the script running in &lt;a href="http://www.pirate.com"&gt;www.pirate.com&lt;/a&gt;. &lt;/p&gt;

  &lt;p&gt;This […] allows cross-domain requests to read data across domains *only* if the target domain opts-in on a *per-request* basis. Obviously, &lt;a href="http://www.bank.com"&gt;www.bank.com&lt;/a&gt; isn't going to opt in for any sensitive URLs, but it might choose to do so for some kind of non-sensitive API (stock quotes or whatever).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, crossdomain protection means that I can use a potentially evil Silverlight application without worrying that it’s going to use my browser context to try to access my bank or e-mail or other trusted data, because my bank isn’t going to allow cross-domain access. So evilsite.com can “phone home” with any cookies it has access to, but it can’t use my authenticated status to make requests to my bank.&lt;/p&gt;

&lt;p&gt;Tim Heuer has written &lt;a href="http://timheuer.com/blog/Tags/cross%20domain/default.aspx"&gt;several good posts on cross-domain issues.&lt;/a&gt; I especially recommend his &lt;a href="http://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx"&gt;crossdomain.xml&lt;/a&gt; helpers for Visual Studio if you need to write your own crossdomain.xml file to expose your own services.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://blogs.msdn.com/silverlightws/"&gt;Silverlight Web Services Team blog&lt;/a&gt; has some good &lt;a href="http://blogs.msdn.com/silverlightws/archive/2008/03/30/some-tips-on-cross-domain-calls.aspx"&gt;troubleshooting&lt;/a&gt; &lt;a href="http://blogs.msdn.com/silverlightws/archive/2008/04/16/debugging-web-service-usage-in-silverlight-2.aspx"&gt;tips&lt;/a&gt; in case you’re having trouble connecting to a site which has a crossdomain.xml file, and you can use this simple &lt;a href="http://www.franksworld.com/Utilities/CrossDomainPolicyChecker/Default.aspx"&gt;Silverlight Cross Domain Policy File Checker&lt;/a&gt; to quickly check sites. My top recommendations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Make sure you’re not testing from a file:// URL, since websites running under file:// can’t make cross-domain calls. You need to test with an http:// page – for instance, using a test ASPX page running in the Visual Studio WebDev.exe test server. &lt;/li&gt;

  &lt;li&gt;Browse to the crossdomain.xml file (e.g. &lt;a href="http://twitter.com/crossdomain.xml"&gt;http://twitter.com/crossdomain.xml&lt;/a&gt;) to make sure that it’s there. &lt;/li&gt;

  &lt;li&gt;Test in Fiddler, Firebug, or the IE Web Developer Toolbar to watch network traffic and verify your Silverlight app is trying to connect to the right URL for crossdomain.xml. &lt;/li&gt;

  &lt;li&gt;Build a very simple test Silverlight app which does nothing but make the cross-domain call. &lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Note: clientaccesspolicy.xml vs. crossdomain.xml&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/cesardelatorre/archive/2008/09/29/using-silverlight-2-0-clientaccesspolicy-xml-vs-crossdomain-xml-for-web-service-cross-domain-access.aspx"&gt;Silverlight supports a subset of Flash’s crossdomain.xml file format, but doesn’t allow for fine grained control&lt;/a&gt;. If you’re exposing your own services to Silverlight, you’ll want to look at clientaccesspolicy.xml; if you’re supporting Flash and Silverlight you should ideally have both. However, in this post I’m concentrating on accessing external resources, which at this point are more likely to have crossdomain.xml due to the fact that it works on Flash as well.&lt;/p&gt;

&lt;h2&gt;Second Best: JSON Requests&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.json.org/"&gt;JSON requests&lt;/a&gt; get a free ride – they can connect to any any site, regardless of whether they have a crossdomain.xml file. That’s probably because JSON is just an object notation (name/value pairs and ordered lists), rather than direct script. While it can be used for evil (via the evil eval()), it’s more of a serialization format than a script. Regardless of the reasons, it’s allowed to cross domains when other calls can’t.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.netcrucible.com/blog/"&gt;Joshua Allen&lt;/a&gt; recently wrote about &lt;a href="http://www.netcrucible.com/blog/2008/10/13/cross-domain-json-with-silverlight/"&gt;making JSON requests from Silverlight&lt;/a&gt;. His method depends on some Javascript methods being included in the host webpage, but it’s possible to append the Javascript to your DOM from Silverlight if you’re writing an embeddable widget (say, for instance, for the &lt;a href="http://2009.visitmix.com/MIXtify/TenKGallery.aspx"&gt;MIX09 10K Challenge&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Read Joshua’s post for the full details, but the basic idea is that you have an injection script in your page, like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; injectScript(url) { 
   &lt;span class="kwrd"&gt;var&lt;/span&gt; head = document.getElementsByTagName(‘head’)[0]; 
   &lt;span class="kwrd"&gt;var&lt;/span&gt; script = document.createElement(’script’); 
   script.type = ‘text/javascript’; 
   script.src = url; 
   head.appendChild(script); 
}; &lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Then we invoke the injection script from our Silverlight application:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;HtmlPage.Window.Invoke(&lt;span class="str"&gt;&amp;quot;injectScript&amp;quot;&lt;/span&gt;, url);&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;The script source needs to point to a URL that returns JSON, and preferably wrapped in a callback function call, like this:&lt;/p&gt;

&lt;p&gt;callback({&amp;quot;info&amp;quot;: &amp;quot;important info here&amp;quot;}&lt;/p&gt;

&lt;p&gt;Then (continuing to quote Joshua Allen’s example), the Javascript callback calls into a scriptable method in our Silverlight application:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;function callback(obj) { 
   var silverlight = document.getElementById(&lt;span class="str"&gt;&amp;quot;silverlight&amp;quot;&lt;/span&gt;); 
   &lt;span class="kwrd"&gt;if&lt;/span&gt; (silverlight) { 
        silverlight.Content.Page.PassData(JSON.stringify(obj)); 
   } 
};&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h4&gt;Note 1: About that JSON object&lt;/h4&gt;

&lt;p&gt;The call to JSON.stringify() is &lt;a href="http://blogs.msdn.com/ie/archive/2008/09/10/native-json-in-ie8.aspx"&gt;natively supported in IE8&lt;/a&gt;, &lt;a href="https://wiki.mozilla.org/Firefox3.1/Features#Gecko_1.9.1"&gt;Firefox 3.1&lt;/a&gt;, and is &lt;a href="https://bugs.webkit.org/show_bug.cgi?id=20031"&gt;slowly working its way into Webkit (Safari, Chrome)&lt;/a&gt;. But it’s easy to add JSON for other browsers by using the parser distributed on json.org: &lt;a title="http://www.json.org/json2.js" href="http://www.json.org/json2.js"&gt;http://www.json.org/json2.js&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Note 2: About that Callback&lt;/h4&gt;

&lt;p&gt;By convention, most API’s that return JSON will take a parameter for the name of the callback function. For instance, here we’re telling the html-whitelist service to call mySuperFunction with the results:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://html-whitelist.appspot.com/whitelist?content=%3Cscript%3Escary+html%3C/script%3E&amp;amp;json=1&amp;amp;callback=mySuperFunction"&gt;http://html-whitelist.appspot.com/whitelist?content=%3Cscript%3Escary+html%3C/script%3E&amp;amp;json=1&amp;amp;callback=mySuperFunction&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flickr defaults to jsonFlickrApi, but allows you to override the callback name with &amp;amp;jsoncallback=muSuperFunction&lt;/p&gt;

&lt;p&gt;&lt;a title="http://api.flickr.com/services/feeds/photos_public.gne?tags=silverlight&amp;amp;lang=en-us&amp;amp;format=json&amp;amp;jsoncallback=muSuperFunction" href="http://api.flickr.com/services/feeds/photos_public.gne?tags=silverlight&amp;amp;lang=en-us&amp;amp;format=json&amp;amp;jsoncallback=mySuperFunction"&gt;http://api.flickr.com/services/feeds/photos_public.gne?tags=silverlight&amp;amp;lang=en-us&amp;amp;format=json&amp;amp;jsoncallback=mySuperFunction&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;returns this (only showing the first image):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;mySuperFunction({    
        &lt;span class="str"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;Recent Uploads tagged silverlight&amp;quot;&lt;/span&gt;,
        &lt;span class="str"&gt;&amp;quot;link&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;http://www.flickr.com/photos/tags/silverlight/&amp;quot;&lt;/span&gt;,
        &lt;span class="str"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
        &lt;span class="str"&gt;&amp;quot;modified&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;2008-12-11T19:22:44Z&amp;quot;&lt;/span&gt;,
        &lt;span class="str"&gt;&amp;quot;generator&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;http://www.flickr.com/&amp;quot;&lt;/span&gt;,
        &lt;span class="str"&gt;&amp;quot;items&amp;quot;&lt;/span&gt;: [
       {
            &lt;span class="str"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;NEC Biglobe album viewer&amp;quot;&lt;/span&gt;,
            &lt;span class="str"&gt;&amp;quot;link&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;http://www.flickr.com/photos/adamkinney/3100209567/&amp;quot;&lt;/span&gt;,
            &lt;span class="str"&gt;&amp;quot;media&amp;quot;&lt;/span&gt;: {&lt;span class="str"&gt;&amp;quot;m&amp;quot;&lt;/span&gt;:&lt;span class="str"&gt;&amp;quot;http://farm4.static.flickr.com/3294/3100209567_43d738e294_m.jpg&amp;quot;&lt;/span&gt;},
            &lt;span class="str"&gt;&amp;quot;date_taken&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;2008-12-11T11:22:44-08:00&amp;quot;&lt;/span&gt;,
            &lt;span class="str"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;description here…&amp;quot;&lt;/span&gt;,
            &lt;span class="str"&gt;&amp;quot;published&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;2008-12-11T19:22:44Z&amp;quot;&lt;/span&gt;,
            &lt;span class="str"&gt;&amp;quot;author&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;nobody@flickr.com (adKinn)&amp;quot;&lt;/span&gt;,
            &lt;span class="str"&gt;&amp;quot;author_id&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;83775906@N00&amp;quot;&lt;/span&gt;,
            &lt;span class="str"&gt;&amp;quot;tags&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;album silverlight deepzoom necbiglobe&amp;quot;&lt;/span&gt;
       }
        ]
}) &lt;/pre&gt;

&lt;h4&gt;&lt;/h4&gt;

&lt;h4&gt;Note 3: What to do with that JSON data?&lt;/h4&gt;

&lt;p&gt;In this sample I’m just passing the JSON data back to my Silverlight application as a string. You’re not on your own dealing with parsing that string, though – the System.Runtime.Serialization.Json namespace can handle that for you. &lt;a href="http://www.85turns.com/2008/03/12/consume-a-json-object-in-silverlight/"&gt;Corey Schuman’s written a nice walkthrough on how to consume a JSON object in Silverlight&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;No JSON? Don’t waste your time on IFRAME / JSONP hacks&lt;/h2&gt;

&lt;p&gt;I spent some time looking into ways to pull data from a URL that doesn’t supply data in JSON format. My conclusion is that it’s a bad idea. While you may be able to sneak something by an older browser, you’re essentially hacking at this point, and newer browsers will block it.&lt;/p&gt;

&lt;p&gt;For instance, let’s try to create an IFRAME and load the content:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Page() 
{ 
    InitializeComponent(); 

    HtmlPage.RegisterScriptableObject(&lt;span class="str"&gt;&amp;quot;Page&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;this&lt;/span&gt;);   

    iframe = HtmlPage.Document.CreateElement(&lt;span class="str"&gt;&amp;quot;iframe&amp;quot;&lt;/span&gt;); 
    iframe.Id = &lt;span class="str"&gt;&amp;quot;invisibleIframe&amp;quot;&lt;/span&gt;; 
    iframe.SetProperty(&lt;span class="str"&gt;&amp;quot;src&amp;quot;&lt;/span&gt;, url); 
    iframe.SetStyleAttribute(&lt;span class="str"&gt;&amp;quot;display&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;none&amp;quot;&lt;/span&gt;); 
    iframe.SetAttribute(&lt;span class="str"&gt;&amp;quot;onload&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;contentLoaded&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;// call a function which calls silverlight.Content.Page.Loaded() &lt;/span&gt;
    HtmlElement body = (HtmlElement)HtmlPage.Document.GetElementsByTagName(&lt;span class="str"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;)[0]; 
    body.AppendChild(iframe); 
} 

[ScriptableMember] 
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Loaded() 
{ 
    HtmlWindow content = (HtmlWindow)iframe.GetProperty(&lt;span class="str"&gt;&amp;quot;contentWindow&amp;quot;&lt;/span&gt;); 
    HtmlElement doc = (HtmlElement)content.GetProperty(&lt;span class="str"&gt;&amp;quot;document&amp;quot;&lt;/span&gt;); 
    HtmlElement body = (HtmlElement)doc.GetProperty(&lt;span class="str"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;); 
    &lt;span class="kwrd"&gt;string&lt;/span&gt; innerHTML = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)body.GetProperty(&lt;span class="str"&gt;&amp;quot;innerHTML&amp;quot;&lt;/span&gt;); 
    Output.Text = innerHTML; 
}&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;While that will cause an IFRAME to be created and load the document, the IFRAME content isn’t accessible to Silverlight (or to Javascript functions running in the page, for that matter). Makes sense, the Single Origin Policy is being enforced.&lt;/p&gt;

&lt;p&gt;Also a no-go: using the JSON approach on a URL that’s not returning JSON. Two problems:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Script tags with an external source are evaluated when loaded, and if they’re not valid Javascript you’ll get an error message. For example: 
    &lt;br /&gt;&amp;lt;script src=”http://google.com&amp;gt;&amp;lt;/script&amp;gt; 

    &lt;br /&gt;will try to execute the HTML code of the Google home page as HTML and will throw Javascript errors (depending on the user’s browser settings). &lt;/li&gt;

  &lt;li&gt;We won’t be able to access the content that the script tag contains from Silverlight or Javascript – it’s blocked by the the Site Of Origin policy. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Are there ways to hack around this? Probably. But, I’m convinced that it’s a losing battle – if you get it to work, you’re taking advantage of a bug. Browsers are enforcing a rule, and if you find a way around the rule, you should expect that it’ll stop working at some point, or won’t work on all the browsers you want to support.&lt;/p&gt;

&lt;h2&gt;Crossdomain.xml and JSON Friendly Proxies&lt;/h2&gt;

&lt;p&gt;So, what do you do if you want access to a web resource, but the site doesn’t provide a crossdomain.xml policy or expose data in JSON format?&lt;/p&gt;

&lt;p&gt;The answer is to use a proxy who does allow access. You can write your own, of course. I wrote &lt;a href="http://weblogs.asp.net/jgalloway/archive/2007/06/14/calling-an-asmx-webservice-from-silverlight-use-a-static-port.aspx"&gt;some posts&lt;/a&gt; &lt;a href="http://weblogs.asp.net/jgalloway/archive/2007/07/03/silverlight-1-1-alpha-cross-domain-webservice-access-makes-mashups-tricky.aspx"&gt;about that&lt;/a&gt; back in the Silverlight 1.1 days, but of course that showoff Tim Heuer’s gone and upstaged me with a super-nice post on &lt;a href="http://timheuer.com/blog/archive/2008/07/05/access-amazon-s3-services-with-silverlight-2.aspx"&gt;how to call Amazon S3 Services from Silverlight 2 with a custom webservice proxy&lt;/a&gt;. And to add insult to injury, he topped it off with another post on &lt;a href="http://timheuer.com/blog/archive/2008/06/03/use-silverlight-with-any-feed-without-cross-domain-files.aspx"&gt;reading data and RSS with Silverlight and no cross-domain policy&lt;/a&gt;. He points out Yahoo Pipes, which is a workable solution for many cases, with some &lt;a href="http://pipes.yahoo.com/pipes/docs?doc=sources#FetchPage"&gt;important caveats&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;b&gt;Note on usage:&lt;/b&gt; The module will only fetch HTML pages under &lt;b&gt;200k&lt;/b&gt; and the page must also be indexable (I.E. allowed by the site's robots.txt file.) If you do not want your page made available to this module, please add it to your robots.txt file, or add the following tag into the page's &amp;lt;head&amp;gt; element:&lt;/p&gt;

  &lt;p&gt;&amp;lt;META NAME=&amp;quot;ROBOTS&amp;quot; CONTENT=&amp;quot;NOINDEX&amp;quot;&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, I created a simple pipe which grabs the HTML from a page and returns it in any of the formats Pipes supports (including JSON):&lt;/p&gt;

&lt;p&gt;&lt;a title="url2json via Yahoo Pipes" href="http://www.flickr.com/photos/36836555@N00/3102577291/"&gt;&lt;img alt="url2json via Yahoo Pipes" src="http://farm4.static.flickr.com/3177/3102577291_1edf11ecbe.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, we can use it to scrape the HTML from the Silverlight page on Wikipedia and get access to the HTML content from our Silverlight application like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pipes.yahoo.com/jongalloway/url2json?URL=http://en.wikipedia.com/wiki/Silverlight&amp;amp;_render=json"&gt;http://pipes.yahoo.com/jongalloway/url2json?URL=http://en.wikipedia.com/wiki/Silverlight&amp;amp;_render=json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That Pipe is published and is freely accessible, so you can either use it or clone it for your own use if you’d like. So if you’re after HTML content, that approach works provided the page is indexable and is &amp;lt;200KB. If not, you can see if the content’s in the Wayback Machine, since archive.org has a crossdomain policy file. To get the latest version of a page from the Wayback Machine, just use this format: &lt;a href="http://web.archive.org/URL"&gt;http://web.archive.org/URL&lt;/a&gt;, e.g. &lt;a href="http://web.archive.org/http://microsoft.com"&gt;http://web.archive.org/http://microsoft.com&lt;/a&gt;. They don’t provide the content in JSON format, but you can get it via a WebClient request.&lt;/p&gt;

&lt;p&gt;If you want access to data that’s got an RSS feed, you’ve got a lot more options. Feedburner supports crossdomain, and there are piles of Feed To JSON pipes on Yahoo Pipes, such as &lt;a href="http://pipes.yahoo.com/pipes/pipe.info?_id=NFpLzYbC2xGoZ8blE2_cUw"&gt;jsonifier&lt;/a&gt;. For instance, &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt; doesn’t (yet) support crossdomain access, but we can get a JSON feed of questions tagged with Silverlight (&lt;a title="http://stackoverflow.com/feeds/tag/silverlight" href="http://stackoverflow.com/feeds/tag/silverlight"&gt;http://stackoverflow.com/feeds/tag/silverlight&lt;/a&gt;) with that jsonifier pipe:&lt;/p&gt;

&lt;p&gt;&lt;a title="http://pipes.yahoo.com/pipes/pipe.run?_id=NFpLzYbC2xGoZ8blE2_cUw&amp;amp;feed_url=http://stackoverflow.com/feeds/tag/silverlight&amp;amp;show=400&amp;amp;url_filt=__nomatch___&amp;amp;_render=json" href="http://pipes.yahoo.com/pipes/pipe.run?_id=NFpLzYbC2xGoZ8blE2_cUw&amp;amp;feed_url=http://stackoverflow.com/feeds/tag/silverlight&amp;amp;show=400&amp;amp;url_filt=__nomatch___&amp;amp;_render=json"&gt;http://pipes.yahoo.com/pipes/pipe.run?_id=NFpLzYbC2xGoZ8blE2_cUw&amp;amp;feed_url=http://stackoverflow.com/feeds/tag/silverlight&amp;amp;show=400&amp;amp;url_filt=__nomatch___&amp;amp;_render=json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and if we wanted it in XML format, we could just change the _render action:&lt;/p&gt;

&lt;p&gt;&lt;a title="http://pipes.yahoo.com/pipes/pipe.run?_id=NFpLzYbC2xGoZ8blE2_cUw&amp;amp;feed_url=http://stackoverflow.com/feeds/tag/silverlight&amp;amp;show=400&amp;amp;url_filt=__nomatch___&amp;amp;_render=json" href="http://pipes.yahoo.com/pipes/pipe.run?_id=NFpLzYbC2xGoZ8blE2_cUw&amp;amp;feed_url=http://stackoverflow.com/feeds/tag/silverlight&amp;amp;show=400&amp;amp;url_filt=__nomatch___&amp;amp;_render=xml"&gt;http://pipes.yahoo.com/pipes/pipe.run?_id=NFpLzYbC2xGoZ8blE2_cUw&amp;amp;feed_url=http://stackoverflow.com/feeds/tag/silverlight&amp;amp;show=400&amp;amp;url_filt=__nomatch___&amp;amp;_render=xml&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Calls To Action&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Lobby sites which provide external data to support crossdomain.xml. Be sure to let them know that it will enable both Flash and Silverlight to access their data. &lt;/li&gt;

  &lt;li&gt;I’ve started a community wiki at Stack Overflow to list &lt;a href="http://stackoverflow.com/questions/352039/sites-which-support-crossdomainxml-to-allow-flash-and-silverlight-access"&gt;sites which do support crossdomain.xml&lt;/a&gt;. Please add to the list if you know of some I missed. &lt;/li&gt;

  &lt;li&gt;Write some cool mashups! &lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Epilogue&lt;/h4&gt;

&lt;p&gt;Oh, and wikipedia? The thing that got me started on this quest? &lt;a href="http://en.wikipedia.org/w/api.php"&gt;It turns out that they do have an API that returns JSON&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6780046" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=HkjYYONk"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=3n1ANPHZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=3n1ANPHZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=uc6MzHrq"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=Qc7uU9AC"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=Qc7uU9AC" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/JyVscAq3R5Q" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Browsers+_2F00_+Web+Development/default.aspx">Browsers / Web Development</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Silverlight/default.aspx">Silverlight</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/12/12/silverlight-crossdomain-access-workarounds.aspx</feedburner:origLink></item><item><title>Looking back at MicrosoftPDC.com (from the inside)</title><link>http://feedproxy.google.com/~r/jongalloway/~3/Zh1Tz3AOycI/looking-back-at-microsoftpdc-com-from-the-inside.aspx</link><pubDate>Mon, 24 Nov 2008 20:13:28 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6752118</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6752118</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/11/24/looking-back-at-microsoftpdc-com-from-the-inside.aspx#comments</comments><description>&lt;p&gt;I had the privilege of working on the &lt;a href="http://microsoftpdc.com/"&gt;MicrosoftPDC.com&lt;/a&gt; website as lead developer for the past several months. The process hasn’t been kind to my blogging schedule lately, but the experience definitely taught me quite a bit: working with the top-notch Microsoft developer evangelism team, setting up a site for maximum flexibility, setting up the Silverlight experience, and troubleshooting some interesting issues during the conference. I’m going to run through several of these at a high level and may dig into some of these in more detail later (so comment if you want to hear more about something).&lt;/p&gt;  &lt;p&gt;As I’m describing some of these, remember that while I was the lead developer, these sites were built by a team. The project and UI experience were managed by the Microsoft Developer Evangelism team, the visual design was based on the overall conference visual design concept. I lead the development team which included some of our super-awesome developers and designers here at &lt;a href="http://vertigo.com/"&gt;Vertigo&lt;/a&gt;&lt;sup&gt;1&lt;/sup&gt;. So I’ll take some of the credit for what went well and most of the blame for what went wrong. Also, while the experiences were kept in sync, we didn’t do any of the work for the the registration and live conference session information (including video links, evals, etc.). register.microsoftpdc.com and sessions.microsoftpdc.com didn’t even live on the same server as the rest of the micorosoftpdc.com site.&lt;/p&gt;  &lt;p&gt;This site used ASP.NET Webforms rather than ASP.NET MVC. We built the first release of the PDC2008 site in April - May 2008, and ASP.NET MVC was at a Preview 2 release stage back then. I love new and shiny, but I couldn’t in good conscience recommend that we launch the PDC site on MVC so early on. As I worked on it, though, I continually asked myself, “Will this be the last ASP.NET Webforms site I’ll deploy?”&lt;/p&gt;  &lt;h2&gt;Reuse Through Simplicity&lt;/h2&gt;  &lt;p&gt;We originally built a single site – microsoftpdc.com – but it’s turned into quite a bit more than that. The original microsoftpdc.com site was a pretty simple “brochure” site, designed to give people the information they needed to get to the PDC conference. The week before the conference, we shifted to a “live experience” mode that included a re-skin and changes to the sitemap to present information that was relevant to people attending the conference or keeping up with it online. That same week, we launched two other sites: m.microsoftpdc.com (a mobile site for PDC attendees) and 2009.visitmix.com, an information site for the MIX09 conference. While all these these sites looked pretty different, they all ran on the same code base. As I look back at things that went well, I think this is one thing we got right - we struck a good balance on the design so that we were able to heavily reuse the site code without having to tell the client that simple changes would take days because our system was too complicated.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a title="MicrosoftPDC Home Page - &amp;quot;Classic&amp;quot; view" href="http://www.flickr.com/photos/36836555@N00/3053732193/"&gt;&lt;img alt="MicrosoftPDC Home Page - &amp;quot;Classic&amp;quot; view" src="http://farm4.static.flickr.com/3213/3053732193_5f3ece8d5d_m.jpg" border="0" /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;a title="Microsoft PDC - Keynote view" href="http://www.flickr.com/photos/36836555@N00/3054564638/"&gt;&lt;img alt="Microsoft PDC - Keynote view" src="http://farm4.static.flickr.com/3061/3054564638_37bf24419f_m.jpg" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;a title="MIX09 Home Page" href="http://www.flickr.com/photos/36836555@N00/3055703254/"&gt;&lt;img alt="MIX09 Home Page" src="http://farm4.static.flickr.com/3051/3055703254_4e8d960d78_m.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here are some of the things that helped keep us flexible:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CSS based design &lt;/li&gt;    &lt;li&gt;Resisting the urge to premature generalization &lt;/li&gt;    &lt;li&gt;A great client – we were able to be involved in the user experience planning at a level which allowed us to define some consistency across the site &lt;/li&gt;    &lt;li&gt;Feed-based content as an ultra-lightweight CMS&lt;/li&gt;    &lt;li&gt;Master pages used on all pages in the site except the home page – for a while, the same site would display in “PDC Classic”, “PDC Live”, and “MIX” modes with a querystring switch (disabled in production) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The master-page / CSS switching worked surprisingly well – for instance, here’s the same agenda page shown before and after the theme switch:&lt;/p&gt;  &lt;p&gt;&lt;a title="MicrosoftPDC Timeline Screen - " href="http://www.flickr.com/photos/36836555@N00/3053732427/" view?="view?" Classic?="Classic?"&gt;&lt;img alt="MicrosoftPDC Timeline Screen - " src="http://farm4.static.flickr.com/3036/3053732427_b122a4fd8a.jpg" border="0" view?="view?" Classic?="Classic?" /&gt;&lt;/a&gt;&lt;a title="MicrosoftPDC Timeline Screen - &amp;quot;Live&amp;quot; view" href="http://www.flickr.com/photos/36836555@N00/3054565302/"&gt;&lt;img alt="MicrosoftPDC Timeline Screen - &amp;quot;Live&amp;quot; view" src="http://farm4.static.flickr.com/3291/3054565302_cc5f37e833.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We didn’t use the built-in theme system for ASP.NET, as &lt;a href="http://adam.kahtava.com/journal/2006/11/09/The+Problems+With+Themes+Skins+And+Cascading+Style+Sheets+CSS++Where+It+All+Falls+Apart.aspx"&gt;it unfortunately doesn’t play that well with CSS based design and conditional stylesheets&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Look, Ma! No database!&lt;/h2&gt;  &lt;p&gt;One interesting thing about these sites is that they pulled their dynamic content from a variety of feeds. I built out a control which basically piped an RSS feed through an HTML cleaner to a ListView control. The ListView control just output the content in unstyled HTML, so it was reused all over the place. The HTML cleaner did a few things – stripped ugly HTML (including Word HTML markup) and did a “smart truncation” of the HTML content so we’d a desired character length with adjustments so we split at word boundaries and didn’t leave unclosed tags. I used the Html Agility Pack to handle the HTML parsing so I could focus on the logic.&lt;/p&gt;  &lt;h2&gt;The Mobile Site – m.microsoftpdc.com&lt;/h2&gt;  &lt;p&gt;While I set the technical direction and took care of some polish areas here, I really can’t take too much credit for what I consider to be one of the best features of the microsoftpdc.com site. David Shadle, the (awesome) creative director for the PDC online experience, designed a mobile experience exactly how I’ve always thought they should be done – as a focused mini-site specifically created for attendees at the conference. Then Jim Lin built it. I helped with some polish by following &lt;a href="http://www.hanselman.com/blog/MakeYourWebsiteMobileAndIPhoneFriendlyAddHomeScreenIPhoneIconsAndAdjustTheViewPort.aspx"&gt;Scott Hanselman’s iPhone webdev tips&lt;/a&gt; (adding the iPhone home screen icon and adjusting the viewport), but mostly I just got out of the way and let it happen.&lt;/p&gt;  &lt;p&gt;&lt;a title="PDC Mobile Home (Emulator)" href="http://www.flickr.com/photos/36836555@N00/3054564860/"&gt;&lt;img alt="PDC Mobile Home (Emulator)" src="http://farm4.static.flickr.com/3027/3054564860_88b59aa099.jpg" border="0" /&gt;&lt;/a&gt;&lt;a title="PDC Mobile - Schedule" href="http://www.flickr.com/photos/36836555@N00/3054564708/"&gt;&lt;img alt="PDC Mobile - Schedule" src="http://farm4.static.flickr.com/3003/3054564708_d63915ba1d.jpg" border="0" /&gt;&lt;/a&gt;&lt;a title="PDC Mobile Session Detail (Emulator)" href="http://www.flickr.com/photos/36836555@N00/3054564934/"&gt;&lt;img alt="PDC Mobile Session Detail (Emulator)" src="http://farm4.static.flickr.com/3177/3054564934_f5599c6658.jpg" border="0" /&gt;&lt;/a&gt;&lt;a title="PDC Mobile - Session Search" href="http://www.flickr.com/photos/36836555@N00/3054564780/"&gt;&lt;img alt="PDC Mobile - Session Search" src="http://farm4.static.flickr.com/3135/3054564780_03a13b1513.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here’s that fancy iPhone home screen icon. Phear my graphics skillz!!!&lt;/p&gt;  &lt;p&gt;&lt;a title="MicrosoftPDC - iPhone Home Screen" href="http://www.flickr.com/photos/36836555@N00/3053732473/"&gt;&lt;img alt="MicrosoftPDC - iPhone Home Screen" src="http://farm4.static.flickr.com/3247/3053732473_9a977585d1.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;The Silverlight Live Experience&lt;/h2&gt;  &lt;p&gt;I put a lot of work into this, and it was probably one of my favorite features despite the fact that it was only live for 4 hours or so (during the webcast keynotes). We thought about how we watched conference keynotes – frantically switching between the video and Twitter – and we tried to set up an experience that would make people like us – geeks who love keynotes - really happy. We built a tiny Twitter client in Silverlight which pulled directly from search.twitter.com, and fortunately everything (Twitter included) held up well during the keynotes.&lt;/p&gt;  &lt;p&gt;&lt;a title="Microsoft PDC - Keynote view by jongalloway, on Flickr" href="http://www.flickr.com/photos/jongalloway/3054564638/"&gt;&lt;img height="703" alt="Microsoft PDC - Keynote view" src="http://farm4.static.flickr.com/3061/3054564638_4d22fd75d4_o.png" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You know what took way more time than you’d expect? &lt;a href="http://mark-dot-net.blogspot.com/2008/04/styling-listbox-in-silverlight-part-2.html"&gt;Styling the scrollbar in the Twitter area&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Hovering over the event photo thumbnails expanded to a Silverlight Deep Zoom photo explorer thing…&lt;/p&gt;  &lt;p&gt;&lt;a title="PDC Flickr - Zoomed Out" href="http://www.flickr.com/photos/36836555@N00/3055816968/"&gt;&lt;img alt="PDC Flickr - Zoomed Out" src="http://farm4.static.flickr.com/3074/3055816968_9dc2ddded2.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;… and clicking on the thumbnails or spinning your mouse’s scroll-wheel would of course zoom you in on the photos, in all their Flickr medium-resolution glory! Of course, there were some dangers – if you zoomed in on the wrong photos, you could get stuck in a Deep Zoom recursion situation which has been known to collapse the very fabric of spacetime:&lt;/p&gt;  &lt;p&gt;&lt;a title="PDC Flickr - Deep Zoom Recursion" href="http://www.flickr.com/photos/36836555@N00/3055816922/"&gt;&lt;img alt="PDC Flickr - Deep Zoom Recursion" src="http://farm4.static.flickr.com/3024/3055816922_3ac38a52ca.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We leveraged a system &lt;a href="http://www.vertigo.com"&gt;Vertigo&lt;/a&gt; has&amp;#160; developed to enhance and manage Deep Zoom experiences. It’s called &lt;a href="http://vertigo.com/deepzoom.aspx"&gt;Big Picture&lt;/a&gt;, and it powers some other cool Deep Zoom projects like the &lt;a href="http://www.mojaveexperiment.com/"&gt;Mojave Experiment&lt;/a&gt; site and &lt;a href="http://bigpicture.vertigo.com/obama/default.html"&gt;this page which displays all the newspaper headlines with the news of the Obama’s recent election victory&lt;/a&gt;. In addition to handling UI details like laying out the photos in a nice justified rectangle, there’s a server piece running behind the scenes that builds the photo collections. We used the Big Picture server’s Flickr integration system, which ran a scheduled build process against the latest Flickr photos with the PDC2008 tag. That task took some management as the collection grew during the conference, but fortunately &lt;a href="http://blogs.vertigo.com/personal/jwalters/Blog/default.aspx"&gt;Jay Walters&lt;/a&gt; (the developer who did most of the work implemented the PDC / Deep Zoom experience) was on the ball, scaling our build times to match the photo collection size.&lt;/p&gt;  &lt;p&gt;What did you think? What did we get right? What did we do wrong?&lt;/p&gt;  &lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; I mentioned that I work at &lt;a href="http://vertigo.com"&gt;Vertigo&lt;/a&gt;, I love my job, and we’re &lt;a href="http://vertigo.com/Jobs.aspx"&gt;hiring&lt;/a&gt;, didn’t I? Yes? Great!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6752118" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=D8Rq31I2"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=SbUD1WAg"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=SbUD1WAg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=PWwN5hSK"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=dJCkZ97P"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=dJCkZ97P" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/Zh1Tz3AOycI" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Silverlight/default.aspx">Silverlight</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/11/24/looking-back-at-microsoftpdc-com-from-the-inside.aspx</feedburner:origLink></item><item><title>Running Silverlight 2 on Google Chrome using the Chrome Dev Channel</title><link>http://feedproxy.google.com/~r/jongalloway/~3/XoyBqyoFlMs/running-silverlight-2-on-google-chrome-using-the-chrome-dev-channel.aspx</link><pubDate>Wed, 17 Sep 2008 07:29:31 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6628872</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>18</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6628872</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/09/17/running-silverlight-2-on-google-chrome-using-the-chrome-dev-channel.aspx#comments</comments><description>&lt;p&gt;When Google Chrome first came out and I read that it used Webkit, the same rendering engine that powers Safari, I tried browsing a few Silverlight 2 sites. It kind of worked, as long as the sites didn’t exclude browsers that weren’t on Microsoft’s official Silverlight support list. The controls loaded, but didn’t animate or update smoothly. While Microsoft still isn’t officially supporting Silverlight on Chrome, Chrome’s latest Dev Build (0.2.151.2) includes some specific fixes to support Silverlight 2 Beta 2. The information about the updates is in &lt;a href="http://dev.chromium.org/getting-involved/dev-channel/release-notes"&gt;the release notes&lt;/a&gt;, specifically &lt;a href="http://src.chromium.org/viewvc/chrome?view=rev&amp;amp;revision=1735"&gt;revision 1735&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The basic issue here was that the plugin would not paint correctly. The URLs mentioned in this bug load windowed silverlight plugin instances, which invoke the NPN_InvalidateRect API to paint. We send over the rects to the renderer, however these don't generate paints as the plugin is windowed. A peek at Safari's webkit implementation revealed that they merely invoke the InvalidateRect windows API in this context. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I followed the link in &lt;a href="http://jonas.follesoe.no/DeveloperBuildOfChrome1251FixesSilverlight2Bugs.aspx"&gt;Jonas Follesø’s post&lt;/a&gt; over to the &lt;a href="http://dev.chromium.org/getting-involved/dev-channel"&gt;Chromium Developer instructions for running the Chrome developer build&lt;/a&gt;, which are really simple:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Download and run the &lt;a href="http://chromium.googlecode.com/files/chromechannel-1.0.exe"&gt;Google Chrome Channel Chooser&lt;/a&gt; (http://chromium.googlecode.com/files/chromechannel-1.0.exe). &lt;/li&gt;    &lt;li&gt;Click the circle next to Dev. &lt;/li&gt;    &lt;li&gt;Click Update to save your choice. &lt;/li&gt;    &lt;li&gt;Click Close. &lt;/li&gt;    &lt;li&gt;In Google Chrome, click the wrench menu and choose About Google Chrome. &lt;em&gt;Note: On Windows Vista, updates from the About box require Service Pack 1. With 0.2.149.29 (the current release), on demand updates do not work in Vista SP1 if User Account Control is disabled.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Click Update Now to install the current Dev channel release. &lt;/li&gt;    &lt;li&gt;Restart Google Chrome. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;And yes, it really is that easy – I had it running in under 5 minutes. First, I ran the &lt;a href="http://chromium.googlecode.com/files/chromechannel-1.0.exe"&gt;Chrome Channel Switcher&lt;/a&gt;. It’s a simple EXE, not an install. Select Dev, press the Update button, then press the Close button:&lt;/p&gt;  &lt;p&gt;&lt;a title="Google Chrome - Build Channel Switcher" href="http://www.flickr.com/photos/36836555@N00/2864896760/"&gt;&lt;img alt="Google Chrome - Build Channel Switcher" src="http://static.flickr.com/3067/2864896760_5094777050.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Then open the about box (in the wrench menu) and click the Update Now button:&lt;/p&gt;  &lt;p&gt;&lt;a title="Google Chrome / About Menu" href="http://www.flickr.com/photos/36836555@N00/2865082102/"&gt;&lt;img alt="Google Chrome / About Menu" src="http://static.flickr.com/3076/2865082102_b05b57866b.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Google Chrome - Dev Build Update" href="http://www.flickr.com/photos/36836555@N00/2864062851/"&gt;&lt;img alt="Google Chrome - Dev Build Update" src="http://static.flickr.com/3159/2864062851_af2642ed1d.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The update runs:&lt;/p&gt;  &lt;p&gt;&lt;a title="Google Chrome - Updating" href="http://www.flickr.com/photos/36836555@N00/2864900628/"&gt;&lt;img alt="Google Chrome - Updating" src="http://static.flickr.com/3267/2864900628_4088d9939f.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After the update finishes, close and reopen Chrome. If you want to verify you’ve updated, check the about box – you’ll see the version number is different:&lt;/p&gt;  &lt;p&gt;&lt;a title="Google Chrome 0.2.152.1" href="http://www.flickr.com/photos/36836555@N00/2864211505/"&gt;&lt;img alt="Google Chrome 0.2.152.1" src="http://static.flickr.com/3005/2864211505_a1dbef2a5b.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That’s it. The whole process took just a few minutes for me. Now, off to view some of my favorite Silverlight 2 Sites! First, the Hard Rock Memorabilia page. There’s a check to see if the browser is supported, but it still lets me in if it’s not on the list (which is a good policy anyways, since it allows Linux / Moonlight users to view the site):&lt;/p&gt;  &lt;p&gt;&lt;a title="Google Chrome / Silverlight / Hard Rock Memorabilia" href="http://www.flickr.com/photos/36836555@N00/2864980310/"&gt;&lt;img alt="Google Chrome / Silverlight / Hard Rock Memorabilia" src="http://static.flickr.com/3039/2864980310_ee19baa356.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I hit okay, and we’re in. The site is snappy and everything works just fine:&lt;/p&gt;  &lt;p&gt;&lt;a title="Google Chrome / Silverlight / Hard Rock" href="http://www.flickr.com/photos/36836555@N00/2864995460/"&gt;&lt;img alt="Google Chrome / Silverlight / Hard Rock" src="http://static.flickr.com/3080/2864995460_b35ab2e306.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;How about the Mojave Experiment site, which uses a fancy Deep Zoom / video cloud thing? Yep.&lt;/p&gt;  &lt;p&gt;&lt;a title="Google Chrome / Silverlight / Mojave Experiment" href="http://www.flickr.com/photos/36836555@N00/2865048414/"&gt;&lt;img alt="Google Chrome / Silverlight / Mojave Experiment" src="http://static.flickr.com/3068/2865048414_85a8108ec5.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jonas.follesoe.no/DeveloperBuildOfChrome1251FixesSilverlight2Bugs.aspx"&gt;Jonas has some screenshots of other Silverlight sites&lt;/a&gt;, which also worked well for him, and &lt;a href="http://bits.samiq.net/2008/09/google-chrome-updated-to-run.html"&gt;it worked for Samiq&lt;/a&gt; as well. From the &lt;a href="http://dev.chromium.org/getting-involved/dev-channel/release-notes"&gt;release notes&lt;/a&gt;, this Dev release also fixes issues with Flash, such as YouTube videos freezing when you use the slider. Go get it!&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Note: All the computers I tested this on had Silverlight installed before upgrading Google Chrome to the dev build. One had Safari / Windows installed, the other didn’t. Google Chrome doesn’t include Silverlight; you’ll need to &lt;a href="http://www.microsoft.com/silverlight/resources/install.aspx?v=2.0"&gt;install Silverlight separately&lt;/a&gt; if you don’t already have it. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6628872" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=ubl7rvZo"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=0k4bJJN1"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=0k4bJJN1" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=KqMxGvUu"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=MJVC0Yl1"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=MJVC0Yl1" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/XoyBqyoFlMs" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Browsers+_2F00_+Web+Development/default.aspx">Browsers / Web Development</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Silverlight/default.aspx">Silverlight</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/09/17/running-silverlight-2-on-google-chrome-using-the-chrome-dev-channel.aspx</feedburner:origLink></item><item><title>Silverlight and Relative URI’s for Image and Video Sources</title><link>http://feedproxy.google.com/~r/jongalloway/~3/CSuDJJ6zA_E/silverlight-and-relative-uri-s-for-image-and-video-sources.aspx</link><pubDate>Fri, 12 Sep 2008 06:24:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6619885</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6619885</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/09/11/silverlight-and-relative-uri-s-for-image-and-video-sources.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;One of the main use cases of Silverlight is to enable rich media experiences, which requires referencing media files (images, audio, and video). That’s a little trickier than you’d expect, and it’s not very clearly documented. For instance, we ran into difficulty getting this set up in our Silverlight Advertising demo for MIX – we wanted to allow for a drag and drop experience to add a video as a canvas background without requiring additional downloading code to pull the video. Here’s an overview on how that works (thanks to &lt;a href="http://timheuer.com"&gt;Tim Heuer&lt;/a&gt; and for much of this information).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NOTE: This is especially important if you’re including a video or lots of images. The wrong way to include large media assets is to include them as resources (either compiled into the DLL or included in the XAP), since that will require your users to download everything before the Silverlight control is displayed.&lt;/strong&gt; It’s important to keep your Silverlight XAP’s small so your users have a smooth load experience. For instance, the &lt;a href="http://memo.hardrock.com"&gt;Hard Rock Memorabilia&lt;/a&gt; site browses gigabytes of images, but the XAP size weighs in at a tiny &lt;em&gt;69KB&lt;/em&gt;.&lt;/p&gt;  &lt;h3&gt;Silverlight URI References Are Relative To Your XAP&lt;/h3&gt;  &lt;p&gt;Short story is, Silverlight media Uri references don’t work the way you’d think, largely to keep compatible with WPF Uri’s which aren’t living inside a website. Relative Uri’s are relative to the Silverlight application, not the website. There’s no way to do site relative Uri’s without writing code. For example, using the following site structure:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jongalloway/2850226697/" title="Silverlight - Relative URI by jongalloway, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3183/2850226697_d0be25b1b5_o.png" width="179" height="184" alt="Silverlight - Relative URI" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Note: Screenshot has been updated since original post.&lt;/p&gt;  &lt;p&gt;In this case, a source Uri could reference VideoB.wmv, but couldn’t reference VideoA.wmv or any images in /Images. So these are valid:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;MediaElement&lt;/span&gt; &lt;span class="attr"&gt;Source&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/VideoB.wmv&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;MediaElement&lt;/span&gt; &lt;span class="attr"&gt;Source&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Subfolder/VideoC.wmv&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;These are not:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Image&lt;/span&gt; &lt;span class="attr"&gt;Source&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/Images/Logo.png&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;MediaElement&lt;/span&gt; &lt;span class="attr"&gt;Source&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/VideoA.wmv&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h3&gt;Some Workarounds&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Include the content in a subfolder of ClientBin. Set the content type to “Content” rather than “Resource” unless you want it downloaded with the XAP. Don’t include the media as a resource, or your users will have to download all the video and images before the Silverlight element is displayed.&lt;/li&gt;

  &lt;li&gt;You can manually move the XAP in the root of the site, and site relative paths will work. This solves the Uri issue, but then you’re on your own a bit because you’ve stepped outside of what Visual Studio’s tooling supports. &lt;a href="http://wildermuth.com/2008/06/23/Silverlight_s_XAML_Relative_URI_s_and_Site_of_Origin"&gt;Shawn Wildermuth recommends moving your XAP to the root of an application and has a good post on how to do it&lt;/a&gt;. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://mail.vertigo.com/redir.aspx?C=487a4d28612f4e20b3ab2d0f4d7f6e47&amp;amp;URL=http%3a%2f%2fcommunity.irritatedvowel.com%2fblogs%2fpete_browns_blog%2farchive%2f2008%2f03%2f09%2fSilverlight-2-Beta-1-Path-and-File-Resolution.aspx"&gt;Pete Brown wrote a nice overview explaining how relative URI’s work in the three possible cases&lt;/a&gt;:&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h5&gt;&lt;b&gt;Images with Leading Slash (like &amp;lt;Image Source=&amp;quot;/foo.jpg&amp;quot; /&amp;gt;)&lt;/b&gt;&lt;/h5&gt;

  &lt;p&gt;This type of references, with a leading slash, is root relative to the application root (the XAP). These files should by Content and have CopyToOutputDirectory set so that they are added into the XAP. If you inspect the Xap, you'll find the image in there.&lt;/p&gt;

  &lt;p&gt;When not found, the resource loading mechanism falls back to the &lt;b&gt;application's&lt;/b&gt; site of origin and looks for the image under the same dir as the XAP is located. Note that this is the application's site, not the hosting page's site. That is an important distinction if you are creating cross-domain applications (where Site X has the page and Site Y has the XAP). If not found, an exception is thrown.&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;h5&gt;&lt;strong&gt;Images without Leading Slash (like &amp;lt;Image Source=&amp;quot;foo.jpg&amp;quot; /&amp;gt; )&lt;/strong&gt;&lt;/h5&gt;

  &lt;p&gt;This type of reference, without any leading slash or anything, expect to find the image compiled into the assembly as a Resource. The path is relative to the path of the Xaml file from which they are being referenced. When not found, the ImageFailed event is raised&lt;/p&gt;

  &lt;p&gt;If you inspect the XAP, you will not see the image, because it will be in the assembly.&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;h5&gt;&lt;strong&gt;Absolute URLs (like &amp;lt;Image Source=&amp;quot;absolute http url&amp;quot; /&amp;gt;)&lt;/strong&gt;&lt;/h5&gt;

  &lt;p&gt;This will look at the named absolute Url as you would expect. &lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The absolute URL sounds like the simplest approach, and it is – from the Silverlight point of view. It’s not the simplest for web development, though, because your references won’t stay the same between your development, test, and production machines. In general, I use the leading slash references with the media files hosted at the “site of origin”, meaning the site at which the XAP file is hosted.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;One More Gotcha / Workaround – WebClient and HttpWebRequest Don’t Follow The Above Rules&lt;/h3&gt;

&lt;p&gt;WebClient and HttpWebRequest use the browser’s network stack, so they work the way you’d expect for normal web applications. For example, in the following code:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var webClient = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Net.WebClient();
webClient.OpenReadCompleted += ProcessResult();
webClient.OpenReadAsync(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;&amp;quot;/info.zip&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;


&lt;p&gt;The web client request is routed through the browser’s networking stack, so it would be looking for info.zip regardless of where your XAP file is located in your site. I guess the downside there is that your location context changes depending on how you’re accessing resources (via Uri reference or by explicitly connecting to it via WebClient/HttpWebRequest). However, there’s an upside – your XAP can reference content anywhere in your site via WebClient/HttpWebRequest, even if the XAP is located in a subfolder. That’s handy, because in some cases that can be a lot simpler than determining the absolute URL of your resource.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6619885" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=P36CN8d5"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=LvrKLn0R"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=LvrKLn0R" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=zo11v5r7"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=idudhhgp"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=idudhhgp" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/CSuDJJ6zA_E" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Silverlight/default.aspx">Silverlight</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/09/11/silverlight-and-relative-uri-s-for-image-and-video-sources.aspx</feedburner:origLink></item><item><title>MSDN Low Bandwidth Bookmarklet</title><link>http://feedproxy.google.com/~r/jongalloway/~3/3j0gxbzqRSE/msdn-low-bandwidth-bookmarklet.aspx</link><pubDate>Sat, 30 Aug 2008 09:31:17 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6579842</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>30</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6579842</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/08/30/msdn-low-bandwidth-bookmarklet.aspx#comments</comments><description>&lt;style&gt;


a.bookmarklet
{
border: 1px black dashed;
text-decoration: none;
padding: 2px;
background: #fff9d8;
}&lt;/style&gt;  &lt;p&gt;There’s a semi-hidden feature in the &lt;a href="http://msdn.microsoft.com/en-us/library/default.aspx"&gt;MSDN Library website&lt;/a&gt;: Low Bandwidth view. We’ll talk about how to use it, why I like it, and some tips for switching it on and off. We’ll end up with an &lt;a class="bookmarklet" href="javascript:if(document.cookie.indexOf('LoBandEnabled=yes')&amp;lt;0){document.cookie='LoBandEnabled=yes;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';}else{document.cookie='LoBandEnabled=no;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';}window.location.reload();"&gt;MSDN Low Band&lt;/a&gt; bookmarklet I whipped up to make it even easier.&lt;/p&gt;  &lt;p&gt;The Low Bandwidth view has been available for a few months, but you wouldn’t know about it unless someone told you, since the only way to turn it on is to monkey with the URL. Try it - browse to:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/system.object.aspx" href="http://msdn.microsoft.com/en-us/library/system.object.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.object.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="MSDN-HighBand" href="http://www.flickr.com/photos/36836555@N00/2810670140/"&gt;&lt;img alt="MSDN-HighBand" src="http://static.flickr.com/3096/2810670140_7b9d018837.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now we’ll add the magic word: “(loband)” right before the “.aspx” at the end:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/system.object.aspx" href="http://msdn.microsoft.com/en-us/library/system.object(loband).aspx"&gt;http://msdn.microsoft.com/en-us/library/system.object(loband).aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="MSDN-LoBand" href="http://www.flickr.com/photos/36836555@N00/2810805162/"&gt;&lt;img alt="MSDN-LoBand" src="http://static.flickr.com/3100/2810805162_e5b96723ab.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Magic!!!&lt;/p&gt;  &lt;h3&gt;Why LoBand is High Value&lt;/h3&gt;  &lt;h4&gt;Simpler Layout&lt;/h4&gt;  &lt;p&gt;The obvious difference is that it replaces the navigation treeview on the left with a simple link. There are other subtle differences – simpler layout, fewer superfluous images. Higher signal to noise in my book.&lt;/p&gt;  &lt;h4&gt;Smaller Page Weight&lt;/h4&gt;  &lt;p&gt;The High Bandwidth version of this page weighs in at 100KB of HTML, but 400KB total by the time all the images, javascript, and CSS are loaded. Compare that with 66KB HTML / 70 KB total for the low bandwidth version. In this case (which is pretty representative) the low bandwidth version slimmed the page weight by 82.5%.&lt;/p&gt;  &lt;h4&gt;Faster Page Load&lt;/h4&gt;  &lt;p&gt;I’m not just talking about the smaller HTML here. The navigation tree on the left contains tons of nested unordered lists (ul&amp;gt;li&amp;gt;ul&amp;gt;li etc.). It’s actually a big improvement over the former HTML for that treeview, which (if I remember correctly) included a bunch of horrible nested tables with inline styles and javacript attributes. The new treeview uses a Telerik control, and outputs relatively clean HTML. Still, that treeview takes a while to load up – on my relatively quick development machine (with a very fast internet connection), the low band page loads twice as quickly – most of the time is spend in rendering the page. I’m not talking about milliseconds of difference here, I’m talking about 1 second load / draw time for low band vs. 4 second load / draw time for high band.&lt;/p&gt;  &lt;h4&gt;Who Cares?&lt;/h4&gt;  &lt;p&gt;Well, if you’re a Microsoft developer, you spend a lot of time on MSDN. There’s the time saver factor, sure, but more important is that fast load times removes the barrier to exploring the site.&lt;/p&gt;  &lt;h3&gt;Getting To The LoBand&lt;/h3&gt;  &lt;p&gt;The simplest way is to just add that (loband) bit before the .aspx file extension. If you’re on a page which already has one of those funky filters in the URL (like this: &lt;a title="http://msdn.microsoft.com/en-us/library/cc189009(VS.95).aspx" href="http://msdn.microsoft.com/en-us/library/cc189009(VS.95).aspx"&gt;http://msdn.microsoft.com/en-us/library/cc189009(VS.95).aspx&lt;/a&gt;) you can just add a comma and put it in afterwards: &lt;a title="http://msdn.microsoft.com/en-us/library/cc189009(VS.95).aspx" href="http://msdn.microsoft.com/en-us/library/cc189009(VS.95,loband).aspx"&gt;http://msdn.microsoft.com/en-us/library/cc189009(VS.95,loband).aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When you switch to low bandwidth view by tweaking the URL, you&amp;#160; get a a “persist low bandwidth view” link at the top, which is nice. Clicking that link sets a cookie, so all MSDN you visit will be in low bandwidth view. That sounds great, but I find there are times where the low bandwidth is too low. Some pages (especially articles) are hard to read, and when learning a new object model the navigation tree is helpful. In that case, there’s a link at the top (where the “persist low bandwidth view” link used to be, before we clicked it) which unsets the cookie and returns us to the normal, high bandwidth view.&lt;/p&gt;  &lt;p&gt;That all works, and I’ve used it since I heard about the low bandwidth view a few months ago. Still, it gets old – especially editing the URL the loband bit every time I’ve removed it.&lt;/p&gt;  &lt;h3&gt;Enter The Bookmarklet&lt;/h3&gt;  &lt;p&gt;Bookmarklets are great – they’re short Javascript functions that you bookmark, so you can run the Javascript on any page by opening the bookmark. They’re kind of like tiny Firefox addons. You can &lt;a href="http://en.wikipedia.org/wiki/Bookmarklet"&gt;read more about bookmarklets, of course, on Wikipedia&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Well, after messing with that MSDN URL enough times, I figured it was time for a bookmarklet. So here it is: &lt;a class="bookmarklet" href="javascript:if(document.cookie.indexOf('LoBandEnabled=yes')&amp;lt;0){document.cookie='LoBandEnabled=yes;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';}else{document.cookie='LoBandEnabled=no;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';}window.location.reload();"&gt;MSDN Low Band&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It’s just a simple toggle – when you’re in the normal view, clicking the bookmarklet will switch you to Low Bandwidth view. Clicking it again will return you back to the normal view again. In Firefox / Opera / Safari, you can just drag that peachy colored button to your Links toolbar. In Internet Explorer, you’ll need to right click the link and select “Add To Favorites”, making sure to save to the Links favorite folder. I’ve tested it in IE, Firefox, and Safari.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://delicious.com/help/bookmarklets"&gt;Delicious.com Bookmarklet installation help page&lt;/a&gt; has some nice screenshots and more information on installing Bookmarklets. If you’re interested in writing your own bookmarklets, I recommend you use a web based Bookmarklet helper page to simplify the grunt work, &lt;a href="http://subsimple.com/bookmarklets/jsbuilder.htm"&gt;like this one&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;So How Does It Work?&lt;/h3&gt;  &lt;p&gt;It’s really simple. At first I messed with the URL, but then I figured out that it was simpler to just modify the cookie and reload the page. Here’s the code, formatted so it’s easier to read:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;javascript:
&lt;span class="kwrd"&gt;if&lt;/span&gt;(document.cookie.indexOf(&lt;span class="str"&gt;'LoBandEnabled=yes'&lt;/span&gt;)&amp;lt;0){
  document.cookie=&lt;span class="str"&gt;'LoBandEnabled=yes;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT'&lt;/span&gt;;
}
&lt;span class="kwrd"&gt;else&lt;/span&gt;{
  document.cookie=&lt;span class="str"&gt;'LoBandEnabled=no;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT'&lt;/span&gt;;
}
window.location.reload();&lt;/pre&gt;
&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6579842" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=kHSOEBeB"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=mEhQW5je"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=mEhQW5je" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=pM2ScC7E"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=tl6fakZ5"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=tl6fakZ5" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/3j0gxbzqRSE" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Tips+_2F00_+Tricks/default.aspx">Tips / Tricks</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/General+Software+Development/default.aspx">General Software Development</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/08/30/msdn-low-bandwidth-bookmarklet.aspx</feedburner:origLink></item><item><title>Subtext 2: OpenID Login Support</title><link>http://feedproxy.google.com/~r/jongalloway/~3/hSwfQFbeLXE/subtext-2-openid-login-support.aspx</link><pubDate>Thu, 21 Aug 2008 05:41:26 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6545678</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6545678</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/08/20/subtext-2-openid-login-support.aspx#comments</comments><description>&lt;p&gt;The recent Subtext 2 release includes a feature I worked on: &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; login support. Let’s take a quick look at how you use it, then we’ll talk about the how the code works and why it’s a useful feature.&lt;/p&gt;  &lt;h3&gt;What’s OpenID?&lt;/h3&gt;  &lt;p&gt;I’m a big fan of digital identity, and could ramble on about OpenID for a while. But if I did that, this blog post would be published sometime after Windows 7 ships. Fortunately I pushed OpenID on some people who are a bit more prolific than I’ve been of late, so I’ll refer you to this post by &lt;a href="http://www.codinghorror.com/blog/archives/001121.html"&gt;Jeff Atwood (CodingHorror)&lt;/a&gt; and this webcast by &lt;a href="http://blog.wekeroad.com/mvc-storefront/mvcstore-part-16/"&gt;Rob Conery&lt;/a&gt;. Scott Hanselman wrote &lt;a href="http://www.hanselman.com/blog/TheWeeklySourceCode25OpenIDEdition.aspx"&gt;a great overview of OpenID&lt;/a&gt;, as well.&lt;/p&gt;  &lt;p&gt;The elevator pitch: Rather than being issued an account at every single website you login to, you issue them one. You establish an OpenID URL, which only you can login to, and then you give it as your account information to sites which support OpenID authentication. You’re in control of your account, you’ve got a central place to manage your password, etc.&lt;/p&gt;  &lt;p&gt;OpenID is a generic account that you can reuse on other websites.&lt;/p&gt;  &lt;h3&gt;Too Hard! Couldn’t I Just Fax Someone My Birth Certificate?&lt;/h3&gt;  &lt;p&gt;If you haven’t used OpenID, this is going to look complex. That’s because I’m showing you the hard case – it’s like learning to play Stairway To Heaven when you don’t have a guitar or amp. The first time through, we’re going to have to run down to the pawn shop to get you a Fender knockoff and a thrasher amp, but the next time you’re ready to rock you’ll be all set. So hang with me while we get setup, and at the end I’ll show you how it will work when you log in to your site tomorrow.&lt;/p&gt;  &lt;h3&gt;Step 1: Get an OpenID&lt;/h3&gt;  &lt;p&gt;There’s a good chance you’ve already got an OpenID, since many popular services like Flickr, Yahoo, and Blogger are OpenID providers, meaning that you can user your account with those services as an OpenID identity:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://idselector.com"&gt;&lt;img src="http://farm3.static.flickr.com/2071/2431586046_2757ac8ae8_o.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you don’t have an account with any of those services (or these on the &lt;a href="http://wiki.openid.net/OpenIDServers"&gt;OpenID public providers list&lt;/a&gt;), I recommend signing up with &lt;a href="http://www.myopenid.com"&gt;MyOpenID.com&lt;/a&gt; – they’ve got great support, and rich security features if you want to use them, such as InfoCard integration and phone verification.&lt;/p&gt;  &lt;h3&gt;Step 2: Tell Subtext What OpenID URL You’ll Be Using&lt;/h3&gt;  &lt;p&gt;The Security / Options tab has a new location where you can enter an OpenID URL. It’s important that you get this right – we’ll try to clean this up for you, but I recommend you type this as exactly as possible. In my case, my OpenID URL is &lt;a href="http://jongalloway.myopenid.com/"&gt;http://jongalloway.myopenid.com/&lt;/a&gt;, not jongalloway.myopenid.com. Even the trailing slash is important.&lt;/p&gt;  &lt;p&gt;Note that to in order to make this setting, I’ve logged in to Subtext using my standard Subtext username and password. That login doesn’t go away when I setup OpenID authentication, I’ve just enabled an additional security feature – I’ve got two ways to login to my blog now.&lt;/p&gt;  &lt;p&gt;&lt;a title="Subtext - Security Options (OpenID)" href="http://www.flickr.com/photos/36836555@N00/2769699061/"&gt;&lt;img alt="Subtext - Security Options (OpenID)" src="http://static.flickr.com/3137/2769699061_f5d3b6b485.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Step 3: Login Using OpenID&lt;/h3&gt;  &lt;p&gt;Now that Subtext knows my OpenID URL, I can use it to login to the site. The login dialog includes an OpenID sign-in prompt at the bottom, so I enter my OpenID URL in the prompt and click Login.&lt;/p&gt;  &lt;p&gt;&lt;a title="Subtext - OpenID Login" href="http://www.flickr.com/photos/36836555@N00/2769699083/"&gt;&lt;img alt="Subtext - OpenID Login" src="http://static.flickr.com/3210/2769699083_3ce5fefb50.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now here’s the part you may not be expecting if you haven’t used OpenID – I need to login at my OpenID provider. That’s not such a big deal, though, because myOpenID (and many other providers) have a “Stay Signed In” option option, which is appropriate if you’re logging in from a computer which is in a secure location (your home, a work computer you keep locked, etc.). The &lt;a href="https://pip.verisignlabs.com/seatbelt.do"&gt;Versisign Seatbelt Firefox Extension&lt;/a&gt; is a pretty handy way to sign in to your OpenID identity once for a browser session, too.&lt;/p&gt;  &lt;p&gt;&lt;a title="Subtext - myOpenID Login" href="http://www.flickr.com/photos/36836555@N00/2776962317/"&gt;&lt;img alt="Subtext - myOpenID Login" src="http://static.flickr.com/3101/2776962317_d2f317757b.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now, the first time I log in to myOpenID from my Subtext blog, myOpenID is going to ask me if that’s cool. Again, a little unexpected if you haven’t used OpenID before, but this is a one time thing. We’re telling myOpenID that my Subtext blog is going&lt;/p&gt;  &lt;p&gt;&lt;a title="Subtext - myOpenID Verification" href="http://www.flickr.com/photos/36836555@N00/2770545726/"&gt;&lt;img alt="Subtext - myOpenID Verification" src="http://static.flickr.com/3002/2770545726_af5a856b9b.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So, I type in my password and click the Sign Button, and my OpenID provider redirects me back to my Subtext instance (with an “authenticated” message), and Subtext logs me in:&lt;/p&gt;  &lt;p&gt;&lt;a title="Subtext - Admin" href="http://www.flickr.com/photos/36836555@N00/2776950523/"&gt;&lt;img alt="Subtext - Admin" src="http://static.flickr.com/3224/2776950523_9524517432.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Fine. Now Show Me Easy.&lt;/h3&gt;  &lt;p&gt;Thanks for hanging in there. Here’s how it looks tomorrow, providing you’ve checked that “Stay Signed In” checkbox. First, we browse to the login screen, enter our OpenID URL, and click Login:&lt;/p&gt;  &lt;p&gt;&lt;a title="Subtext - OpenID Login" href="http://www.flickr.com/photos/36836555@N00/2769699083/"&gt;&lt;img alt="Subtext - OpenID Login" src="http://static.flickr.com/3210/2769699083_3ce5fefb50.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now, we’re automatically logged in and brought to our admin screen:&lt;/p&gt;  &lt;p&gt;&lt;a title="Subtext - Admin" href="http://www.flickr.com/photos/36836555@N00/2776950523/"&gt;&lt;img alt="Subtext - Admin" src="http://static.flickr.com/3224/2776950523_9524517432.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you hadn’t checked that Stay Signed On checkbox, you’d get one screen in the middle – the login page for your OpenID provider’s page.&lt;/p&gt;  &lt;h3&gt;How’s It Work?&lt;/h3&gt;  &lt;p&gt;That’s the subject of another post, but let me show you one quick screenshot which shows the HTTP traffic during that last login.&lt;/p&gt;  &lt;p&gt;&lt;a title="Subtext - OpenID trace (Fiddler)" href="http://www.flickr.com/photos/36836555@N00/2783454594/"&gt;&lt;img alt="Subtext - OpenID trace (Fiddler)" src="http://farm4.static.flickr.com/3123/2783454594_a7de586ae7_o.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That shows the general sequence of events:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;I requested the Login page (it’s running on my local machine – 127.0.0.1)&lt;/li&gt;    &lt;li&gt;The DotNetOpenID login control makes a request to the URL I provided, saying “Yo. My URL is 127.0.0.1:2732, can you authenticate the user and verify that I’m on their list of sites?”&lt;/li&gt;    &lt;li&gt;There’s a little negotiation between the two sites, after which myOpenID returns an “Okay” message via SSL.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Show Us Your Code&lt;/h3&gt;  &lt;p&gt;Sure. For this release, I just used the DotNetOpenID.OpenIdLogin control, which is as simple as dropping the control on the page and handling the LoggedIn event. &lt;a href="http://www.hanselman.com/blog/TheWeeklySourceCode25OpenIDEdition.aspx"&gt;Scott Hanselman wrote about this before when he set up OpenID on DasBlog&lt;/a&gt;. In the case of Subtext, here’s the code I added for that LoggedIn event:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnOpenIdLogin_LoggedIn(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, OpenIdEventArgs e)
 {
   e.Cancel = &lt;span class="kwrd"&gt;true&lt;/span&gt;; &lt;span class="rem"&gt;//required to prevent logging everyone in&lt;/span&gt;
   &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Response.Status == AuthenticationStatus.Authenticated &amp;amp;&amp;amp;
       SecurityHelper.Authenticate(e.ClaimedIdentifier, chkRememberMe.Checked))
    {
         ReturnToUrl(Config.CurrentBlog.AdminHomeVirtualUrl);
    }
} &lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;You can see it in context in the &lt;a href="https://subtext.svn.sourceforge.net/svnroot/subtext/trunk/SubtextSolution/Subtext.Web/login.aspx.cs"&gt;Subtext SVN browser&lt;/a&gt;. Now that I’ve worked with it, I’d like to ditch the OpenIdLogin control for a future release. It works just fine, but it generates HTML that I’m not very happy with (table based markup, not CSS friendly). In the future, I’d probably write my own control and just use the libraries which are included in DotNetOpenID – they’ve been great.&lt;/p&gt;

&lt;h3&gt;OpenID Passthrough&lt;/h3&gt;

&lt;p&gt;There’s another new OpenID feature in Subtext 2.0 – OpenID Passthrough. The idea there is that you can use your blog URL as your OpenID URL, and it just redirects over to your “real” OpenID provider. Let’s assume that my blog was deployed to &lt;a href="http://www.jongalloway.com"&gt;http://jongalloway.com&lt;/a&gt;; in that case I could make the following OpenID Passthrough settings on the Subtext / Configure screen, after which I could use &lt;a href="http://jongalloway.com"&gt;http://jongalloway.com&lt;/a&gt; as my OpenID URL.&lt;/p&gt;

&lt;p&gt;&lt;a title="Subtext - OpenID Passthrough" href="http://www.flickr.com/photos/36836555@N00/2782733283/"&gt;&lt;img alt="Subtext - OpenID Passthrough" src="http://static.flickr.com/3093/2782733283_2af1e69c08.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6545678" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=1QyTVz4P"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=JBggzxru"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=JBggzxru" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=64YPujG4"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=vKmDXgyE"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=vKmDXgyE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/hSwfQFbeLXE" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/.NET+code/default.aspx">.NET code</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Digital+Identity/default.aspx">Digital Identity</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/08/20/subtext-2-openid-login-support.aspx</feedburner:origLink></item><item><title>Upgrading to Visual Studio 2008 / .NET 3.5 SP1</title><link>http://feedproxy.google.com/~r/jongalloway/~3/f2PjBC-Jbcg/upgrading-to-visual-studio-2008-net-3-5-sp1.aspx</link><pubDate>Fri, 15 Aug 2008 08:45:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6521731</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>9</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6521731</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/08/15/upgrading-to-visual-studio-2008-net-3-5-sp1.aspx#comments</comments><description>&lt;H3&gt;Have your Visual Studio Installation Media Handy&lt;/H3&gt;
&lt;P&gt;I was prompted for the original installation media both when uninstalling the SP1 Beta and when installing the SP1 RTM. The file it’s looking for is &lt;STRONG&gt;vs_setup.msi&lt;/STRONG&gt; in most cases, but they’re not all created equal. If you installed from a Visual Studio 2008 Professional DVD or image, you can’t just insert a Visual Studio 2008 Standard DVD. In my case, I installed of in ISO image, so I mounted the iso file (en_visual_studio_team_system_2008_team_suite_x86_x64wow_dvd_X14-26461.iso) as my F:\ drive and browsed to vs_setup.msi.&lt;/P&gt;
&lt;P&gt;&lt;A title="Visual Studio - Installation Media Prompt - 2" href="http://www.flickr.com/photos/36836555@N00/2760586614/" mce_href="http://www.flickr.com/photos/36836555@N00/2760586614/"&gt;&lt;IMG alt="Visual Studio - Installation Media Prompt - 2" src="http://static.flickr.com/3104/2760586614_fddced5c44.jpg" border=0 mce_src="http://static.flickr.com/3104/2760586614_fddced5c44.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;You don’t need it yet, but you don’t want to get half way through the upgrade and realize your install media is back at home, or that you deleted the ISO file and you have to wait for the 4GB download. Got the install media? Great, onward!&lt;/P&gt;
&lt;H3&gt;Use the Visual Studio 2008 Service Pack Preparation Tool&lt;/H3&gt;
&lt;P&gt;I think the biggest tip here is to use the &lt;A class="" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A494B0E0-EB07-4FF1-A21C-A4663E456D9D" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A494B0E0-EB07-4FF1-A21C-A4663E456D9D"&gt;Visual Studio 2008 Service Pack Preparation Tool&lt;/A&gt;. The original help information SP1 Beta (since updated) had a long, involved un-installation process, so people who’d had to uninstall that before figured we’d have to go through that process again. I had to a month ago, and it didn’t go very smoothly for me – probably due to some internal, pre-release builds of Silverlight 2 I’d installed at the beginning of the year. I ended up having to uninstall everything developer related to fix a Silverlight Package Load Failure error.&lt;/P&gt;
&lt;P&gt;So – that’s all been simplified now, and in most cases it sounds like it’s working great. I ran it on two of my computers (which have been littered with alpha and beta stuff) and the Visual Studio 2008 SP1 install ran flawlessly. I’ve been listening on Twitter, and it’s been a smooth upgrade for most people (notable exceptions: Rick Strahl, Sam Gentile).&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/heaths/archive/2008/08/11/vs-2008-sp1-beta-must-be-removed-prior-to-installing-the-release-of-vs-2008-sp1.aspx" mce_href="http://blogs.msdn.com/heaths/archive/2008/08/11/vs-2008-sp1-beta-must-be-removed-prior-to-installing-the-release-of-vs-2008-sp1.aspx"&gt;Heath Stewart's post on the Service Pack Preparation tool&lt;/A&gt; indicates that the SP1 install will block says the SP1 install if you've installed the SP1 beta at any point, so the main reason I'm calling the Service Pack Preparation Tool out here is to save you from going through an unnecessary manual install only to get the prompt indicating that you still need to run the Service Pack Preparation Tool.&lt;/P&gt;
&lt;P&gt;According to Heath:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;The tool will verify Visual Studio integrity and remove previous Visual Studio 2008 updates or pre-release software&lt;/EM&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;Microsoft Visual Studio 2008 - KB945140 (Beta) &lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Microsoft Visual Studio 2008 - KB944899 &lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Microsoft Silverlight Tools Beta 1 &lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Microsoft Visual Studio 2008 - KB949325&lt;/EM&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;So if you've never installed any of those betas you don't need to run the prep tool, however based on my experience installing Visual Studio over the years, I like the sound of "verifying Visual Studio integrity" before installing. I'd expect that the tool would run really quickly if you haven't installed the beta. &lt;/P&gt;
&lt;P&gt;So, I'd recommend that you grab the Service Pack Prep Tool and let ‘er rip!&lt;/P&gt;
&lt;P&gt;&lt;A title="Visual Studio Service Pack Preparation Tool" href="http://www.flickr.com/photos/36836555@N00/2759707161/" mce_href="http://www.flickr.com/photos/36836555@N00/2759707161/"&gt;&lt;IMG alt="Visual Studio Service Pack Preparation Tool" src="http://static.flickr.com/3022/2759707161_3d399a7286.jpg" border=0 mce_src="http://static.flickr.com/3022/2759707161_3d399a7286.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Allow some time for the Service Pack Prep Tool - it took 45 minutes on one machine, and others have reported that it ran for 8 hours or more. For those reasons, you might want to take some precautions to make sure you don't have a prompt holding up your install if you're going to be away from your computer while it's running. Here are a few tips there:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;As I mentioned before, you should expect to see a prompt for the installation media during the uninstall. If you can insert the media into the same drive you installed from in the first place (easy if you installed off a DVD drive, not so easy if you just attached an ISO file), you won't have to watch your computer for the media installation prompt.&lt;/LI&gt;
&lt;LI&gt;There's a check for process which will require a reboot when you're done. If you're going to be away from the computer while, I'd make sure to shut down your browsers and the Vista Sidebar (not sure why, maybe uses managed code).&lt;/LI&gt;&lt;/OL&gt;
&lt;H3&gt;Running the Visual Studio 2008 SP1 Installer&lt;/H3&gt;
&lt;P&gt;There are four installs listed on the Visual Studio 2008 Service Pack 1 (SP1) and .NET Framework 3.5 SP1 Downloads page:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E"&gt;Visual Studio 2008 SP1&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=AB99342F-5D1A-413D-8319-81DA479AB0D7" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=AB99342F-5D1A-413D-8319-81DA479AB0D7"&gt;.NET Framework 3.5 SP1&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=F3FBB04E-92C2-4701-B4BA-92E26E408569" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=F3FBB04E-92C2-4701-B4BA-92E26E408569"&gt;Visual Studio 2008 Express Editions with SP1&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=9E40A5B6-DA41-43A2-A06D-3CEE196BFE3D" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=9E40A5B6-DA41-43A2-A06D-3CEE196BFE3D"&gt;Visual Studio Team System 2008 Team Foundation Server SP1&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E"&gt;Visual Studio 2008 SP1 install&lt;/A&gt; includes .NET 3.5 SP1, so that'll do it. Again, be ready for that installation media prompt and the incompatible processes check.&lt;/P&gt;
&lt;H3&gt;Reinstalling The Silverlight Tools&lt;/H3&gt;
&lt;P&gt;The Service Pack Prep Tool removes the Silverlight Tools (as it should) so you need to reinstall those when the SP install completes. They've just updated the Silverlight Tools installer (silverlight_chainer.exe) in-place, so you can grab it from the same location it's always been at: &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=50A9EC01-267B-4521-B7D7-C0DBA8866434" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=50A9EC01-267B-4521-B7D7-C0DBA8866434"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=50A9EC01-267B-4521-B7D7-C0DBA8866434&lt;/A&gt;. Tim Heuer's got more information on &lt;A href="http://timheuer.com/blog/archive/2008/08/11/visual-studio-2008-sp1-and-silverlight.aspx" mce_href="http://timheuer.com/blog/archive/2008/08/11/visual-studio-2008-sp1-and-silverlight.aspx"&gt;Visual Studio 2008 SP1 and Silverlight Tools&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;Great - So What Did I Just Install?&lt;/H3&gt;
&lt;P&gt;I think some of the most interesting features are ASP.NET Dynamic Data, Entity Framework, ADO.NET Data Services (REST based), XBAP and ClickOnce support for Firefox, the Client Profile (24MB lightweight .NET framework which is makes it easier to distribute .NET applications to users who don't have the .NET framework installed).&lt;/P&gt;
&lt;P&gt;There's a lot more, though. Rather than writing up "yet another SP1 feature list" I'll point you to a few which I've found helpful:&lt;/P&gt;
&lt;P&gt;First off, you didn't install ASP.NET MVC, although you got a building block (System.Web.Routing - similar to URL Rewriting, but it's bi-directional). Phil Haack explains it all in a post titled (oddly enough) &lt;A href="http://haacked.com/archive/2008/08/14/aspnetmvc-not-in-sp1.aspx" mce_href="http://haacked.com/archive/2008/08/14/aspnetmvc-not-in-sp1.aspx"&gt;ASP.NET MVC Is Not Part of ASP.NET 3.5 SP1&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;ScottGu's out of the office right now; fortunately Scott Hanselman stepped up with &lt;A href="http://www.hanselman.com/blog/HiddenGemsNotTheSameOld35SP1Post.aspx" mce_href="http://www.hanselman.com/blog/HiddenGemsNotTheSameOld35SP1Post.aspx"&gt;good overview of what's in SP1&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Here's what changed &lt;A href="http://blogs.msdn.com/ddperf/archive/2008/08/13/service-pack-1-for-vs-2008-and-net-fx-3-5-released.aspx" mce_href="http://blogs.msdn.com/ddperf/archive/2008/08/13/service-pack-1-for-vs-2008-and-net-fx-3-5-released.aspx"&gt;from a performance point of view&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Dr. Tim Sneath wrote a great post on the &lt;A href="http://blogs.msdn.com/tims/archive/2008/05/12/introducing-the-third-major-release-of-windows-presentation-foundation.aspx" mce_href="http://blogs.msdn.com/tims/archive/2008/05/12/introducing-the-third-major-release-of-windows-presentation-foundation.aspx"&gt;WPF enhancements in SP1&lt;/A&gt; from when the Beta was released.&lt;/P&gt;
&lt;P&gt;Here's the overview at MSDN: &lt;A href="http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx" mce_href="http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx"&gt;Visual Studio 2008 Service Pack 1 and .NET Framework 3.5 Service Pack 1&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;If you want the point by point list, take a look at the following KB articles:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://support.microsoft.com/kb/950263/" mce_href="http://support.microsoft.com/kb/950263/"&gt;950263&lt;/A&gt; List of changes and fixed issues in Visual Studio 2008 Service Pack 1 &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://support.microsoft.com/kb/951845/" mce_href="http://support.microsoft.com/kb/951845/"&gt;951845&lt;/A&gt; List of changes and fixed issues in Visual Studio 2008 Service Pack 1 for Team Editions &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://support.microsoft.com/kb/950264/" mce_href="http://support.microsoft.com/kb/950264/"&gt;950264&lt;/A&gt; List of changes and fixed issues in Visual Studio 2008 Service Pack 1 for Express Editions &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://support.microsoft.com/kb/951847/" mce_href="http://support.microsoft.com/kb/951847/"&gt;951847&lt;/A&gt; List of changes and fixed issues in Visual Studio 2008 Service Pack 1 for the .NET Framework 3.5 &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;And if you really want the low level details, &lt;A href="http://codebetter.com/blogs/patricksmacchia/archive/2008/08/13/net-3-5-sp1-changes-overview.aspx" mce_href="http://codebetter.com/blogs/patricksmacchia/archive/2008/08/13/net-3-5-sp1-changes-overview.aspx"&gt;Patrick Smacchia used NDepend to show exactly which classes changed in SP1&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6521731" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=xHfjScts"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=p3arIiPN"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=p3arIiPN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=8eAZ9Bq2"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=8NwqBLdj"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=8NwqBLdj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/f2PjBC-Jbcg" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/08/15/upgrading-to-visual-studio-2008-net-3-5-sp1.aspx</feedburner:origLink></item><item><title>ASP.NET Themes Don’t Like IE8’s X-UA-Compatible header; Neither Do I</title><link>http://feedproxy.google.com/~r/jongalloway/~3/8xpLuks8Uw8/asp-net-themes-don-t-like-ie8-s-x-ua-compatible-header-neither-do-i.aspx</link><pubDate>Tue, 05 Aug 2008 07:02:25 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6484643</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>14</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6484643</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/08/05/asp-net-themes-don-t-like-ie8-s-x-ua-compatible-header-neither-do-i.aspx#comments</comments><description>&lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;I ran into an interesting issue a few months ago with IE8 support on sites which use ASP.NET Themes. I’ll talk about the issue and how to fix it. More important, though, I’ll talk about how this small example fits into the whole IE8 / X-UA-Compatible thing, and why I think the way that turned out was bad for everyone.&lt;/p&gt;  &lt;h3&gt;The Problem: That First Meta Tag&lt;/h3&gt;  &lt;p&gt;If you’ve got a page that doesn’t render correctly in IE8’s new standards mode, you can add a meta tag to the page which requests that IE8 render it in IE7 mode. The problem I ran into would have been comical if the timing had been better:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;IE8 only recognizes the X-UA-Compatible header if it’s the first META tag, appearing immediately after the &amp;lt;HEAD&amp;gt; tag &lt;/li&gt;    &lt;li&gt;The ASP.NET Theme system writes out the theme CSS reference immediately after the &amp;lt;HEAD&amp;gt; tag &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Of course, the reason I know that is that I needed to emulate IE7 on a page which was using ASP.NET themes. &lt;a href="http://blogs.msdn.com/tims/archive/2007/11/09/introducing-video-show-a-silverlight-reference-quality-sample.aspx"&gt;Video.Show was released in November 2007&lt;/a&gt; and was tested on Firefox 2, Safari 3, and Internet Explorer 7. We built a demo for the MIX 08 conference which ran on the a Pre-Beta 1 release of IE8. Back then, you had to opt-in to super-standards mode, so our IE7 capable markup did just fine. Here’s how that page looked:&lt;/p&gt;  &lt;p&gt;&lt;a title="IE8 After Header" href="http://www.flickr.com/photos/36836555@N00/2384196624/"&gt;&lt;img alt="IE8 After Header" src="http://static.flickr.com/2170/2384196624_a7f586d53c.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A little while after that, IE8 Beta 1 came out. One of the significant changes in Beta 1 was that IE8 would render your page in standards mode unless you specifically opted out. That was important to us because our client on that project wanted to be able to use the Video.Show demo we’d built for him, and it didn’t work well in IE8 Beta 1. Here’s how it looked:&lt;/p&gt;  &lt;p&gt;&lt;a title="IE8 Before Header" href="http://www.flickr.com/photos/36836555@N00/2383366067/"&gt;&lt;img alt="IE8 Before Header" src="http://static.flickr.com/2127/2383366067_7f68572db5.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The most obvious problem here is that the page background was messed up. The page structure is a bit complex due to the expanding banner at the top, and IE8 calculated that the page header extended to the bottom of the expanding&amp;#160; banner area. Also, the navigation links below the header were showing in a vertical line rather than floating left in a horizontal row. We had a very short turn around time for this project, and the IE8 display quirks weren’t well documented at that time, so tried just adding that fancy new X-UA-Compatible header:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;  &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Head1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="background-color: yellow"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;meta&lt;/span&gt; &lt;span class="attr"&gt;http-equiv&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;X-UA-Compatible&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;IE=7&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;meta&lt;/span&gt; &lt;span class="attr"&gt;http-equiv&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Content-Type&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/html; charset=utf-8&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;shortcut icon&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;favicon.ico&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Javascript/silverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Video.Show&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;[...]&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;






.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;However, here's what was actually rendered:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Head1&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;App_Themes/Default/DefaultStyle.css&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="background-color: yellow"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;meta&lt;/span&gt; &lt;span class="attr"&gt;http-equiv&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;X-UA-Compatible&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;IE=7&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;
 &lt;span class="attr"&gt;content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;IE=7&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;meta&lt;/span&gt; &lt;span class="attr"&gt;http-equiv&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Content-Type&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/html; charset=utf-8&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;shortcut icon&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;favicon.ico&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;css/lookDefault4.css&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Javascript/silverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Video.Show&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;[...]&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;IE8 didn’t recognize the X-UA-Compatible header because the ASP.NET Themes engine always writes out the CSS link as the element in the head section.&lt;/p&gt;

&lt;h3&gt;How I Fixed It: A Custom Response Header in IIS7&lt;/h3&gt;

&lt;p&gt;Since I was setting this up in a virtual machine for demo purposes, I could easily make server changes. Here’s how I added that header in IIS7:&lt;/p&gt;

&lt;p&gt;&lt;a title="IE8 Adding Header" href="http://www.flickr.com/photos/36836555@N00/2384196444/"&gt;&lt;img alt="IE8 Adding Header" src="http://static.flickr.com/3127/2384196444_e8e0f6e5ae.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The IE blog has links to instructions on setting those headers various servers:&amp;#160; &lt;a href="http://technet2.microsoft.com/windowsserver2008/en/library/0a9b040d-8cd9-4f81-b876-8d23c572ac9d1033.mspx?mfr=true"&gt;IIS7.0&lt;/a&gt;, &lt;a href="http://technet2.microsoft.com/windowsserver2008/en/library/c304c4a4-3f17-4361-8ac6-548a9334549c1033.mspx?mfr=true"&gt;IIS6.0&lt;/a&gt;, &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_headers.html"&gt;Apache 2.2&lt;/a&gt;, &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_headers.html"&gt;Apache 2.0&lt;/a&gt;, &lt;a href="http://httpd.apache.org/docs/1.3/mod/mod_headers.html"&gt;Apache 1.3&lt;/a&gt;. So, yeah, it works, but it’s not perfect. For one, it sets that header for all pages in the site. But, more concerning – what would I have done if I wasn’t able to make changes to the server configuration? If you’re running under IIS7, you can tweak headers with a change to your web.config file:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.webServer&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpProtocol&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;customHeaders&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;clear&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;X-UA-Compatible&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;IE=EmulateIE7&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;customHeaders&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;httpProtocol&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.webServer&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

&lt;p&gt;Otherwise, you can code your way around it with an HTTP Module or something, but the point is that the solution’s so simple anymore. All that brought me back to the X-UA-Compatible conversation from several months ago.&lt;/p&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h3&gt;X-UA-Compatible: One Developer’s History&lt;/h3&gt;

&lt;p&gt;One of the big changes in IE8 is a major shift in the method of selecting the rendering mode for a particular file. The DOCTYPE switch was born a decade ago, and made sense at the time – it used an opt-in model which assumed that a page with a valid DOCTYPE knew what it was doing, so browsers would render the page according to the latest browser standards. It seemed to make sense, but there was &lt;a href="http://www.alistapart.com/articles/beyonddoctype"&gt;trouble in DOCTYPE paradise&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Unfortunately, two key factors, working in concert, have made the &lt;code&gt;DOCTYPE&lt;/code&gt; unsustainable as a switch for standards mode:&lt;/p&gt;

  &lt;ol&gt;
    &lt;li&gt;Egged on by &lt;cite&gt;A List Apart&lt;/cite&gt; and The Web Standards Project, well-intentioned developers of authoring tools began inserting valid, complete &lt;code&gt;DOCTYPE&lt;/code&gt;s into the markup their tools generated; and &lt;/li&gt;

    &lt;li&gt;IE6’s rendering behavior was not updated for five years, leading many developers to assume its rendering was both accurate and unlikely to change. &lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;And so, the IE8 team came up with what most folks would agree is a good idea: opting-in to “standards mode” itself is meaningless unless you specify which standards you’re opting-in to. Targeting “web standards” is great as a platonic ideal, but in reality our pages are rendered by specific browser versions. It’s a lot more practical to opt in to a specific browser version’s rendering mode than a mythical and fluid “standards” mode.&lt;/p&gt;

&lt;p&gt;But, then, there was question: since IE8 will be entering a world already populated by billions of web pages written over the past dozen or more years, how should it handle them? Thus began a comedy of errors.&lt;/p&gt;

&lt;h3&gt;Proving That All Of Us Is Dumber Than Any Of Us&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it’s remembered:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The IE team first announced that it would require pages to opt-in to IE8’s “super-duper standards mode”. The web development community loudly protested, and the IE team changed the default behavior so that pages would be rendered in “super-duper standards mode” by default. We all won!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here’s what actually happened:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The IE team had it right the first time. There are billions of webpages out there which won’t work well in IE8 without changes. &lt;/li&gt;

  &lt;li&gt;The IE team forgot that the web development community, by and large, hates them so much that… I don’t even know how to describe it. &lt;/li&gt;

  &lt;li&gt;The web development community reacted to IE team’s announcement the way they react to just about (except improved CSS support) that the IE team announces. They protested loudly. &lt;/li&gt;

  &lt;li&gt;The IE team decided to switch it up a bit and did what the web development community was telling them they wanted, and quickly to boot. &lt;/li&gt;

  &lt;li&gt;We all lost, but almost no one’s admitting to it. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I know this is all old news – &lt;a href="http://www.joelonsoftware.com/items/2008/03/17.html"&gt;Joel Spolsky wrote about this in March&lt;/a&gt;. His post was way too long, but the basic idea was that an idealistic solution isn’t all that useful because &lt;strong&gt;people don’t install browsers that can’t display their favorite sites&lt;/strong&gt;. A lot of people disagreed, using two different arguments:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“&lt;a href="http://blogs.vertigo.com/personal/bellis/Blog/archive/2008/03/17/joel-and-ie8.aspx"&gt;It’s not easy, but we have to try to do the right thing&lt;/a&gt;” – I agree with the intentions, but I’m cynical here. Users (and IT shops) are still stalling on the upgrade from IE6 to IE7, even though IE7 was a relatively minor upgrade.&lt;/li&gt;

  &lt;li&gt;“&lt;a href="http://hsivonen.iki.fi/rdf/"&gt;IE is irrelevant”&lt;/a&gt; – These responses were popular in the web standards community, but were themselves irrelevant. Okay, all your friends are running Firefox 3 on their Macbook Air’s, but the browser stats show that IE is still the dominant browser by a large margin. Unfortunate facts are still facts. If you’re hoping that real people will actually use your sites, you have to care about how IE8 works. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Fix Your Pages! Also, Let Them Eat Cake!&lt;/h3&gt;

&lt;p&gt;I’ve heard a lot of people say that this is a good time for us all to just get this over with and move on. After all, you’ve got several options:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Fix your pages&lt;/strong&gt;. While I’ve been working with IE8 Beta 1, this is a little easier said than done – there are &lt;a href="http://css-class.com/test/bugs/ie/ie-bugs.htm"&gt;several IE8 regression bugs&lt;/a&gt; which work fine in IE7 and below but fail in IE8. Sure, it’s beta 1, but my point is that this isn’t simply a case of “good HTML / CSS = perfect display in IE8” just yet. I’ve spent several days chasing down &lt;a href="http://www.howtocreate.co.uk/ie8.html"&gt;several of these bugs&lt;/a&gt;, for instance. But, sure, providing that IE8 is really good on CSS 2.1 support, this is the ideal solution. The underlying assumption is annoying, though – the idea is that IE8 is now the authoritative CSS reference. As of now, &lt;a href="http://www.quirksmode.org/css/contents.html"&gt;that’s not at all the case&lt;/a&gt;. In some cases my HTML and CSS are correct, work in FF2/3 and IE7 – so why should I have to “fix” them to render in IE8? Arguing that this pain is worthwhile because we’re “doing the right thing for the web” is only valid if we really are improving the HTML/CSS quality of the web, and I’m not convinced this does the trick. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Use the X-UA-Compatible header in your pages&lt;/strong&gt;. This is listed as the standard response when people list cases where it’s not so easy to fix your HTML. The example above shows a case where a pretty new website built on a pretty modern web framework didn’t support that easily. Forget the case where the HTML is bundled in old CDROM’s or help files written out by installers – a web application built on ASP.NET 3.5 less than a year ago had problems with that approach. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Write the headers some other way&lt;/strong&gt;. Sure, it was possible in my case, but depending on the site, the skill level of the developers working on the site and their access to the server configuration, this could add up to an unacceptable amount of time. Unacceptable as in “Sorry, we don’t support or recommend IE8 – please use IE7. Thanks!” &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Granted, I’m testing with IE8 Beta 1 and IE8 Beta 2 is due out soon, so this situation could improve the situation for actively developed websites. But the operation of the X-UA-Compatible header seems to be pretty much set, and I don’t think it works well with the majority of the billions of HTML documents we’ve already created.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6484643" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=7zMX6yoW"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=jdtd3g56"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=jdtd3g56" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=ZtKuqC1v"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=zzSTzJYE"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=zzSTzJYE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/8xpLuks8Uw8" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Browsers+_2F00_+Web+Development/default.aspx">Browsers / Web Development</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/08/05/asp-net-themes-don-t-like-ie8-s-x-ua-compatible-header-neither-do-i.aspx</feedburner:origLink></item><item><title>Upcoming Guests on HerdingCode: Rob Conery, Glenn Block, [your suggestion here]</title><link>http://feedproxy.google.com/~r/jongalloway/~3/rfBa6qwNLyw/upcoming-guests-on-herdingcode-rob-conery-glenn-block-your-suggestion-here.aspx</link><pubDate>Tue, 15 Jul 2008 04:52:50 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6400907</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6400907</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/07/14/upcoming-guests-on-herdingcode-rob-conery-glenn-block-your-suggestion-here.aspx#comments</comments><description>&lt;p&gt;We’ve done eight episodes of &lt;a href="http://herdingcode.com/"&gt;Herding Code&lt;/a&gt; in round table format, but we’ve always anticipated bringing on some guests once we had our act together. We’re excited about having &lt;a href="http://blog.wekeroad.com/"&gt;Rob Conery&lt;/a&gt; as our first guest Tuesday night (7/15). We’ve also had a few folks tell us they’re willing to appear in future shows, including &lt;a href="http://blogs.msdn.com/gblock/"&gt;Glenn Block&lt;/a&gt; and Scott Bellware.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;We’d love to hear you questions&lt;/strong&gt; for these guest (especially Rob, since he’s confirmed for this week) as well as your recommendations for future guests. While you can always leave comments here or on the &lt;a href="http://herdingcode.com/"&gt;Herding Code site&lt;/a&gt;, the simplest way to give us feedback is by filling out &lt;a href="http://www.surveymonkey.com/s.aspx?sm=KI58PeSMrX_2bwaji_2fRbUhtA_3d_3d"&gt;this quick six question survey&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6400907" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=LzF6AYSf"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=OAgf7heA"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=OAgf7heA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=Lv78hhCa"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=KUvpKaBN"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=KUvpKaBN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/rfBa6qwNLyw" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Podcast/default.aspx">Podcast</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/07/14/upcoming-guests-on-herdingcode-rob-conery-glenn-block-your-suggestion-here.aspx</feedburner:origLink></item><item><title>Speaking at the So Cal Code Camp on 6/29/08: Deep Dive Into Deep Zoom</title><link>http://feedproxy.google.com/~r/jongalloway/~3/a1NWD-Tbyv4/speaking-at-the-so-cal-code-camp-on-6-29-08-deep-dive-into-deep-zoom.aspx</link><pubDate>Fri, 27 Jun 2008 07:06:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6326147</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6326147</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/06/27/speaking-at-the-so-cal-code-camp-on-6-29-08-deep-dive-into-deep-zoom.aspx#comments</comments><description>&lt;P&gt;I'll be speaking at the &lt;A href="http://www.socalcodecamp.com/" mce_href="http://www.socalcodecamp.com/"&gt;SoCal Code Camp in San Diego&lt;/A&gt; on Jun 29, 2008. My session’s titled &lt;A href="http://www.socalcodecamp.com/session.aspx?sid=bf716292-27e1-4d01-8e9c-1ff0fed408f0" mce_href="http://www.socalcodecamp.com/session.aspx?sid=bf716292-27e1-4d01-8e9c-1ff0fed408f0"&gt;Deep Dive into Silverlight Deep Zoom&lt;/A&gt;. We'll look at the code that runs the &lt;A href="http://memorabilia.hardrock.com/" mce_href="http://memorabilia.hardrock.com/"&gt;Hard Rock Memorabilia&lt;/A&gt; site, then build a site on the fly that takes advantage of Deep Zoom, including all the new features in Silverlight 2 Beta 2.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;UPDATE&lt;/STRONG&gt;: You can grab the slides from my talk &lt;A class="" href="http://www.socalcodecamp.com/session.aspx?sid=bf716292-27e1-4d01-8e9c-1ff0fed408f0" mce_href="http://www.socalcodecamp.com/session.aspx?sid=bf716292-27e1-4d01-8e9c-1ff0fed408f0"&gt;here&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6326147" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=rR6eLPL5"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=nZWODqlT"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=nZWODqlT" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=XlS1gX3g"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=zf9SXCuS"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=zf9SXCuS" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/a1NWD-Tbyv4" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Silverlight/default.aspx">Silverlight</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/06/27/speaking-at-the-so-cal-code-camp-on-6-29-08-deep-dive-into-deep-zoom.aspx</feedburner:origLink></item><item><title>Our Round Table Podcast gets legit - Now we're the Herding Code Podcast (herdingcode.com)</title><link>http://feedproxy.google.com/~r/jongalloway/~3/zTSNHPwoYQ8/our-round-table-podcast-gets-legit-now-we-re-the-herding-code-podcast-herdingcode-com.aspx</link><pubDate>Fri, 27 Jun 2008 05:02:19 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6325815</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6325815</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/06/26/our-round-table-podcast-gets-legit-now-we-re-the-herding-code-podcast-herdingcode-com.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://herdingcode.com/"&gt;&lt;img style="margin: 0px 0px 75px 20px" src="http://herdingcode.com/herdingCode-165px.png" align="right" border="0" /&gt;&lt;/a&gt; We’ve been experimenting with a weekly technology round table podcast for the past five weeks; now we have our act together to the point where we’re ready to officially launch it. We’re at &lt;a href="http://herdingcode.com/"&gt;HerdingCode.com&lt;/a&gt;, and you can subscribe to our feed at &lt;a href="http://feeds.feedburner.com/HerdingCode"&gt;http://feeds.feedburner.com/HerdingCode&lt;/a&gt; on your iPod, Zune, or whatever crazy podcast client you choose.&lt;/p&gt;  &lt;p&gt;By we, I mean:&lt;/p&gt;  &lt;li&gt;&lt;a href="http://www.odetocode.com/"&gt;K. Scott Allen (a.k.a. OdeToCode)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://www.lazycoder.com/"&gt;Scott Koon (a.k.a. Lazycoder)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://weblogs.asp.net/kdente/"&gt;Kevin Dente&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://weblogs.asp.net/jgalloway/"&gt;Jon Galloway&lt;/a&gt;&lt;/li&gt;  &lt;p&gt;&lt;a href="http://herdingcode.com/"&gt;Head on over&lt;/a&gt; and give it a listen. On the current episode, we &lt;del datetime="2008-06-26T09:01:22+00:00"&gt;argue&lt;/del&gt; discuss whether Silverlight is just another flavor of ActiveX, or if it’s here to stay. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://herdingcode.com/wp-content/uploads/HerdingCode-0006-Silverlight-Fad-Or-Fab.mp3"&gt;Herding Code 6: Silverlight - Fad Or Fab?&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6325815" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=hjTZ0ewB"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=WNA4a6Mq"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=WNA4a6Mq" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=mcuFHmHQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=M3q9YDqy"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=M3q9YDqy" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/zTSNHPwoYQ8" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Podcast/default.aspx">Podcast</category><enclosure url="http://herdingcode.com/wp-content/uploads/HerdingCode-0006-Silverlight-Fad-Or-Fab.mp3" length="17175951" type="audio/mpeg" /><media:content url="http://herdingcode.com/wp-content/uploads/HerdingCode-0006-Silverlight-Fad-Or-Fab.mp3" fileSize="17175951" type="audio/mpeg" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> We’ve been experimenting with a weekly technology round table podcast for the past five weeks; now we have our act together to the point where we’re ready to officially launch it. We’re at HerdingCode.com, and you can subscribe to our feed at http://feed</itunes:subtitle><itunes:summary> We’ve been experimenting with a weekly technology round table podcast for the past five weeks; now we have our act together to the point where we’re ready to officially launch it. We’re at HerdingCode.com, and you can subscribe to our feed at http://feeds.feedburner.com/HerdingCode on your iPod, Zune, or whatever crazy podcast client you choose. By we, I mean: K. Scott Allen (a.k.a. OdeToCode) Scott Koon (a.k.a. Lazycoder) Kevin Dente Jon Galloway Head on over and give it a listen. On the current episode, we argue discuss whether Silverlight is just another flavor of ActiveX, or if it’s here to stay. Herding Code 6: Silverlight - Fad Or Fab?</itunes:summary><itunes:keywords>Podcast</itunes:keywords><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/06/26/our-round-table-podcast-gets-legit-now-we-re-the-herding-code-podcast-herdingcode-com.aspx</feedburner:origLink></item><item><title>Jon's News Wrapup - June 25, 2008 Edition</title><link>http://feedproxy.google.com/~r/jongalloway/~3/edS6H2cD9t4/jon-s-news-wrapup-june-25-2008-edition.aspx</link><pubDate>Wed, 25 Jun 2008 22:08:31 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6320314</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=6320314</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2008/06/25/jon-s-news-wrapup-june-25-2008-edition.aspx#comments</comments><description>&lt;h3&gt;         Development Tools&lt;/h3&gt;     &lt;p&gt;         Here's the grab bag of tools, development toolkits, etc.&lt;/p&gt; &lt;div&gt;     &lt;ul class="hfeed"&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://live.sysinternals.com/" class="taggedlink url fn" rel="bookmark" title="live.sysinternals.com"&gt;live.sysinternals.com&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="live.sysinternals.com" class="item photo" src="http://ma.gnolia.com/bookmarks/mefachushu/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Run Sysinternals utilities directly off the internet without having to install them.                 You can browse to them at &lt;a href="http://live.sysinternals.com"&gt;http://live.sysinternals.com&lt;/a&gt;or open them as a network                 share using \\live.sysinternals.com\tools\. &lt;em&gt;I'd love to see more Microsoft utilities delivered this way - it's incredibly convenient.&lt;/em&gt;             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/sysinternals" rel="tag" title="Find jongalloway bookmarks tagged 'sysinternals'"&gt;sysinternals&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/windows" rel="tag" title="Find jongalloway bookmarks tagged 'windows'"&gt;                         windows&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;microsoft&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-05-30T01:18:45-07:00"&gt;                         May 30, 2008 at 01:18 AM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-05-30T01:18:45-07:00"&gt;                         May 30, 2008 at 01:18 AM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://blogs.msdn.com/sourceanalysis/archive/2008/05/23/announcing-the-release-of-microsoft-source-analysis.aspx" class="taggedlink url fn" rel="bookmark" title="Microsoft StyleCop: Source Analysis for C#"&gt;                     Microsoft StyleCop: Source Analysis for C#&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Microsoft StyleCop: Source Analysis for C#" class="item photo" src="http://ma.gnolia.com/bookmarks/wetavu/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 We are very excited to announce the release of a new developer tool from Microsoft,                 Source Analysis for C#. This tool is known internally within Microsoft as StyleCop,                 and has been used for many years now to help teams enforce a common set of best                 practices for layout, readability, maintainability, and documentation of C# source                 code. Source Analysis is similar in many ways to Microsoft Code Analysis (specifically                 FxCop), but there are some important distinctions. FxCop performs its analysis on                 compiled binaries, while Source Analysis analyzes the source code directly. For                 this reason, Code Analysis focuses more on the design of the code, while Source                 Analysis focuses on layout, readability and documentation. Most of that information                 is stripped away during the compilation process, and thus cannot be analyzed by                 FxCop.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/visualstudio" rel="tag" title="Find jongalloway bookmarks tagged 'visualstudio'"&gt;visualstudio&lt;/a&gt;&lt;/li&gt;&lt;li&gt;                             &lt;a href="http://ma.gnolia.com/people/jongalloway/tags/dotnet" rel="tag" title="Find jongalloway bookmarks tagged 'dotnet'"&gt;                                 dotnet&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-24T16:59:35-07:00"&gt;                         Jun 24, 2008 at 04:59 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-24T16:59:35-07:00"&gt;                         Jun 24, 2008 at 04:59 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://code.whytheluckystiff.net/shoes/" class="taggedlink url fn" rel="bookmark" title="Shoes, a Tiny Toolkit"&gt;Shoes, a Tiny Toolkit&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Shoes, a Tiny Toolkit" class="item photo" src="http://ma.gnolia.com/bookmarks/scuhiluc/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Shoes is a very informal graphics and windowing toolkit. It's for making regular                 old apps that run on Windows, Mac OS X and Linux. It's a blend of my favorite things                 from the Web, some Ruby style, and a sprinkling of cross-platform widgets. (More                 in the README.) Here's a trivial little button app: Shoes.app { button("Press Me")                 { alert("You pressed me") } }             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/ruby" rel="tag" title="Find jongalloway bookmarks tagged 'ruby'"&gt;                     ruby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/shoes" rel="tag" title="Find jongalloway bookmarks tagged 'shoes'"&gt;shoes&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-24T16:46:07-07:00"&gt;                         Jun 24, 2008 at 04:46 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-24T16:46:07-07:00"&gt;                         Jun 24, 2008 at 04:46 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://www.hanselman.com/blog/TheWeeklySourceCode29RubyAndShoesAndTheFirstRubyVirus.aspx" class="taggedlink url fn" rel="bookmark" title="Ruby / Shoes (Scott Hanselman)"&gt;                     Ruby / Shoes (Scott Hanselman)&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Ruby / Shoes (Scott Hanselman)" class="item photo" src="http://ma.gnolia.com/bookmarks/scuscucab/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Ruby is a very aesthetically (to me) pleasing and flexible language. Shoes is a                 GUI Toolkit for making Windowing Applications using Ruby. Shoes is legendary for                 a number of reasons, but above all, it has the greatest API documentation in the                 history of all software documentation.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/ruby" rel="tag" title="Find jongalloway bookmarks tagged 'ruby'"&gt;                     ruby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/shoes" rel="tag" title="Find jongalloway bookmarks tagged 'shoes'"&gt;shoes&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-24T16:44:42-07:00"&gt;                         Jun 24, 2008 at 04:44 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-24T16:44:42-07:00"&gt;                         Jun 24, 2008 at 04:44 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://www.jetbrains.com/resharper/features/newfeatures.html" class="taggedlink url fn" rel="bookmark" title="ReSharper 4.0 Released with C# 3.0 and Visual Studio 2008 Support"&gt;                     ReSharper 4.0 Released with C# 3.0 and Visual Studio 2008 Support&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="ReSharper 4.0 Released with C# 3.0 and Visual Studio 2008 Support" class="item photo" src="http://ma.gnolia.com/bookmarks/totoscip/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 ReSharper 4.0 Full Edition and C# Edition provide comprehensive support for C# 3.0,                 including LINQ, implicitly typed locals and arrays, extension methods, automatic                 properties, lambda expressions, object &amp; collection initializers, anonymous types,                 expression trees, and partial methods.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/resharper" rel="tag" title="Find jongalloway bookmarks tagged 'resharper'"&gt;                     resharper&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T15:36:32-07:00"&gt;                         Jun 20, 2008 at 03:36 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T15:36:32-07:00"&gt;                         Jun 20, 2008 at 03:36 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=2720616b-968a-4f40-b217-e3d41916896b&amp;amp;displaylang=en" class="taggedlink url fn" rel="bookmark" title="Windows Vista DRT (Demo Readiness Toolkit)"&gt;                     Windows Vista DRT (Demo Readiness Toolkit)&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Windows Vista DRT (Demo Readiness Toolkit)" class="item photo" src="http://ma.gnolia.com/bookmarks/whotove/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Installing the Demo Readiness Toolkit will completely erase all data on your hard                 drive and create a Windows Vista Demonstration PC. Be sure to use a machine that                 can be re-formatted. Do you demonstrate Windows Vista features? Or maybe you demo                 3rd party applications, services, solutions and/or hardware with Windows Vista?                 With the Demo Readiness Toolkit, your workload just got a whole lot lighter! With                 a comprehensive demo script, sample content, and a preconfigured installation including                 user accounts and applications, you have everything you need to demo with Windows                 Vista with virtually no effort. No more searching for the right software, creating                 user accounts, tweaking settings, or writing product/feature messaging - now you                 can focus on your pitch, NOT on building a demo environment.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/windows" rel="tag" title="Find jongalloway bookmarks tagged 'windows'"&gt;windows&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-05-30T01:28:45-07:00"&gt;                         May 30, 2008 at 01:28 AM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-05-30T01:28:45-07:00"&gt;                         May 30, 2008 at 01:28 AM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;     &lt;/ul&gt;     &lt;h3&gt;         Web / Cloud / Interwebs&lt;/h3&gt;     &lt;p&gt;         The big news here has to be the official release of Firefox 3. I'm not going to         dump a bunch of links here, see &lt;a href="http://lifehacker.com/tag/firefox-3/"&gt;Lifehacker's             Firefox 3 coverage&lt;/a&gt; for more in-depth info.&lt;/p&gt;     &lt;ul class="hfeed"&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://lifehacker.com/392160/top-10-firefox-3-features" class="taggedlink url fn" rel="bookmark" title="Top 10 Firefox 3 Features (Lifehacker)"&gt;Top 10 Firefox 3 Features                     (Lifehacker)&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Top 10 Firefox 3 Features (Lifehacker)" class="item photo" src="http://ma.gnolia.com/bookmarks/haqowochi/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 &lt;ul&gt;                     &lt;li&gt;Souped-up Add-ons manager...&lt;/li&gt;&lt;li&gt;More intuitive interface overall... &lt;/li&gt;                     &lt;li&gt;Stronger phishing and malware protection... &lt;/li&gt;                     &lt;li&gt;Improved download manager... &lt;/li&gt;                     &lt;li&gt;Native looks for every system... &lt;/li&gt;                     &lt;li&gt;Streamlined "Remember password" handling... &lt;/li&gt;                     &lt;li&gt;Smart bookmarks... &lt;/li&gt;                     &lt;li&gt;Places Organizer replaces the Bookmark Manager... &lt;/li&gt;                     &lt;li&gt;Smart Location Bar learns how you browse... &lt;/li&gt;                     &lt;li&gt;Insanely improved performance&lt;/li&gt;                 &lt;/ul&gt;             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/firefox%203" rel="tag" title="Find jongalloway bookmarks tagged 'firefox 3'"&gt;firefox 3&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T17:30:55-07:00"&gt;                         Jun 20, 2008 at 05:30 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T17:30:55-07:00"&gt;                         Jun 20, 2008 at 05:30 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://browserplus.yahoo.com/" class="taggedlink url fn" rel="bookmark" title="BrowserPlus™"&gt;BrowserPlus™&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="BrowserPlus™" class="item photo" src="http://ma.gnolia.com/bookmarks/tastacu/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Yahoo BrowserPlus&amp;trade; is a technology for web browsers that allows developers                 to create rich web applications with desktop capabilities. The most unique attribute                 of BrowserPlus is its ability to update and add new services on the fly without                 a browser restart or even reloading the page! As a user, this means no more installers                 to run or losing your place on the web. For developers, you can check for and activate                 new services with a single function call, pending user approval - we handle the                 complexity of software distribution and updates for you. (Runs Ruby on the client,                 probably a much better fit than the server).             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/ruby" rel="tag" title="Find jongalloway bookmarks tagged 'ruby'"&gt;                     ruby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/yahoo" rel="tag" title="Find jongalloway bookmarks tagged 'yahoo'"&gt;yahoo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/browserplus" rel="tag" title="Find jongalloway bookmarks tagged 'browserplus'"&gt;browserplus&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-24T16:49:12-07:00"&gt;                         Jun 24, 2008 at 04:49 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-24T16:49:12-07:00"&gt;                         Jun 24, 2008 at 04:49 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://blogs.zdnet.com/microsoft/?p=1438" class="taggedlink url fn" rel="bookmark" title="Comparison of Microsoft and Applesync services"&gt;Comparison of Microsoft and                     Applesync services&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Comparison of Microsoft and Applesync services" class="item photo" src="http://ma.gnolia.com/bookmarks/gerilis/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Apple’s introduction of the successor to .Mac — a k a, MobileMe — raises the question                 as to what’s taking Microsoft so long to roll out Live Mesh. There aren’t a whole                 lot of details yet available on MobileMe, other than that it will allow cloud-based                 synchronization of data and devices. (And will make use of Microsoft’s ActiveSync                 technology, which Apple licensed from Microsoft in order to bring push e-mail to                 the iPhone, creating its “Exchange for the rest of us.”) From initial reports, MobileMe                 sounds like a combination of a Windows Live (the various Webified versions of the                 .Mac point products), Live Mesh (the Mobile Me sync service) and SkyDrive (the Mobile                 Me cloud-based storage). It is slated to be available to customers in July for a                 (pricey) $99, which includes 20 GB of storage.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/apple" rel="tag" title="Find jongalloway bookmarks tagged 'apple'"&gt;apple&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T16:37:11-07:00"&gt;                         Jun 20, 2008 at 04:37 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T16:37:11-07:00"&gt;                         Jun 20, 2008 at 04:37 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://goosh.org/" class="taggedlink url fn" rel="bookmark" title="goosh.org - the unofficial google shell."&gt;                     goosh.org - the unofficial google shell.&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="goosh.org - the unofficial google shell." class="item photo" src="http://ma.gnolia.com/bookmarks/lewurathiy/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 goosh is a google-interface that behaves similar to a unix-shell.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/google" rel="tag" title="Find jongalloway bookmarks tagged 'google'"&gt;                     google&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/goosh" rel="tag" title="Find jongalloway bookmarks tagged 'goosh'"&gt;goosh&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-08T16:15:05-07:00"&gt;                         Jun 08, 2008 at 04:15 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-08T16:15:05-07:00"&gt;                         Jun 08, 2008 at 04:15 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;     &lt;/ul&gt;     &lt;h3&gt;         .NET Community&lt;/h3&gt;     &lt;p&gt;         The &lt;a href="http://altnetpedia.com/Default.aspx?Page=OverviewWhatIsIt"&gt;ALT.NET community             coalesced over a common disatisfaction with the direction the Entity Framework group             was heading&lt;/a&gt;, so it's no real surprise to see a public statement as the Entity         Framework gets set to ship without having substantively addressed any of their core         criticisms. I don't have production experience with Entity Framework or pre-existing         comptetitors like NHibernate, so I don't really feel qualified to much of an opinion         here, other than this: deferring community engagement on core issues as a "Version         2 feature" is generally a bad development model (c.f. Internet Explorer), and that         seems to have been part of the problem here. On the other hand, the ALT.NET community,          as a whole, is absolutely awful at communicating effectively. While this "No Confidence Vote"          letter could improve with a quick proofread by the Unibomber, it's probably the most         coherent problem statement they've put forth. Like I said, though, my uneducated opinion here         doesn't matter much. I've pulled some links in which cover some of the opposing         viewpoints.     &lt;/p&gt;     &lt;ul class="hfeed"&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/" class="taggedlink url fn" rel="bookmark" title="ADO .NET Entity Framework Vote of No Confidence"&gt;                     ADO .NET Entity Framework Vote of No Confidence&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="ADO .NET Entity Framework Vote of No Confidence" class="item photo" src="http://ma.gnolia.com/bookmarks/xuqixuwez/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 The signatories of this letter are unanimous in expressing concern for the welfare                 of software projects undertaken in the Microsoft customer community that will make                 use of the forthcoming ADO .NET Entity Framework...                 &lt;ul&gt;                     &lt;li&gt;Inordinate focus the data aspect of entities leads to degraded entity architectures                     &lt;/li&gt;                     &lt;li&gt;Excess code needed to deal with lack of lazy loading &lt;/li&gt;                     &lt;li&gt;Shared, canonical model contradicts software best practices &lt;/li&gt;                     &lt;li&gt;Lack of persistence ignorance causes business logic to be harder to read, write,                         and modify, causing development and maintenance costs to increase at an exaggerated                         rate &lt;/li&gt;                     &lt;li&gt;Excessive merge conflicts with source control in team environments&lt;/li&gt;                 &lt;/ul&gt;             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/entity%20framework" rel="tag" title="Find jongalloway bookmarks tagged 'entity framework'"&gt;entity framework&lt;/a&gt;&lt;/li&gt;&lt;li&gt;                             &lt;a href="http://ma.gnolia.com/people/jongalloway/tags/alt.net" rel="tag" title="Find jongalloway bookmarks tagged 'alt.net'"&gt;                                 alt.net&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-24T16:37:13-07:00"&gt;                         Jun 24, 2008 at 04:37 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-24T16:37:13-07:00"&gt;                         Jun 24, 2008 at 04:37 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://blogs.zdnet.com/microsoft/?p=1457" class="taggedlink url fn" rel="bookmark" title="Testers give Microsoft’s Entity Framework a no-confidence vote | (Mary Jo Foley)"&gt;                     Testers give Microsoft’s Entity Framework a no-confidence vote | (Mary Jo Foley)&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Testers give Microsoft’s Entity Framework a no-confidence vote | (Mary Jo Foley)" class="item photo" src="http://ma.gnolia.com/bookmarks/vruqerith/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Another Entity Framework tester, who requested anonymity, noted that the no confidence                 vote shouldn’t be interpreted as across-the-board dissatisfaction among .Net developers                 with Microsoft’s course. “The best thing that happened in response to this latest                 action is that the Entity Framework team responded to it immediately,” the tester                 said.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/alt.net" rel="tag" title="Find jongalloway bookmarks tagged 'alt.net'"&gt;alt.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/entity%20framework" rel="tag" title="Find jongalloway bookmarks tagged 'entity framework'"&gt;entity framework&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-24T16:29:05-07:00"&gt;                         Jun 24, 2008 at 04:29 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-24T16:29:05-07:00"&gt;                         Jun 24, 2008 at 04:29 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://blogs.msdn.com/timmall/archive/2008/06/24/vote-of-no-confidence.aspx" class="taggedlink url fn" rel="bookmark" title="Tim Mallalieu's response to the Vote of No Confidence"&gt;                     Tim Mallalieu's response to the Vote of No Confidence&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Tim Mallalieu's response to the Vote of No Confidence" class="item photo" src="http://ma.gnolia.com/bookmarks/lojamor/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 The unfortunate reality is that these are scenarios that we care deeply about but                 do not fully support in V1.0. I can go into some more detail here. One point to                 note is that the choice on these features were heavily considered but we had the                 contention between trying to add more features vs. trying to stay true to our initial                 goal which was to lay the core foundation for a multiple-release strategy for building                 out a broader data platform offering. Today, coincidentally, marked the start of                 our work on the next version of the product and we are determined to address this                 particular developer community in earnest while still furthering the investment                 in the overall data platform.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/entity%20framework" rel="tag" title="Find jongalloway bookmarks tagged 'entity framework'"&gt;entity framework&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-24T16:42:16-07:00"&gt;                         Jun 24, 2008 at 04:42 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-24T16:42:16-07:00"&gt;                         Jun 24, 2008 at 04:42 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://blogs.vertigo.com/personal/timlee/Blog/Lists/Posts/Post.aspx?ID=12" class="taggedlink url fn" rel="bookmark" title="Thoughts on the Entity Framework Vote of No Confidence - Blog"&gt;                     Thoughts on the Entity Framework Vote of No Confidence - Blog&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Thoughts on the Entity Framework Vote of No Confidence - Blog" class="item photo" src="http://ma.gnolia.com/bookmarks/provuscavox/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 I'm far from an expert on Microsoft's Entity Framework (EF), but I have dabbled                 a bit with betas 2 and 3. Recently, Brian Ellis, a colleague of mine, summarized                 the points made in an open letter claiming a "vote of no confidence" in the Entity                 Framework. I'm no ORM guru or EF junkie, but I know enough about EF to see that                 it has both potential and limitations. I'd like to share my thoughts on the letter.                 To be fair, I've never used NHibernate (the Holy Grail), and work primarily with                 Microsoft technology. That doesn't make me an EF evangelist. I'm still quite skeptical,                 but interested in understanding the value of the technology.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/entity%20framework" rel="tag" title="Find jongalloway bookmarks tagged 'entity framework'"&gt;entity framework&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-24T16:40:14-07:00"&gt;                         Jun 24, 2008 at 04:40 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-24T16:40:14-07:00"&gt;                         Jun 24, 2008 at 04:40 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://msmvps.com/blogs/kathleen/archive/2008/06/25/i-m-not-taking-on-the-alt-net-world.aspx" class="taggedlink url fn" rel="bookmark" title="I’m not taking on the Alt.NET world"&gt;                     I’m not taking on the Alt.NET world&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="I’m not taking on the Alt.NET world" class="item photo" src="http://ma.gnolia.com/bookmarks/crituni/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Cohesion and maturity do not define the best approach for the vast numbers of programmers                 that make up this industry. That’s why the good thing is that Microsoft did not                 blindly follow the pattern that worked for the relatively small Alt.NET community                 when developing Entity Framework. Entity Framework is a far broader initiative and                 EF must work in scenarios where the other pieces of Alt.NET style development are                 not in place (BDD, behavior based objects, test first development, etc). If the                 Alt.NET ideas are the whole answer, why isn’t everyone using that approach? If it’s                 because everyone hasn’t personally been indoctrinated by working for months on an                 Alt.NET project, as I understood Scott Bellware to be implying about me in a recent                 comment on my blog, then Entity Framework cannot succeed regardless of the perfection                 of the tool. If you have to go be personally instructed, you can no more be personally                 instructed in EF than in NHibernate. Entity Framework should not block any technique,                 including agile, additional infrastructure, code generation, rules engines, workflow,                 SOA, dynamic user interfaces, as the top of my head list. But neither should it                 be built in the vision of one existing – and therefore outdated – approach to software                 development. The change in terminology from TDD to BDD illustrates how fast thinking                 within the Alt.NET community changes and Entity Framework cannot chase these changes                 must but blaze its own trail based on the best thinking in every community.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/alt.net" rel="tag" title="Find jongalloway bookmarks tagged 'alt.net'"&gt;alt.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/entity%20framework" rel="tag" title="Find jongalloway bookmarks tagged 'entity framework'"&gt;entity framework&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-25T14:39:41-07:00"&gt;                         Jun 25, 2008 at 02:39 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-25T14:39:41-07:00"&gt;                         Jun 25, 2008 at 02:39 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://www.istartedsomething.com/taskforce/" class="taggedlink url fn" rel="bookmark" title="Windows UX Taskforce"&gt;Windows UX Taskforce&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Windows UX Taskforce" class="item photo" src="http://ma.gnolia.com/bookmarks/pipena/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Hey, something interesting that's got nothing to do with Entity Framework! Long                 Zheng started something, again. The Windows UX Taskforce is a community driven site                 where users can submit and vote on UI inconsistencies and problems in Windows Vista.                 Apparently the Windows Experience team team is treating these as bug reports.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/windows" rel="tag" title="Find jongalloway bookmarks tagged 'windows'"&gt;windows&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/vista" rel="tag" title="Find jongalloway bookmarks tagged 'vista'"&gt;                             vista&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T17:05:24-07:00"&gt;                         Jun 20, 2008 at 05:05 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T17:05:24-07:00"&gt;                         Jun 20, 2008 at 05:05 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;     &lt;/ul&gt;     &lt;h3&gt;         Future MS Tech&lt;/h3&gt;     &lt;p&gt;         There were some announcements at TechEd 2008, most of them pretty much expected. It seems like the bigger announcements this year will be at         &lt;a href="http://microsoftpdc.com/"&gt;PDC08&lt;/a&gt;. One surprise was Velocity, a distributed caching solution which is conceptually similar to memcached.         Little bits of news on Windows 7 are trickling in, although the featureset of this Windows release is being kept pretty quiet.         &lt;/p&gt;     &lt;ul class="hfeed"&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://weblogs.asp.net/jgalloway/archive/2008/06/03/teched-2008-keynote-summary.aspx" class="taggedlink url fn" rel="bookmark" title="TechEd 2008 Keynote Summary"&gt;TechEd                     2008 Keynote Summary&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="TechEd 2008 Keynote Summary" class="item photo" src="http://ma.gnolia.com/bookmarks/nokothothoq/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 &lt;ul&gt;                     &lt;li&gt;Internet Explorer 8 beta 2 will be available this August &lt;/li&gt;                     &lt;li&gt;Silverlight 2 beta 2 will be available this week with a commercial Go Live license.                         NBC Universal's 2008 Beijing Olympics will be using Silverlight 2 Beta 2 (which                         may have had something to do with that commercial go live license). Along with the                         Beta 2 release, we'll get Expression Blend 2.5 June 2008 Preview and Microsoft Silverlight                         Tools beta 2 for Visual Studio 2008. Dan Wahlin has a concise summary of what's                         new in Silverlight 2 Beta 2. I'm really excited to be able to talk about some of                         the new features here as well, but that's a subject for future posts. &lt;/li&gt;                     &lt;li&gt;IBM DB2 database access with Visual Studio Team System 2008 Database Edition due                         to an IBM / Microsoft alliance. &lt;/li&gt;                     &lt;li&gt;A new CTP (community technology preview) of the Microsoft Sync Framework, along                         with announcements of partnerships. &lt;/li&gt;                     &lt;li&gt;Microsoft code-name “Oslo.” At least from the demo (and from what I've heard so                         far), Oslo is a unified model platform along with some visualization tools which                         will be built into future versions of Visual Studio, Microsoft System Center, BizTalk                         Server and Microsoft SQL Server. It's still a little too buzzwordy and high level                         for me to get excited yet. You can view the demo at 45 minutes into the keynote                         in case you're able to get more out of it. &lt;/li&gt;                     &lt;li&gt;A new version of Visual Studio 2008 extensions for Windows SharePoint Services 3.0                         v1.2, which will allow developers to use Visual Studio 2008 to extend the value                         of Windows SharePoint Services and Microsoft Office SharePoint Server by providing                         a simplified development environment. &lt;/li&gt;                     &lt;li&gt;The first CTP of the Microsoft project code-named “Velocity,” a distributed, in-memory                         application cache platform that makes it easier to develop scalable, high-performance                         applications needing frequent access to disparate data sources. Large clusters of                         machines can be seamlessly integrated into a single cache, providing high availability                         to data.&lt;/li&gt;&lt;/ul&gt;             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/teched2008" rel="tag" title="Find jongalloway bookmarks tagged 'teched2008'"&gt;teched2008&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T15:49:59-07:00"&gt;                         Jun 20, 2008 at 03:49 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T15:49:59-07:00"&gt;                         Jun 20, 2008 at 03:49 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://simpable.com/code/velocity/" class="taggedlink url fn" rel="bookmark" title="Velocity - Microsoft Distributed Cache : Simpable"&gt;Velocity - Microsoft Distributed                     Cache (Scott W.)&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Velocity - Microsoft Distributed Cache : Simpable" class="item photo" src="http://ma.gnolia.com/bookmarks/pruchehosha/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 There is an interesting distinction between these tools. One on hand you have Memcached                 which treats the cache as something you should never rely on. It is there to help                 but you should always assume it is going to fail on you and even more importantly                 (to Memcached) you should accept that as a fact. If you read the Memcached FAQ you                 can almost here the author laughing when talking about fault tolerance. On the other                 side of the fence you have features like replication and high availability. It is                 just a CPT, but it looks like Velocity wants to be in the latter group.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/velocity" rel="tag" title="Find jongalloway bookmarks tagged 'velocity'"&gt;velocity&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T15:51:11-07:00"&gt;                         Jun 20, 2008 at 03:51 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T15:51:11-07:00"&gt;                         Jun 20, 2008 at 03:51 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://simpable.com/code/velocity-setup/" class="taggedlink url fn" rel="bookmark" title="Setting Up Velocity (Distributed Cache) : Simpable"&gt;Setting Up Velocity (Distributed                     Cache)&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Setting Up Velocity (Distributed Cache) : Simpable" class="item photo" src="http://ma.gnolia.com/bookmarks/shothithash/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Velocity is currently in its first public CTP, so there are certainly going to be                 some rough spots. The documentation is pretty good, but setting it up and using                 it the first time required some trial and error. Here is a quick overview on getting                 it Velocity setup and and using the API.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/velocity" rel="tag" title="Find jongalloway bookmarks tagged 'velocity'"&gt;velocity&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T15:52:28-07:00"&gt;                         Jun 20, 2008 at 03:52 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T15:52:28-07:00"&gt;                         Jun 20, 2008 at 03:52 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://blogs.msdn.com/velocity/archive/2008/06/02/introducing-project-codename-velocity.aspx" class="taggedlink url fn" rel="bookmark" title="Microsoft project code named &amp;quot;Velocity&amp;quot; : Introducing Project Codename &amp;quot;Velocity&amp;quot;"&gt;                     Microsoft project code named "Velocity" : Introducing Project Codename "Velocity"&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Microsoft project code named &amp;quot;Velocity&amp;quot; : Introducing Project Codename &amp;quot;Velocity&amp;quot;" class="item photo" src="http://ma.gnolia.com/bookmarks/lafazoy/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Microsoft is announcing the first CTP of a distributed caching product to provide                 the .NET application platform support for developing highly performant, scalable,                 and highly available applications. The project code named “Velocity” is a distributed                 cache that allows any type of data (CLR object, XML document, or binary data) to                 be cached. “Velocity” fuses large numbers of cache nodes in a cluster into a single                 unified cache and provides transparent access to cache items from any client connected                 to the cluster. http://msdn.microsoft.com/data provides additional information about                 project code named “Velocity” as well as links to download our first CTP.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/velocity" rel="tag" title="Find jongalloway bookmarks tagged 'velocity'"&gt;velocity&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T15:41:37-07:00"&gt;                         Jun 20, 2008 at 03:41 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T15:41:37-07:00"&gt;                         Jun 20, 2008 at 03:41 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://www.istartedsomething.com/20080523/windows-7-native-support-virtual-hard-disks/" class="taggedlink url fn" rel="bookmark" title="Windows 7 to add native support for Virtual Hard Disks - istartedsomething"&gt;                     Windows 7 to add native support for Virtual Hard Disks&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Windows 7 to add native support for Virtual Hard Disks - istartedsomething" class="item photo" src="http://ma.gnolia.com/bookmarks/zozib/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 Windows 7 is adding native support for creating, mounting, performing I/O on, and                 dismounting VHDs (virtual hard disks). Imagine being able to mount a VHD on any                 Windows machine, do some offline servicing and then boot from that same VHD. Or                 perhaps, taking an existing VHD you currently use within Virtual Server and boost                 performance by booting natively from it.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/windows%207" rel="tag" title="Find jongalloway bookmarks tagged 'windows 7'"&gt;windows 7&lt;/a&gt;&lt;/li&gt;&lt;li&gt;                             &lt;a href="http://ma.gnolia.com/people/jongalloway/tags/virtual%20machine" rel="tag" title="Find jongalloway bookmarks tagged 'virtual machine'"&gt;virtual machine&lt;/a&gt;&lt;/li&gt;&lt;li&gt;                                     &lt;a href="http://ma.gnolia.com/people/jongalloway/tags/virtualpc" rel="tag" title="Find jongalloway bookmarks tagged 'virtualpc'"&gt;                                         virtualpc&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-02T12:09:59-07:00"&gt;                         Jun 02, 2008 at 12:09 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-02T12:09:59-07:00"&gt;                         Jun 02, 2008 at 12:09 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://blogs.zdnet.com/microsoft/?p=1413" class="taggedlink url fn" rel="bookmark" title="What we do know about Windows 7"&gt;What we do know about Windows 7&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="What we do know about Windows 7" class="item photo" src="http://ma.gnolia.com/bookmarks/tripusto/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 &lt;ul&gt;                     &lt;li&gt;Windows 7 is being designed around five pillars (specialized for laptops; designed                         for services; personalized for everyone; optimized for entertainment; engineered                         for “ease of ownership”) &lt;/li&gt;                     &lt;li&gt;Windows 7 will be more modularized and componentized &lt;/li&gt;                     &lt;li&gt;Windows 7 will be a minor update to Vista — with “minor,” here, meaning as less                         disruptive as possible to users and their applications. Microsoft has said Windows                         7 will use the same driver model that Vista did. &lt;/li&gt;                     &lt;li&gt;Windows 7 will allow users to run legacy applications in virtualized mode to minimize                         backward compatibility problems. &lt;/li&gt;                     &lt;li&gt;Windows 7 will include touch functionality &lt;/li&gt;                     &lt;li&gt;Windows 7 will be more tightly integrated with Windows Live services. &lt;/li&gt;                     &lt;li&gt;Windows 7 will be more tightly integrated with Windows Mobile. &lt;/li&gt;                     &lt;li&gt;Windows 7 will add support for “HomeGroup” networking &lt;/li&gt;                     &lt;li&gt;Windows 7 will add native support for Virtual Hard Disks (VHDs)&lt;/li&gt;&lt;/ul&gt;             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/windows%207" rel="tag" title="Find jongalloway bookmarks tagged 'windows 7'"&gt;windows 7&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T17:16:02-07:00"&gt;                         Jun 20, 2008 at 05:16 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T17:16:02-07:00"&gt;                         Jun 20, 2008 at 05:16 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;     &lt;/ul&gt;     &lt;h3&gt;         .NET Dev Releases&lt;/h3&gt;     &lt;p&gt;         Things were busy here, with the release of SP1 Beta for Visual Studio 2008 and .NET Framework 3.5. Silverlight 2 hit Beta 2, as well.         I'm just going with bullet point excerpts from ScottGu's blog on these; there's a ton of information. They could have called this .NET 4.0         and I don't think anyone would have argued.&lt;/p&gt;     &lt;ul class="hfeed"&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/05/12/visual-studio-2008-and-net-framework-3-5-service-pack-1-beta.aspx" class="taggedlink url fn" rel="bookmark" title="Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta - ScottGu's Blog"&gt;                     Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta - ScottGu's Blog&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta - ScottGu's Blog" class="item photo" src="http://ma.gnolia.com/bookmarks/wrawosiqird/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 &lt;ul&gt;                     &lt;li&gt;ASP.NET Data Scaffolding Support (ASP.NET Dynamic Data) &lt;/li&gt;                     &lt;li&gt;ASP.NET Routing Engine (System.Web.Routing) &lt;/li&gt;                     &lt;li&gt;ASP.NET AJAX Back/Forward Button History Support &lt;/li&gt;                     &lt;li&gt;ASP.NET AJAX Script Combining Support &lt;/li&gt;                     &lt;li&gt;Visual Studio 2008 Performance Improvements HTML Designer and HTML Source Editor                     &lt;/li&gt;                     &lt;li&gt;Visual Studio 2008 JavaScript Script Formatting and Code Preferences &lt;/li&gt;                     &lt;li&gt;Better Visual Studio Javascript Intellisense for Multiple Javascript/AJAX Frameworks                     &lt;/li&gt;                     &lt;li&gt;Visual Studio Refactoring Support for WCF Services in ASP.NET Projects &lt;/li&gt;                     &lt;li&gt;Visual Studio Support for Classic ASP Intellisense and Debugging &lt;/li&gt;                     &lt;li&gt;Visual Web Developer Express Edition support for Class Library and Web Application                         Projects &lt;/li&gt;                     &lt;li&gt;.NET 3.5 SP1 and VS 2008 SP1 contain major performance, deployment, and feature                         improvements for building client applications. &lt;/li&gt;                     &lt;li&gt;Application Startup and Working Set Performance Improvements &lt;/li&gt;                     &lt;li&gt;New .NET Framework Client Profile Setup Package &lt;/li&gt;                     &lt;li&gt;New .NET Framework Setup Bootstrapper for Client Applications &lt;/li&gt;                     &lt;li&gt;ClickOnce Client Application Deployment Improvements &lt;/li&gt;                     &lt;li&gt;Windows Forms controls - including new vector shape, Printing, and DataRepeater                         controls: &lt;/li&gt;                     &lt;li&gt;WPF Performance Improvements &lt;/li&gt;                     &lt;li&gt;WPF Data Improvements &lt;/li&gt;                     &lt;li&gt;WPF Extensible Shader Effects &lt;/li&gt;                     &lt;li&gt;WPF Interoperability with Direct3D &lt;/li&gt;                     &lt;li&gt;VS 2008 for WPF Improvements &lt;/li&gt;                     &lt;li&gt;Data Development Improvements &lt;/li&gt;                     &lt;li&gt;SQL 2008 Support &lt;/li&gt;                     &lt;li&gt;ADO.NET Entity Framework and LINQ to Entities &lt;/li&gt;                     &lt;li&gt;ADO.NET Data Services (formerly code-named "Astoria") &lt;/li&gt;                     &lt;li&gt;.NET 3.5 SP1 and VS 2008 SP1 include several enhancements for WCF development.&lt;/li&gt;&lt;/ul&gt;             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/dotnet" rel="tag" title="Find jongalloway bookmarks tagged 'dotnet'"&gt;dotnet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/visualstudio" rel="tag" title="Find jongalloway bookmarks tagged 'visualstudio'"&gt;                             visualstudio&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-20T18:26:52-07:00"&gt;                         Jun 20, 2008 at 06:26 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-20T18:26:52-07:00"&gt;                         Jun 20, 2008 at 06:26 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/06/06/silverlight-2-beta2-released.aspx" class="taggedlink url fn" rel="bookmark" title="Silverlight 2 Beta2 (ScottGu's release notes)"&gt;                     Silverlight 2 Beta2 (ScottGu's release notes)&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Silverlight 2 Beta2 (ScottGu's release notes)" class="item photo" src="http://ma.gnolia.com/bookmarks/grudiqo/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 &lt;ul&gt;                     &lt;li&gt;More Built-in Controls &lt;/li&gt;                     &lt;li&gt;Control Template Editing Support &lt;/li&gt;                     &lt;li&gt;Visual State Manager (VSM) Support - (being added to WPF as well) &lt;/li&gt;                     &lt;li&gt;TextBox: Text scrolling with text-wrap, multi-line text selection, document navigation                         keys, and copy/paste from the clipboard, FullScreen mode (arrow, tab, enter, home,                         end, pageup/pagedown, space), new APIs to support inking and stylus input support.                     &lt;/li&gt;                     &lt;li&gt;UI Automation and Accessibility &lt;/li&gt;                     &lt;li&gt;DeepZoom &lt;/li&gt;                     &lt;li&gt;WPF Compatibility &lt;/li&gt;                     &lt;li&gt;Adaptive Streaming &lt;/li&gt;                     &lt;li&gt;Content Protection (Windows DRM and PlayReady DRM)Server Side Playlists &lt;/li&gt;                     &lt;li&gt;Cross Domain Sockets &lt;/li&gt;                     &lt;li&gt;Background Thread Networking &lt;/li&gt;                     &lt;li&gt;Duplex Communication (Server Push) &lt;/li&gt;                     &lt;li&gt;REST and ADO.NET Data Services &lt;/li&gt;                     &lt;li&gt;JSON (LINQ to JSON support) &lt;/li&gt;                     &lt;li&gt;DataGrid enhancements &lt;/li&gt;                     &lt;li&gt;Core data-binding features and better validation support &lt;/li&gt;                     &lt;li&gt;Isolated Storage (Increased local storage, better end-user management for Isolated                         Storage)&lt;/li&gt;&lt;/ul&gt;             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/silverlight2" rel="tag" title="Find jongalloway bookmarks tagged 'silverlight2'"&gt;silverlight2&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-06-23T16:34:36-07:00"&gt;                         Jun 23, 2008 at 04:34 PM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-06-23T16:34:36-07:00"&gt;                         Jun 23, 2008 at 04:34 PM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;     &lt;/ul&gt;     &lt;h3&gt;         General Microsoft News&lt;/h3&gt;     &lt;p&gt;         Wasn't sure where to put this one, but it's interesting. Will Office 2007 be the first Office suite to support ODF?&lt;/p&gt;     &lt;ul class="hfeed"&gt;         &lt;li class="xfolkentry hentry hreview"&gt;&lt;span class="type" style="display: none"&gt;url&lt;/span&gt;             &lt;h2 class="entry-title item"&gt;                 &lt;a href="http://www.microsoft.com/Presspass/press/2008/may08/05-21ExpandedFormatsPR.mspx" class="taggedlink url fn" rel="bookmark" title="Microsoft Expands List of Formats Supported in Microsoft Office: Move enhances customer choice and interoperability with Microsoft’s flagship productivity suite."&gt;                     Microsoft Office 2007 SP2 gets ODF and PDF support&lt;/a&gt;             &lt;/h2&gt;             &lt;img alt="Microsoft Expands List of Formats Supported in Microsoft Office: Move enhances customer choice and interoperability with Microsoft’s flagship productivity suite." class="item photo" src="http://ma.gnolia.com/bookmarks/scuhuzurd/thumbnail" width="100" /&gt;             &lt;div class="entry-content description"&gt;                 When using Microsoft Office 2007 SP2, customers will be able to open, edit and save                 documents using ODF and save documents into the XPS and PDF fixed formats from directly                 within the application without having to install any other code. It will also allow                 customers to set ODF as the default file format for Office 2007. To also provide                 ODF support for users of earlier versions of Microsoft Office (Office XP and Office                 2003), Microsoft will continue to collaborate with the open source community in                 the ongoing development of the Open XML-ODF translator project on SourceForge.net.             &lt;/div&gt;             &lt;ul class="tags"&gt;                 &lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/microsoft" rel="tag" title="Find jongalloway bookmarks tagged 'microsoft'"&gt;                     microsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/office" rel="tag" title="Find jongalloway bookmarks tagged 'office'"&gt;office&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ma.gnolia.com/people/jongalloway/tags/odf" rel="tag" title="Find jongalloway bookmarks tagged 'odf'"&gt;                             odf&lt;/a&gt;&lt;/li&gt;             &lt;/ul&gt;             &lt;ul class="more"&gt;                 &lt;li&gt;                     &lt;address class="author reviewer vcard"&gt;                         &lt;img alt="1_32" class="photo" src="http://ma.gnolia.com/avatars/1_32.gif" /&gt;                         &lt;a href="http://ma.gnolia.com/people/jongalloway" class="url fn" title="Visit jongalloway on Ma.gnolia"&gt;                             jongalloway&lt;/a&gt;&lt;/address&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="published dtreviewed" title="2008-05-30T01:29:53-07:00"&gt;                         May 30, 2008 at 01:29 AM&lt;/abbr&gt;                 &lt;/li&gt;                 &lt;li&gt;                     &lt;abbr class="updated" title="2008-05-30T01:29:53-07:00"&gt;                         May 30, 2008 at 01:29 AM&lt;/abbr&gt;                 &lt;/li&gt;             &lt;/ul&gt;         &lt;/li&gt;     &lt;/ul&gt; &lt;/div&gt;     &lt;style type="text/css"&gt;
        h2.entry-title
        {
            font-size: 1.1em;
            clear: left;
        }
        ul.hfeed
        {
	    list-style-type: none;
        }
        li.xfolkentry
        {
            clear: left;
        }
        img.item
        {
            float: left;
            height: 75px;
        }
        div.entry-content
        {
            float: left;
            width: 75%;
        }
        ul.more, ul.tags, address.author
        {
            display: none;
        }
        h3
        {
            clear: left;
        }
        li.xfolkentry div.entry-content, li.xfolkentry img.item
        {
	    padding-bottom: 50px;
        }
        /* This one is specific to CommunityServer*/
	div.postfoot
        {
	    clear: left;
        }
    &lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6320314" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=5BKfY1ig"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=9uWTvsXp"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=9uWTvsXp" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=uM2ZsgCR"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/jongalloway?a=CbcUEPHX"&gt;&lt;img src="http://feeds.feedburner.com/~f/jongalloway?i=CbcUEPHX" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jongalloway/~4/edS6H2cD9t4" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/TechEd+_2F00_+PDC/default.aspx">TechEd / PDC</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/WPF+_2F00_+Silverlight/default.aspx">WPF / Silverlight</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/News/default.aspx">News</category><feedburner:origLink>http://weblogs.asp.net/jgalloway/archive/2008/06/25/jon-s-news-wrapup-june-25-2008-edition.aspx</feedburner:origLink></item><media:rating>nonadult</media:rating></channel></rss>
