<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Jennifer Marsman</title><link>http://blogs.msdn.com/jennifer/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/JenniferMarsman" type="application/rss+xml" /><feedburner:emailServiceId>JenniferMarsman</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><title>Work-Stealing in .NET 4.0</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/AXuxhFaCmAQ/work-stealing-in-net-4-0.aspx</link><pubDate>Fri, 26 Jun 2009 20:26:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9805930</guid><dc:creator>jennmar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9805930.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9805930</wfw:commentRss><description>&lt;p&gt;There is some truly amazing support for parallel programming in .NET 4.0.&amp;#160; One of the compelling new features of the Thread Pool in .NET 4.0 is work-stealing, which allows work to be processed by worker threads more efficiently.&amp;#160; &lt;/p&gt;  &lt;p&gt;First of all, in addition to the global queue, there are local queues for each worker thread.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing1_2.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="WorkStealing1" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing1_thumb.jpg" width="644" height="449" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Let's say that the main program thread generated 2 tasks, which are added to the global queue.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing2_2.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="WorkStealing2" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing2_thumb.jpg" width="644" height="448" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Then each worker thread can take a task to process.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing3_2.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="WorkStealing3" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing3_thumb.jpg" width="644" height="448" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Then, suppose that Task 2 spawns three subtasks: Task 3, Task 4, and Task 5.&amp;#160; These tasks are placed on the local queue of Worker Thread 1.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing4_2.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="WorkStealing4" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing4_thumb.jpg" width="644" height="446" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Next, assume Worker Thread 1 completes Task 2.&amp;#160; It looks at its local queue, and takes the last task (Task 5) off to process.&amp;#160; &lt;strong&gt;It purposefully takes the last task&lt;/strong&gt;, the point being that the last task might still be in the cache, while it is likely that the first task (Task 3) is out of the cache.&amp;#160; Hence, there are performance improvements in processing local queues in a LIFO order.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing5_2.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="WorkStealing5" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing5_thumb.jpg" width="644" height="447" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now, assume Worker Thread p completes Task 1.&amp;#160; It looks first at its local queue, and there are no tasks there.&amp;#160; Then it looks at the global queue...no tasks there either.&amp;#160; Finally, it looks at &lt;strong&gt;other local queues&lt;/strong&gt;.&amp;#160; This is the concept of work-stealing: it can &amp;quot;steal&amp;quot; tasks from those queues.&amp;#160; So Worker Thread p would take Task 3 to process.&amp;#160; &lt;/p&gt;  &lt;p&gt;Note also that it steals work from the top of the queue (taking the first in), while Worker Thread 1 is processing from the bottom of the queue (taking the last in).&amp;#160; That is to reduce contention.&amp;#160; It also optimizes for caching: Worker Thread 1 is taking the tasks that are likely still in its cache, and Worker Thread p is taking the tasks that are least likely to be in Worker Thread 1's cache.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing6_2.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="WorkStealing6" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing6_thumb.jpg" width="644" height="445" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Finally, if Task 3 had further subtasks, they would be placed on Worker Thread p's local queue.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing7_2.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="WorkStealing7" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Workstealingwithtasksin.NET4.0_CC2E/WorkStealing7_thumb.jpg" width="644" height="448" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;To learn more about the support for parallel programming in .NET 4.0, check out &lt;a href="http://www.danielmoth.com/Blog"&gt;Daniel Moth's&lt;/a&gt; talk from PDC 2008 at &lt;a title="http://channel9.msdn.com/pdc2008/TL26/" href="http://channel9.msdn.com/pdc2008/TL26/"&gt;http://channel9.msdn.com/pdc2008/TL26/&lt;/a&gt;.&amp;#160; It was one of my top 2 favorite talks from PDC last year...Daniel is an amazing presenter and the functionality is just so cool.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Other Resources on Work-Stealing Queues:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.danielmoth.com/Blog/2008/11/new-and-improved-clr-4-thread-pool.html" href="http://www.danielmoth.com/Blog/2008/11/new-and-improved-clr-4-thread-pool.html"&gt;http://www.danielmoth.com/Blog/2008/11/new-and-improved-clr-4-thread-pool.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.bluebytesoftware.com/blog/2008/08/12/BuildingACustomThreadPoolSeriesPart2AWorkStealingQueue.aspx" href="http://www.bluebytesoftware.com/blog/2008/08/12/BuildingACustomThreadPoolSeriesPart2AWorkStealingQueue.aspx"&gt;http://www.bluebytesoftware.com/blog/2008/08/12/BuildingACustomThreadPoolSeriesPart2AWorkStealingQueue.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9805930" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/AXuxhFaCmAQ" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/jennifer/archive/tags/Parallel+Programming/default.aspx">Parallel Programming</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/06/26/work-stealing-in-net-4-0.aspx</feedburner:origLink></item><item><title>Architecture Summit in Southfield, MI</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/VVh-kvVxCa4/architecture-summit-in-southfield-mi.aspx</link><pubDate>Fri, 26 Jun 2009 17:29:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9805716</guid><dc:creator>jennmar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9805716.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9805716</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/ArchitectureSummitinSouthfieldMI_BB72/nplus1_2.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 5px; border-top: 0px; border-right: 0px" border="0" alt="nplus1" align="right" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/ArchitectureSummitinSouthfieldMI_BB72/nplus1_thumb.gif" width="132" height="69" /&gt; nPlus1.org&lt;/a&gt; is hosting its fourth Architecture Summit on July 31st at the Microsoft office in Southfield, MI.&amp;#160; The topic of this summit will be Patterns and Principles. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;Session One: Software Patterns     &lt;br /&gt;&lt;/strong&gt;Patterns are an important tool to use as architects and developers. They provide a common vocabulary for us to design with, as well as a common approach to a common problem. Come learn about useful patterns, and how to use them in your everyday code.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Session Two: How I Learned To Love Dependency Injection      &lt;br /&gt;&lt;/strong&gt;Dependency Injection is one of those scary topics that most developers avoid. It sounds all &amp;#8216;high-falootin&amp;#8217; and complex. It&amp;#8217;s not. Really. We wouldn&amp;#8217;t lie. It&amp;#8217;s a great way to manage complexity in your system, and a great way to make your system so much more testable. And isn&amp;#8217;t that what we all want?     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Each session will be followed by open discussions periods.&amp;#160; A catered lunch will be provided starting at noon when the welcome time begins.&lt;/p&gt;  &lt;p&gt;Register at &lt;a href="https://www.clicktoattend.com/invitation.aspx?code=139245"&gt;https://www.clicktoattend.com/invitation.aspx?code=139245&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;hr align="center" size="1" width="100%" noshade="noshade" /&gt;  &lt;p&gt;&lt;b&gt;About nPlus1.org&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;nPlus1.org is a site dedicated to helping Architects, aspiring Architects and Lead Developers learn, connect and contribute. At nplu1.org you have access to great first party content written by some of the most skilled and experienced Architects working today. You also have access to a nexus of content from around the Internet aimed at keeping Architects up to date on all the new developments in their fields of interest.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9805716" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/VVh-kvVxCa4" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Upcoming+Events/default.aspx">Upcoming Events</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/06/26/architecture-summit-in-southfield-mi.aspx</feedburner:origLink></item><item><title>Parallel.For in .NET 4.0</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/R1ZrE1-cPrA/parallel-for-in-net-4-0.aspx</link><pubDate>Fri, 19 Jun 2009 17:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9791181</guid><dc:creator>jennmar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9791181.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9791181</wfw:commentRss><description>&lt;P&gt;In version 4.0 of the .NET Framework, there is a lot of support for parallel programming.&amp;nbsp; One cool class to know is &lt;A href="http://msdn.microsoft.com/en-us/library/system.threading.parallel(VS.100).aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.threading.parallel(VS.100).aspx"&gt;System.Threading.Parallel&lt;/A&gt;, which contains a number of static methods to parallelize loops and regions.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Consider this code which uses a for loop:&amp;nbsp; &lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;static void &lt;/SPAN&gt;ComputePerfectSquares1()
{
    &lt;SPAN style="COLOR: #2b91af"&gt;Int64&lt;/SPAN&gt;[] perfectSquares = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Int64&lt;/SPAN&gt;[arraySize];

    &lt;SPAN style="COLOR: blue"&gt;for &lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;int &lt;/SPAN&gt;i = 0; i &amp;lt; arraySize; i++)
    {
        perfectSquares[i] = i * i;
        &lt;SPAN style="COLOR: #2b91af"&gt;Thread&lt;/SPAN&gt;.SpinWait(waitTime);  &lt;SPAN style="COLOR: green"&gt;// Pretending this is more computationally difficult
    &lt;/SPAN&gt;}
}&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;
&lt;P&gt;This is a simple example that calculates perfect squares.&amp;nbsp; Because that is a relatively cheap operation, I've also added a Thread.SpinWait to simulate a more computationally expensive action.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Now, I'll write a second method which uses the new &lt;A href="http://msdn.microsoft.com/en-us/library/system.threading.parallel.for(VS.100).aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.threading.parallel.for(VS.100).aspx"&gt;Parallel.For&lt;/A&gt;.&amp;nbsp; This is one of the static methods on the Parallel class.&amp;nbsp; &lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;static void &lt;/SPAN&gt;ComputePerfectSquares2()
{
    &lt;SPAN style="COLOR: #2b91af"&gt;Int64&lt;/SPAN&gt;[] perfectSquares = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Int64&lt;/SPAN&gt;[arraySize];

    &lt;SPAN style="COLOR: #2b91af"&gt;Parallel&lt;/SPAN&gt;.For(0, arraySize, i =&amp;gt;
    {
        perfectSquares[i] = i * i;
        &lt;SPAN style="COLOR: #2b91af"&gt;Thread&lt;/SPAN&gt;.SpinWait(waitTime);  &lt;SPAN style="COLOR: green"&gt;// Pretending this is more computationally difficult
    &lt;/SPAN&gt;});
}&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;The arguments of the parallel for are very similar to the information we provided to the original for.&amp;nbsp; The first argument is the start index (inclusive) and the second argument is the end index (exclusive).&amp;nbsp; I passed in 0 and arraySize, respectively.&amp;nbsp; Then the third argument is the body to be invoked on each iteration; I'm using a lambda expression to do this.&amp;nbsp; There are also some optional parameters with other method overloads.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Next, I wrote some code to test the relative performance of these methods:&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;static void &lt;/SPAN&gt;Main(&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;[] args)
{
    &lt;SPAN style="COLOR: #2b91af"&gt;DateTime &lt;/SPAN&gt;startTime;
    &lt;SPAN style="COLOR: #2b91af"&gt;TimeSpan &lt;/SPAN&gt;duration;

    &lt;SPAN style="COLOR: green"&gt;// Run using original for
    &lt;/SPAN&gt;startTime = &lt;SPAN style="COLOR: #2b91af"&gt;DateTime&lt;/SPAN&gt;.Now;
    ComputePerfectSquares1();
    duration = &lt;SPAN style="COLOR: #2b91af"&gt;DateTime&lt;/SPAN&gt;.Now - startTime;
    &lt;SPAN style="COLOR: #2b91af"&gt;Console&lt;/SPAN&gt;.WriteLine(&lt;SPAN style="COLOR: #a31515"&gt;"Original for: " &lt;/SPAN&gt;+ duration.TotalMilliseconds + &lt;SPAN style="COLOR: #a31515"&gt;" ms"&lt;/SPAN&gt;);

    &lt;SPAN style="COLOR: green"&gt;// Run using parallel for
    &lt;/SPAN&gt;startTime = &lt;SPAN style="COLOR: #2b91af"&gt;DateTime&lt;/SPAN&gt;.Now;
    ComputePerfectSquares2();
    duration = &lt;SPAN style="COLOR: #2b91af"&gt;DateTime&lt;/SPAN&gt;.Now - startTime;
    &lt;SPAN style="COLOR: #2b91af"&gt;Console&lt;/SPAN&gt;.WriteLine(&lt;SPAN style="COLOR: #a31515"&gt;"Parallel for: " &lt;/SPAN&gt;+ duration.TotalMilliseconds + &lt;SPAN style="COLOR: #a31515"&gt;" ms"&lt;/SPAN&gt;);

    &lt;SPAN style="COLOR: green"&gt;// Pause so output can be read.  
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Console&lt;/SPAN&gt;.Read();
}&lt;/PRE&gt;
&lt;P&gt;If I run this code (with arraySize = 1000 and waitTime = 5000000), here are my results: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Parallel.Forin.NET4.0_12731/ParallelForOutput_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Parallel.Forin.NET4.0_12731/ParallelForOutput_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=ParallelForOutput src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Parallel.Forin.NET4.0_12731/ParallelForOutput_thumb.jpg" width=891 height=540 mce_src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Parallel.Forin.NET4.0_12731/ParallelForOutput_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Running in parallel has cut my processing time down by roughly half (which makes sense since my machine has two cores), from 25.5 seconds to 13.5 seconds.&amp;nbsp; Fabulous!&amp;nbsp; &lt;/P&gt;
&lt;P&gt;However, note that if I remove the "Thread.SpinWait" and run again, the original for loop performs better than the parallel for loop:&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Parallel.Forin.NET4.0_12731/ParallelForOutputWithoutSpinWait_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Parallel.Forin.NET4.0_12731/ParallelForOutputWithoutSpinWait_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=ParallelForOutputWithoutSpinWait src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Parallel.Forin.NET4.0_12731/ParallelForOutputWithoutSpinWait_thumb.jpg" width=895 height=542 mce_src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/Parallel.Forin.NET4.0_12731/ParallelForOutputWithoutSpinWait_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;This is because there is some overhead to using the parallel version.&amp;nbsp; The lesson here: don't parallelize all of your work blindly, but measure performance, find out where the computationally-expensive bottlenecks are and if they can be broken down into smaller chunks that can be run in parallel, and then use this functionality there.&amp;nbsp; The Parallel class is a wonderful resource, giving you an easy way to run a for loop (and other programming constructs) in parallel.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;For reference, I've attached the entirety of my program.&amp;nbsp; Note that I did do some refactoring from the code above (which contains a lot of duplication), but I thought it was easier to understand if I inlined in the examples above.&amp;nbsp; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9791181" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/R1ZrE1-cPrA" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/jennifer/archive/tags/Parallel+Programming/default.aspx">Parallel Programming</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/06/19/parallel-for-in-net-4-0.aspx</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/JenniferMarsman/~5/jw5p07e8Idc/9791181.ashx" length="27222" type="application/x-zip-compressed" /><feedburner:origEnclosureLink>http://blogs.msdn.com/jennifer/attachment/9791181.ashx</feedburner:origEnclosureLink></item><item><title>XBOX Project Natal</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/EylQ3Dyc1cs/xbox-project-natal.aspx</link><pubDate>Thu, 18 Jun 2009 18:23:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9776970</guid><dc:creator>jennmar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9776970.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9776970</wfw:commentRss><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;I am completely psyched about &lt;a href="http://www.xbox.com/en-US/live/projectnatal/"&gt;XBOX Project Natal&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:ae1943fa-5157-40d1-8525-fe3ec40ef80c" class="wlWriterSmartContent"&gt;&lt;div id="9c5df7a7-f438-49e0-a1a7-916d1639baaf" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=I9tmr8VDqN8" target="_new"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/XBOXProjectNatal_9D30/videocb4bd4486109.jpg" galleryimg="no" onload="var downlevelDiv = document.getElementById('9c5df7a7-f438-49e0-a1a7-916d1639baaf'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;350\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/I9tmr8VDqN8\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;param name=\&amp;quot;wmode\&amp;quot; value=\&amp;quot;transparent\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/I9tmr8VDqN8\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; wmode=\&amp;quot;transparent\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;350\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;How sweet is that? Without a controller, the game responds to your body&amp;#8217;s movements. You can watch &lt;a href="http://www.youtube.com/watch?v=YL06VwEmgzI"&gt;real people using it&lt;/a&gt; at the E3 conference. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9776970" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/EylQ3Dyc1cs" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/XBOX/default.aspx">XBOX</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/06/18/xbox-project-natal.aspx</feedburner:origLink></item><item><title>Events hosted by SRT Solutions</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/tKeigG4b7GQ/events-hosted-by-srt-solutions.aspx</link><pubDate>Thu, 11 Jun 2009 15:44:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9726786</guid><dc:creator>jennmar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9726786.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9726786</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://srtsolutions.com"&gt;SRT Solutions&lt;/a&gt; is running a number of events next week, which may be of interest to those in the Detroit/Ann Arbor area.&amp;#160; &lt;/p&gt;  &lt;p&gt;First, there is a &lt;a href="http://srtsolutions.com/blogs/pressreleases/archive/2009/05/18/srt-solutions-presents-software-stimulus-lab-to-support-economic-business-growth.aspx"&gt;Software Stimulus lab&lt;/a&gt; on Monday, June 15.&amp;#160; This features two distinct sessions: the morning session introduces effective software engineering techniques, such as version control, continuous integration, and automated testing, and the afternoon session focuses on topics of interest to attendees.&amp;#160; You can register at &lt;a title="http://srtstimulus.eventbrite.com/" href="http://srtstimulus.eventbrite.com/"&gt;http://srtstimulus.eventbrite.com/&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;Secondly, they are offering executive briefings on emerging technologies.&amp;#160; These high-level briefings are designed to help business owners and CEOs understand critical emerging technologies along with their potential impact and benefits.&amp;#160; They will focus on &amp;#8220;WHY&amp;#8221; you might adopt a new technology, rather than &amp;quot;HOW&amp;quot; to implement it.&amp;#160; The events will be held at Ann Arbor SPARK.&amp;#160; On June 16, the topics are Cloud Computing and Rich Internet Applications.&amp;#160; On June 18, the topics are Natural User Interfaces and Social Networking in Business.&amp;#160; The sessions run from 8:30am-noon and the cost is $150 (continental breakfast included).&amp;#160; You can register using the links below.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;June 16 &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Save Money with Green Computing: Leveraging Cloud Platforms&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Cloud Computing platforms promise to give you flexibility to scale your IT infrastructure on demand and deliver global scope with lower cost. In this session you&amp;#8217;ll learn why Microsoft, Google and Amazon all believe your business will be more productive, green, and cost-effective with cloud computing.&amp;#160; But we&amp;#8217;ll go beyond that. We&amp;#8217;ll talk about YOUR business and whether or not it makes sense to have a cloud strategy.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Gain Competitive Advantage with Rich Internet Applications &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Rich Internet Applications, Web 2.0&amp;#8230; buzzwords or opportunities for competitive advantage? Learn what RIA means for your products and internal IT investments, including why online and offline mode matters and how to use RIA concepts to create rich user experiences. See how you can use browser-based technology to create reach and outpace your competition. &lt;/p&gt;  &lt;p&gt;Signup:&amp;#160; &lt;a href="http://srtexecjune16.eventbrite.com/"&gt;http://srtexecjune16.eventbrite.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;June 18 &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Natural User Interfaces: R.I.P. Mouse &amp;amp; Keyboard &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Imagine gaining productivity and effectiveness by changing how you interact with your computer. iPhone, Microsoft Surface, and Windows 7 MultiTouch are the future of user interfaces and offer ways to help you gain a competitive edge. Get an insider&amp;#8217;s look at these platforms and see their potential for helping your business succeed. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Social Networking for Business: Beyond the Mainstream&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Twitter, Facebook, Digg, the blogosphere: Your customers are interacting on these platforms&amp;#8230; smart businesses do, too.&amp;#160;&amp;#160; Learn how to find and react quickly to comments about your company.&amp;#160; See examples of how companies are building positive, committed brand value through social networks.&amp;#160;&amp;#160; Beyond such mainstream use as Oprah and other celebrities, discover social networking discussions pertinent to your business, participate in those discussions, and ultimately improve your image with customers and prospects.&lt;/p&gt;  &lt;p&gt;Signup:&amp;#160; &lt;a href="http://srtexecjune18.eventbrite.com/"&gt;http://srtexecjune18.eventbrite.com/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9726786" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/tKeigG4b7GQ" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Ann+Arbor/default.aspx">Ann Arbor</category><category domain="http://blogs.msdn.com/jennifer/archive/tags/Upcoming+Events/default.aspx">Upcoming Events</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/06/11/events-hosted-by-srt-solutions.aspx</feedburner:origLink></item><item><title>Interview on Windows Azure, hosted by David Giard</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/CUfOVJJTom0/interview-on-windows-azure-hosted-by-david-giard.aspx</link><pubDate>Tue, 09 Jun 2009 13:30:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9716000</guid><dc:creator>jennmar</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9716000.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9716000</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://www.davidgiard.com"&gt;David Giard&lt;/a&gt; hosted me on his &lt;a href="http://www.viddler.com/explore/dgiard/videos/"&gt;webcast series&lt;/a&gt;.&amp;#160; The topic was &lt;a href="http://www.azure.com"&gt;Windows Azure&lt;/a&gt;.&amp;#160; &lt;/p&gt; &lt;object id="viddler" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="437" height="370" playmovie="playmovie" pausemovie="pausemovie" stopmovie="stopmovie" setmovie="setmovie" viddlerpause="viddlerpause" viddleropen="viddleropen" viddlerswitch="viddlerswitch" viddlerseek="viddlerseek" gettimepoint="gettimepoint" gettimepoint="gettimepoint" viddlerseek="viddlerseek" viddlerswitch="viddlerswitch" viddleropen="viddleropen" viddlerpause="viddlerpause" setmovie="setmovie" stopmovie="stopmovie" pausemovie="pausemovie" playmovie="playmovie"&gt;&lt;param name="_cx" value="11562"&gt;&lt;param name="_cy" value="9789"&gt;&lt;param name="FlashVars" value=""&gt;&lt;param name="Movie" value="http://www.viddler.com/player/25f29c9b/"&gt;&lt;param name="Src" value="http://www.viddler.com/player/25f29c9b/"&gt;&lt;param name="WMode" value="Window"&gt;&lt;param name="Play" value="0"&gt;&lt;param name="Loop" value="-1"&gt;&lt;param name="Quality" value="High"&gt;&lt;param name="SAlign" value="LT"&gt;&lt;param name="Menu" value="0"&gt;&lt;param name="Base" value=""&gt;&lt;param name="AllowScriptAccess" value="always"&gt;&lt;param name="Scale" value="NoScale"&gt;&lt;param name="DeviceFont" value="0"&gt;&lt;param name="EmbedMovie" value="0"&gt;&lt;param name="BGColor" value=""&gt;&lt;param name="SWRemote" value=""&gt;&lt;param name="MovieData" value=""&gt;&lt;param name="SeamlessTabbing" value="1"&gt;&lt;param name="Profile" value="0"&gt;&lt;param name="ProfileAddress" value=""&gt;&lt;param name="ProfilePort" value="0"&gt;&lt;param name="AllowNetworking" value="all"&gt;&lt;param name="AllowFullScreen" value="true"&gt;    &lt;embed src="http://www.viddler.com/player/25f29c9b/" width="437" height="370" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" name="viddler"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;Links:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.davidgiard.com/2009/05/28/JenniferMarsmanOnWindowsAzure.aspx" href="http://www.davidgiard.com/2009/05/28/JenniferMarsmanOnWindowsAzure.aspx"&gt;http://www.davidgiard.com/2009/05/28/JenniferMarsmanOnWindowsAzure.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.viddler.com/explore/dgiard/videos/135/" href="http://www.viddler.com/explore/dgiard/videos/135/"&gt;http://www.viddler.com/explore/dgiard/videos/135/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9716000" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/CUfOVJJTom0" height="1" width="1"/&gt;</description><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/06/09/interview-on-windows-azure-hosted-by-david-giard.aspx</feedburner:origLink></item><item><title>Queues in Windows Azure Storage</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/aR5Zjqq3_Hw/queues-in-windows-azure-storage.aspx</link><pubDate>Fri, 05 Jun 2009 19:59:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9701890</guid><dc:creator>jennmar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9701890.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9701890</wfw:commentRss><description>&lt;p&gt;This warrants calling out - the queues in Windows Azure aren't your typical FIFO queue/dequeue mechanism.&amp;#160; They actually use a two-step dequeuing process.&amp;#160; &lt;/p&gt;  &lt;p&gt;Imagine the typical Windows Azure architecture where a web role (or multiple web roles) accepts incoming network traffic, pushes work onto a queue, and then the work is dequeued and done by worker roles.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/QueuesinWindowsAzureStorage_14F09/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/QueuesinWindowsAzureStorage_14F09/image_thumb_1.png" width="640" height="303" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Let's look at how to dequeue.&amp;#160; This dequeuing code is taken from the Thumbnails sample in the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=22703881-1197-49e5-8231-f49095cfd0bb"&gt;Windows Azure SDK&lt;/a&gt;.&amp;#160; It's done by the worker role.&amp;#160; &lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;QueueStorage &lt;/span&gt;queueStorage = &lt;span style="color: #2b91af"&gt;QueueStorage&lt;/span&gt;.Create(&lt;span style="color: #2b91af"&gt;StorageAccountInfo&lt;/span&gt;.GetDefaultQueueStorageAccountFromConfiguration());
&lt;span style="color: #2b91af"&gt;MessageQueue &lt;/span&gt;queue = queueStorage.GetQueue(&lt;span style="color: #a31515"&gt;&amp;quot;thumbnailmaker&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;while &lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;)
{
    &lt;span style="color: blue"&gt;try
    &lt;/span&gt;{
        &lt;span style="color: #2b91af"&gt;Message &lt;/span&gt;msg = queue.GetMessage();
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(msg != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color: blue"&gt;string &lt;/span&gt;path = msg.ContentAsString();

            &lt;span style="color: #2b91af"&gt;RoleManager&lt;/span&gt;.WriteToLog(&lt;span style="color: #a31515"&gt;&amp;quot;Information&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Dequeued '{0}'&amp;quot;&lt;/span&gt;, path));

            &lt;span style="color: green"&gt;// Insert code to process the message and do the work here...

            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RoleManager&lt;/span&gt;.WriteToLog(&lt;span style="color: #a31515"&gt;&amp;quot;Information&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Done with '{0}'&amp;quot;&lt;/span&gt;, path));

            queue.DeleteMessage(msg);
        }
        &lt;span style="color: blue"&gt;else
        &lt;/span&gt;{
            &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.Sleep(1000);
        }
    }
    &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;StorageException &lt;/span&gt;e)
    {
        &lt;span style="color: green"&gt;// Explicitly catch all exceptions of type StorageException here because we should be able to 
        // recover from these exceptions next time the queue message, which caused this exception,
        // becomes visible again.

        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RoleManager&lt;/span&gt;.WriteToLog(&lt;span style="color: #a31515"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Exception when processing queue item. Message: '{0}'&amp;quot;&lt;/span&gt;, e.Message));
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;So what's going on here?&amp;#160; After we get a reference to the queue, we're starting an infinite loop.&amp;#160; That is because we want the worker to continuously wake up, check the queue for new messages, process the messages if there are any, and then sleep if there are no new messages.&amp;#160; &lt;/p&gt;

&lt;p&gt;Now, let's look at the dequeuing process.&amp;#160; &lt;/p&gt;

&lt;p&gt;The first step is to call &lt;strong&gt;queue.GetMessage()&lt;/strong&gt;.&amp;#160; This gives us a copy of the message, but it actually doesn't remove the message from the queue.&amp;#160; Instead, the message remains on the queue, but is put into a hidden state.&amp;#160; Then worker roles can continue to process other messages behind it on the queue.&amp;#160; After a certain amount of time passes, if the second step of the dequeuing process hasn't been completed, the message will come out of the hidden state and be re-added to the queue.&amp;#160; Why does this behavior make sense?&amp;#160; Imagine if a worker role dequeued a message for processing, but then the worker role died in mid-process.&amp;#160; With this architecture, after the configured amount of time passes with no followup from the worker role, the message will be re-added to the queue and processed by another worker role, instead of data being lost.&amp;#160; &lt;/p&gt;

&lt;p&gt;The second step is to call &lt;strong&gt;queue.DeleteMessage()&lt;/strong&gt;, after the message has been successfully processed.&amp;#160; This step completes the dequeuing and removes the message from the queue.&amp;#160; &lt;/p&gt;

&lt;p&gt;Also, note the use of &lt;strong&gt;RoleManager.WriteToLog()&lt;/strong&gt; throughout the code.&amp;#160; When your code is running in the cloud, you can't attach a debugger to it.&amp;#160; (There are a couple of reasons for this.&amp;#160; First, there are security concerns.&amp;#160; Debuggers essentially latch onto a running process and this could be dangerous in a shared environment like the cloud.&amp;#160; Secondly, when your app is running in the cloud, it's in a production environment.&amp;#160; You really shouldn't be debugging and stepping through code that's running in production.)&amp;#160; Therefore, use logging to figure out what's going on with your code.&amp;#160; There's a good video from PDC 2008 that gives best practices on logging effectively in Windows Azure at &lt;a href="http://channel9.msdn.com/pdc2008/ES03/"&gt;http://channel9.msdn.com/pdc2008/ES03/&lt;/a&gt;.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9701890" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/aR5Zjqq3_Hw" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/06/05/queues-in-windows-azure-storage.aspx</feedburner:origLink></item><item><title>Windows Azure Developer Contest - Win Fame and Fortune (literally)!</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/hqC9xUJHKBU/windows-azure-developer-contest-win-fame-and-fortune-literally.aspx</link><pubDate>Fri, 05 Jun 2009 19:00:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9701806</guid><dc:creator>jennmar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9701806.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9701806</wfw:commentRss><description>&lt;p&gt;This &lt;a href="http://www.newcloudapp.com/"&gt;new CloudApp() contest&lt;/a&gt; looks extremely cool: the objective is to create a cloud application running on Windows Azure.&amp;#160; There are categories for both .NET and PHP applications.&amp;#160; The contest will be judged by Michael Cote, Om Malik, and you - the developer community will vote on a winner too.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/WindowsAzureDeveloperContest_130A2/AzureLogo_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="AzureLogo" align="right" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/WindowsAzureDeveloperContest_130A2/AzureLogo_thumb.jpg" width="207" height="49" /&gt;&lt;/a&gt;The full details are at &lt;a title="http://www.newcloudapp.com/" href="http://www.newcloudapp.com/"&gt;http://www.newcloudapp.com/&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;The prizes are literally fame and fortune.&amp;#160; &lt;/p&gt;  &lt;p&gt;The fame:&lt;/p&gt;  &lt;li&gt;Be featured on &lt;a href="http://www.azure.com/"&gt;www.azure.com&lt;/a&gt; as well as at major Microsoft events&lt;/li&gt;  &lt;li&gt;Be featured in a video interview on &lt;a href="http://channel9.msdn.com/"&gt;Channel 9&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;Be announced at &lt;a href="http://events.gigaom.com/structure/09/"&gt;Structure 09&lt;/a&gt; (U.S. Only)&lt;/li&gt;  &lt;p&gt;The fortune:&lt;/p&gt;  &lt;li&gt;One .NET App Category (U.S. Only) Grand Prize winner: $5,000 VISA gift card&lt;/li&gt;  &lt;li&gt;One PHP App Category (U.S. Only) Grand Prize winner: $5,000 VISA gift card&lt;/li&gt;  &lt;li&gt;One U.S. Community winner: $2,500 VISA gift card&lt;/li&gt;  &lt;li&gt;One International Community winner: $2,500 VISA gift card&lt;/li&gt;  &lt;p&gt;Submission are due by &lt;strong&gt;June 18&lt;/strong&gt;.&amp;#160; Good luck!&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9701806" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/hqC9xUJHKBU" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/06/05/windows-azure-developer-contest-win-fame-and-fortune-literally.aspx</feedburner:origLink></item><item><title>Surface Development Part 5: Futures and Resources</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/jWTn6UjK9XU/surface-development-part-5-futures-and-resources.aspx</link><pubDate>Fri, 22 May 2009 18:38:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9635679</guid><dc:creator>jennmar</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9635679.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9635679</wfw:commentRss><description>&lt;p&gt;Hopefully you've learned a little about Surface development this week!&amp;#160; I didn't originally intend to have a fifth section, but wanted to include the new announcements and some resources for further investigation.&amp;#160; &lt;/p&gt;  &lt;p&gt;First, at &lt;a href="http://www.msteched.com/teched/default.aspx"&gt;TechEd&lt;/a&gt; last week, the Surface team &lt;a href="http://blogs.msdn.com/surface/archive/2009/05/10/service-pack-1-officially-released-today.aspx"&gt;announced Surface 1.0 SP1&lt;/a&gt;.&amp;#160; Cruise over to the &lt;a href="http://blogs.msdn.com/surface"&gt;Surface team blog&lt;/a&gt; to get all of the details on SP1, but here's a quick summary of some of the new features and improvements:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Contact visualizations&lt;/strong&gt; such as subtle UI trails in response to fingers on the Surface top&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;International support&lt;/strong&gt; including virtual keyboards in other languages&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;New &amp;quot;LibraryStack&amp;quot; control&lt;/strong&gt; - lets you neatly stack items, as opposed to the artful scattering of the ScatterView&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;New &amp;quot;ElementMenu&amp;quot; control&lt;/strong&gt; - circular UI on the top of an item that expands menu options&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Stress testing tool &lt;/strong&gt;- how awesome is this!&amp;#160; Stress testing for the Surface is very difficult when you just have a mouse to work with.&amp;#160; This allows you to simulate lots of fingers, tags, and blobs touching the Surface top.&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Object routing&lt;/strong&gt; -&lt;strong&gt; &lt;/strong&gt;launching applications via tagged objects &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ScatterView and TagVisualizer enhancements&lt;/strong&gt;, including a DragDropScatterView control&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here is a &lt;a href="http://www.youtube.com/watch?v=g4xxNpijEKQ&amp;amp;feature=player_embedded"&gt;video walkthrough&lt;/a&gt; of some of the new features:&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:992b1310-40eb-4dd9-9a0f-8781722ca6e0" class="wlWriterSmartContent"&gt;&lt;div id="4f5c84df-2417-4438-8468-02ae90b15aef" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=g4xxNpijEKQ&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/SurfaceDevelopmentPart5FuturesandResourc_A7BA/video270dd1b8857c.jpg" galleryimg="no" onload="var downlevelDiv = document.getElementById('4f5c84df-2417-4438-8468-02ae90b15aef'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;350\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/g4xxNpijEKQ&amp;amp;feature=player_embedded\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;param name=\&amp;quot;wmode\&amp;quot; value=\&amp;quot;transparent\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/g4xxNpijEKQ&amp;amp;feature=player_embedded\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; wmode=\&amp;quot;transparent\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;350\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Secondly, here are some resources to help you with Surface development:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Surface website: &lt;a title="http://www.microsoft.com/surface/" href="http://www.microsoft.com/surface/"&gt;http://www.microsoft.com/surface/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Surface team blog: &lt;a title="http://blogs.msdn.com/surface" href="http://blogs.msdn.com/surface"&gt;http://blogs.msdn.com/surface&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Video of Surface session at PDC: &lt;a title="http://channel9.msdn.com/pdc2008/PC17/" href="http://channel9.msdn.com/pdc2008/PC17/"&gt;http://channel9.msdn.com/pdc2008/PC17/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Video of Surface session at TechEd: &lt;a title="http://www.msteched.com/online/view.aspx?tid=eb4cd73b-e08b-41f2-a241-727a043dbfec" href="http://www.msteched.com/online/view.aspx?tid=eb4cd73b-e08b-41f2-a241-727a043dbfec"&gt;http://www.msteched.com/online/view.aspx?tid=eb4cd73b-e08b-41f2-a241-727a043dbfec&lt;/a&gt; (This is only viewable by TechEd attendees.)&amp;#160; &lt;/li&gt;    &lt;li&gt;Surface community site: &lt;a title="http://community.surface.com" href="http://community.surface.com"&gt;http://community.surface.com&lt;/a&gt; (This is the site that isn't open to the public; you need an invitation.&amp;#160; You can download the SDK from here and there are also forums for questions.)&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Other posts in this Surface Development series&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/jennifer/archive/2009/05/18/surface-development-part-1-what-is-the-microsoft-surface.aspx"&gt;Surface Development Part 1: What is the Microsoft Surface?&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/jennifer/archive/2009/05/19/surface-development-part-2-surface-controls.aspx"&gt;Surface Development Part 2: Surface Controls&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/jennifer/archive/2009/05/20/surface-development-part-3-scatterview.aspx"&gt;Surface Development Part 3: ScatterView&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/jennifer/archive/2009/05/21/surface-development-part-4-reacting-to-physical-objects.aspx"&gt;Surface Development Part 4: Reacting to Physical Objects&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9635679" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/jWTn6UjK9XU" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Surface/default.aspx">Surface</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/05/22/surface-development-part-5-futures-and-resources.aspx</feedburner:origLink></item><item><title>Surface Development Part 4: Reacting to Physical Objects</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/nwFKIOfv4bY/surface-development-part-4-reacting-to-physical-objects.aspx</link><pubDate>Thu, 21 May 2009 21:00:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9634311</guid><dc:creator>jennmar</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9634311.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9634311</wfw:commentRss><description>&lt;p&gt;Surface has the ability to recognize and respond to actual physical real-world objects placed on the Surface top, and it does this by means of tags.&amp;#160; &lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;Recognize&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;There are two types of tags that are recognized by Surface's vision system:&lt;/p&gt;  &lt;blockquote&gt;   &lt;div align="center"&gt;     &lt;table border="0" cellspacing="0" cellpadding="2" width="400" align="center"&gt;&lt;tbody&gt;         &lt;tr&gt;           &lt;td width="200" align="center"&gt;Byte tags&lt;/td&gt;            &lt;td width="200" align="center"&gt;Identity tag&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td width="200" align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/SurfaceDevelopmentPart4ReactingtoPhysica_D73D/ByteTag_1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="ByteTag" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/SurfaceDevelopmentPart4ReactingtoPhysica_D73D/ByteTag_thumb_1.png" width="366" height="238" /&gt;&lt;/a&gt;&lt;/td&gt;            &lt;td width="200" align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/SurfaceDevelopmentPart4ReactingtoPhysica_D73D/IdentityTag_1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="IdentityTag" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/SurfaceDevelopmentPart4ReactingtoPhysica_D73D/IdentityTag_thumb_1.png" width="108" height="109" /&gt;&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;   &lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Byte tags&lt;/strong&gt; have 256 unique values.&amp;#160; They can be used in Surface applications where the Surface reacts to a few different physical objects.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Identity tags&lt;/strong&gt; have 340,282,366,920,938 septillion (that's 24 more zeroes) unique values.&amp;#160; They can be used in Surface applications where you need to uniquely identify a large number of people, such as tags on a hotel loyalty card.&amp;#160; &lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;Respond&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;Next, let's look at the code that you would write to allow the Surface to respond to a tag.&amp;#160; This is done by the &lt;b&gt;TagVisualizer&lt;/b&gt; control, along with &lt;b&gt;TagVisualization&lt;/b&gt; and &lt;strong&gt;TagVisualizationDefinition&lt;/strong&gt;, in the namespace &lt;strong&gt;Microsoft.Surface.Presentation.Controls&lt;/strong&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;For example, let&amp;#8217;s say that we are writing an application for a retail store which sells cellular phones, using the Surface as a kiosk to display product information.&amp;#160; (This is a real scenario - &lt;a href="http://www.microsoft.com/presspass/press/2008/apr08/04-01SurfaceRetailPR.mspx"&gt;AT&amp;amp;T is currently doing this&lt;/a&gt; in select stores.)&amp;#160; When you set a cell phone on the Surface top, you want a visualization with information on the phone specs, calling plans, network coverage, etc. to appear on the Surface next to it.&amp;#160; To accomplish this, the steps are: &lt;/p&gt;  &lt;p&gt;1. Create a &lt;b&gt;TagVisualization&lt;/b&gt; which contains the XAML to display the phone specs, calling plans, network coverage, etc.&amp;#160; In Visual Studio, you can right-click on a Surface project in the Solution Explorer and select Add, New Item.&amp;#160; Select a &amp;quot;Tag Visualization (WPF)&amp;quot; and name it CellPhoneData.xaml.&amp;#160; Then, in that XAML, you can create a rich visual experience which displays the relevant cell phone data.&amp;#160; &lt;/p&gt;  &lt;p&gt;2. Put a physical tag on the cell phone (tags are included with the Surface unit).&amp;#160; In this scenario, there will probably be a limited number of demo cell phones available for customers to play with, so a byte tag would suffice.&amp;#160; Let's say that the tag that we put on the Samsung Saga cell phone was 0xC1 (one of the tags shown above).&amp;#160; &lt;/p&gt;  &lt;p&gt;3. Create a &lt;b&gt;TagVisualizer&lt;/b&gt;, which contains a &lt;b&gt;TagVisualizationDefinition&lt;/b&gt;.&amp;#160; This maps the TagVisualization that we created in step #1 to the tag&amp;#8217;s value, enabling the cell phone data visualization to appear when the tagged cell phone is placed on the Surface.&amp;#160; The code would look something like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TagVisualizer&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TagVisualizer.Definitions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ByteTagVisualizationDefinition
            &lt;/span&gt;&lt;span style="color: red"&gt;Source&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;CellPhoneData.xaml&amp;quot;
            &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;0xC1&amp;quot;
            &lt;/span&gt;&lt;span style="color: red"&gt;PhysicalCenterOffsetFromTag&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;-.23,-.4&amp;quot;
            &lt;/span&gt;&lt;span style="color: red"&gt;OrientationOffsetFromTag&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;266&amp;quot;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TagVisualizer.Definitions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TagVisualizer&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Note that this code would be in the main SurfaceWindow XAML, not in the TagVisualization XAML.&amp;#160; We can set the various offsets to make the cell phone data on the Surface appear positioned properly from the physical cell phone.&amp;#160; Optionally, we could set other properties, like the maximum number of cell phones allowed and the behavior when a tag is removed from the Surface.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9634311" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/nwFKIOfv4bY" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Surface/default.aspx">Surface</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/05/21/surface-development-part-4-reacting-to-physical-objects.aspx</feedburner:origLink></item><item><title>Surface Development Part 3: ScatterView</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/qLmrT__CQt8/surface-development-part-3-scatterview.aspx</link><pubDate>Wed, 20 May 2009 22:32:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9632976</guid><dc:creator>jennmar</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9632976.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9632976</wfw:commentRss><description>&lt;p&gt;One of the special facets of Surface applications is that they are highly collaborative, because you have a 360-degree view of the application.&amp;#160; To support this amazing experience, a good class to learn is &lt;strong&gt;ScatterView&lt;/strong&gt;, in the namespace &lt;strong&gt;Microsoft.Surface.Presentation.Controls&lt;/strong&gt;.&lt;strong&gt;&amp;#160; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The ScatterView control quickly enables 360-degree applications. Using data binding as you would in WPF, you can connect a ScatterView to a directory of images and the control will artfully scatter the pictures across the Surface top. It also standardizes the manipulations for resizing, moving, and rotating the pictures.&amp;#160; &lt;/p&gt;  &lt;p&gt;Using the Surface SDK, I can create a new project in Visual Studio using the Surface Application (WPF) template.&amp;#160; In the SurfaceWindow1.xaml file that is created by default, I can create a ScatterView in the Grid:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScatterView &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Scatter&amp;quot;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScatterView.ItemTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Image &lt;/span&gt;&lt;span style="color: red"&gt;Source&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;}&amp;quot;/&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScatterView.ItemTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScatterView&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;We're simply creating a ScatterView and filling the items in the ScatterView using standard databinding, just like we would do in WPF.&amp;#160; &lt;/p&gt;

&lt;p&gt;Then in the codebehind, I can hook up the databinding in the SurfaceWindow1 constructor: &lt;/p&gt;

&lt;pre class="code"&gt;Scatter.ItemsSource = System.IO.&lt;span style="color: #2b91af"&gt;Directory&lt;/span&gt;.GetFiles(
    &lt;span style="color: #a31515"&gt;@&amp;quot;C:\Users\Public\pictures\Sample Pictures&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;*.jpg&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;This will grab all of the pictures in the Sample Pictures directory with the .jpg extension (and all of the samples are .jpgs).&amp;#160; &lt;/p&gt;

&lt;p&gt;I'm not currently developing this code on a Surface unit, so when I press F5 to run, it invokes the Surface emulator on my laptop, which displays this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/SurfaceDevelopmentPart3ScatterView_C63D/ScatterView_2.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="ScatterView" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/SurfaceDevelopmentPart3ScatterView_C63D/ScatterView_thumb.jpg" width="635" height="480" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I can use my mouse to move the pictures around on my laptop screen.&amp;#160; On the Surface, I would be able to move, rotate, and resize the pictures with simple intuitive hand gestures, like stretching and flicking, that mimic the way you would interact with a real physical object.&amp;#160; &lt;/p&gt;

&lt;p&gt;Pretty cool, huh?&amp;#160; With relatively few lines of code, I could produce a natural interface to interact with photos.&amp;#160; &lt;/p&gt;

&lt;p&gt;By default, you can move, rotate, and resize these pictures.&amp;#160; However, there are scenarios when you might not want this behavior.&amp;#160; For example, perhaps you want tokens on a game board to be able to move around, but not be resizable.&amp;#160; There are properties that you can tweak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CanScale&lt;/strong&gt; - Boolean that specifies whether you can resize a photo&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;CanRotate&lt;/strong&gt; - Boolean that specifies whether you can rotate a photo&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;DecelerationRate&lt;/strong&gt; - double that specifies the rate of translational deceleration.&amp;#160; This value is measured in device-independent units per second squared.&amp;#160; By default, the value is set so that when an item is travelling at 1,536 pixels per second (that is, 16 inches per second at 96 DPI), the item takes 1 second to decelerate fully.&amp;#160; &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;AngularDecelerationRate&lt;/strong&gt; - double that specifies the rate of angular deceleration.&amp;#160; This value is measured in degrees per second squared.&amp;#160; By default, the value is set so that when an item is rotating at 270 degrees per second, the item takes 1 second to decelerate fully.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, Robert Levy also did a video showing the ScatterView control &lt;a href="http://video.msn.com/video.aspx?vid=6acfce98-17d3-416f-b2c0-679356c5ce79"&gt;here&lt;/a&gt;.&amp;#160;&amp;#160; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:6f7045e0-cdef-4ffb-95f4-b03867a3f493" class="wlWriterSmartContent"&gt;&lt;div id="ffa15942-20f5-4cdd-ae48-d77782ffef50" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://video.msn.com/video.aspx?vid=6acfce98-17d3-416f-b2c0-679356c5ce79" target="_new"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/SurfaceDevelopmentPart3ScatterView_C63D/video6e9249d9c149.jpg" galleryimg="no" onload="var downlevelDiv = document.getElementById('ffa15942-20f5-4cdd-ae48-d77782ffef50'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;embed src=\&amp;quot;http://images.video.msn.com/flash/soapbox1_1.swf\&amp;quot; quality=\&amp;quot;high\&amp;quot; width=\&amp;quot;432\&amp;quot; height=\&amp;quot;364\&amp;quot; wmode=\&amp;quot;transparent\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; pluginspage=\&amp;quot;http://macromedia.com/go/getflashplayer\&amp;quot; flashvars=\&amp;quot;c=v&amp;amp;v=6acfce98-17d3-416f-b2c0-679356c5ce79&amp;amp;from=writer\&amp;quot; &amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9632976" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/qLmrT__CQt8" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Surface/default.aspx">Surface</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/05/20/surface-development-part-3-scatterview.aspx</feedburner:origLink></item><item><title>Surface Development Part 2: Surface Controls</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/tAi6eSuyDWQ/surface-development-part-2-surface-controls.aspx</link><pubDate>Tue, 19 May 2009 16:40:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9628528</guid><dc:creator>jennmar</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9628528.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9628528</wfw:commentRss><description>&lt;p&gt;Are you familiar with WPF?&amp;#160; If so, you&amp;#8217;re most of the way there with Surface development!&amp;#160; Many of the Surface controls derive from and have similar functionality to corresponding WPF controls, but provide extra enhancements for the Surface.&amp;#160; For example, the Surface&amp;#8217;s SurfaceWindow has very close functionality to the WPF Window, except the SurfaceWindow runs full screen on the Surface (because all Surface apps run maximized on the Surface space) and automatically orients the display toward the user (since the Surface is a 360-degree environment).&amp;#160; The table below illustrates some examples of WPF controls, the equivalent Surface controls, and the extra functionality that the Surface control gives to support the Surface multi-touch experience.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="667"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="130"&gt;&lt;b&gt;WPF Control&lt;/b&gt;&lt;/td&gt;        &lt;td valign="top" width="135"&gt;&lt;b&gt;Surface Control&lt;/b&gt;&lt;/td&gt;        &lt;td valign="top" width="400"&gt;&lt;b&gt;Extra Functionality in Surface Control&lt;/b&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="129"&gt;Window&lt;/td&gt;        &lt;td valign="top" width="136"&gt;SurfaceWindow&lt;/td&gt;        &lt;td valign="top" width="400"&gt;Runs full screen on the Surface, oriented towards the user&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="128"&gt;Menu&lt;/td&gt;        &lt;td valign="top" width="137"&gt;SurfaceMenu&lt;/td&gt;        &lt;td valign="top" width="400"&gt;Multiple menus can be used at the same time (multi-touch support)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="128"&gt;Button&lt;/td&gt;        &lt;td valign="top" width="138"&gt;SurfaceButton&lt;/td&gt;        &lt;td valign="top" width="400"&gt;Only &amp;#8220;clicks&amp;#8221; when all fingers are removed from button&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="128"&gt;ListBox&lt;/td&gt;        &lt;td valign="top" width="138"&gt;SurfaceListBox&lt;/td&gt;        &lt;td valign="top" width="400"&gt;Determines scrolling vs. select, allows flicking gesture to scroll through list, provides elastic effect when end of list is reached&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="128"&gt;ScrollBar&lt;/td&gt;        &lt;td valign="top" width="138"&gt;SurfaceScrollBar&lt;/td&gt;        &lt;td valign="top" width="400"&gt;Allows flicking, scroll bar grows thicker to better fit finger when touched and then returns to original thin UI&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="128"&gt;TextBox&lt;/td&gt;        &lt;td valign="top" width="139"&gt;SurfaceTextBox&lt;/td&gt;        &lt;td valign="top" width="400"&gt;Invokes virtual keyboard oriented towards user when touched&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Of course, this is not a comprehensive list of controls.&amp;#160; There are many more Surface controls than just these.&amp;#160; For example, in addition to the SurfaceButton, there is a SurfaceRadioButton, SurfaceCheckBox, and SurfaceToggleButton, and they share the extra functionality of only clicking when all contacts are removed from the control.&amp;#160; So if two users touch a SurfaceButton or one of these other controls, and then one user lifts his finger, the &amp;quot;Click&amp;quot; event will not fire until the second user lifts her finger too.&amp;#160; &lt;/p&gt;  &lt;p&gt;However, this table does demonstrate the broad categories of controls available, and gives you a flavor for the extra functionality that you get with the Surface version - support for multi-touch, the 360-degree environment, and the other unique attributes of Surface.&amp;#160; &lt;/p&gt;  &lt;p&gt;Finally, the &lt;a href="http://www.microsoft.com/surface/Development.aspx"&gt;Surface SDK&lt;/a&gt; (where these controls live) is not available to the public at this point.&amp;#160; The Surface team has given away access at major conferences such as &lt;a href="http://www.microsoftpdc.com"&gt;PDC&lt;/a&gt; if you attended the Surface sessions or tried the Surface hands-on labs.&amp;#160; You also get access to the Surface SDK when you purchase a Surface developer unit.&amp;#160; If you have a serious interest in Surface development, let me know.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9628528" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/tAi6eSuyDWQ" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.msdn.com/jennifer/archive/tags/Surface/default.aspx">Surface</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/05/19/surface-development-part-2-surface-controls.aspx</feedburner:origLink></item><item><title>Surface Development Part 1: What is the Microsoft Surface?</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/Ap-voavIH10/surface-development-part-1-what-is-the-microsoft-surface.aspx</link><pubDate>Mon, 18 May 2009 16:52:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9625535</guid><dc:creator>jennmar</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9625535.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9625535</wfw:commentRss><description>&lt;p&gt;This post is the beginning of a four-part series on developing for the &lt;a href="http://www.microsoft.com/surface/"&gt;Microsoft Surface&lt;/a&gt;.&amp;#160; But before you can write cool apps for the Microsoft Surface, you should understand what it is.&amp;#160; &lt;/p&gt;  &lt;p&gt;The Surface is a coffee-table-sized touch computer that can respond to natural hand gestures and real-world objects.&amp;#160; It utilizes a vision system with five cameras to sense input.&amp;#160; The 30-inch diagonal display allows a number of users to see the screen while surrounding the table, enabling highly collaborative experiences.&amp;#160; The users can interact with the content by touch, &amp;quot;grabbing&amp;quot; digital information with their hands.&amp;#160; Surface can recognize many points of contact simultaneously, not just one finger as with a typical touch screen.&amp;#160; Finally, Surface sees what touches it and can recognize physical objects, providing potential for many compelling experiences:&lt;/p&gt; &lt;embed height="344" type="application/x-shockwave-flash" width="425" src="http://www.youtube.com/v/rP5y7yp06n0&amp;amp;hl=en&amp;amp;fs=1" allowscriptaccess="always" allowfullscreen="true" /&gt;   &lt;p&gt;With Windows 7, it will be much easier to do multi-touch computing on normal computers.&amp;#160; So what makes Surface different from that?&amp;#160; Two major things:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Surface supports &lt;strong&gt;*massive*&lt;/strong&gt; multi-touch capabilities.&amp;#160; Surface can track over 52 simultaneous contacts at once.&amp;#160; The number of simultaneous contacts that a touch-enabled computer running Windows 7 can handle is dependent on the hardware, but it's not close to that scale.&amp;#160; &lt;/li&gt;    &lt;li&gt;Surface can react to tagged objects placed on it.&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In the remaining posts in this series, I will dive into the Surface SDK and discuss three things that you should understand to get started with coding Surface applications:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Surface controls (and how close they are to WPF controls) &lt;/li&gt;    &lt;li&gt;The ScatterView class &lt;/li&gt;    &lt;li&gt;The classes to enable Surface to react to tagged objects &lt;/li&gt; &lt;/ol&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9625535" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/Ap-voavIH10" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Surface/default.aspx">Surface</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/05/18/surface-development-part-1-what-is-the-microsoft-surface.aspx</feedburner:origLink></item><item><title>Missed MIX?</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/DpFmou-wr38/missed-mix.aspx</link><pubDate>Thu, 02 Apr 2009 19:42:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9529612</guid><dc:creator>jennmar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9529612.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9529612</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/MissedMIX_130CC/Mix09_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 5px 0px; border-right-width: 0px" height="74" alt="Mix09" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/MissedMIX_130CC/Mix09_thumb.jpg" width="144" align="left" border="0" /&gt;&lt;/a&gt; Yes, so did I.&amp;#160; :)&amp;#160; I attended &lt;a href="http://www.microsoftpdc.com"&gt;PDC&lt;/a&gt; this year, and my colleague &lt;a href="http://www.jeffblankenburg.com/"&gt;Jeff Blankenburg&lt;/a&gt; covered &lt;a href="http://live.visitmix.com/"&gt;MIX&lt;/a&gt;.&amp;#160; In case you're not familiar, MIX is a conference for designers and developers focused on user experience and innovative web solutions.&amp;#160; &lt;/p&gt;  &lt;p&gt;If you did miss MIX, like me, you have a couple of options:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. Watch the &lt;/strong&gt;&lt;a href="http://videos.visitmix.com/MIX09/All"&gt;&lt;strong&gt;videos online&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&amp;#160; Jeff recommended 3 must-see videos: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://videos.visitmix.com/MIX09/T14F"&gt;What's New in Microsoft Silverlight 3&lt;/a&gt; - This is a good overview of the new features coming in the next version of Silverlight.&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://videos.visitmix.com/MIX09/C01F"&gt;Sketch Flow: From Concept to Production&lt;/a&gt; - Expression Blend 3 contains new prototyping capabilities for rapid application development.&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://videos.visitmix.com/MIX09/C03F"&gt;Microsoft Expression Web: No Platform Left Behind&lt;/a&gt; - Among other things, this session covers &lt;a href="http://expression.microsoft.com/en-us/dd565874.aspx"&gt;SuperPreview&lt;/a&gt;, which is a tool to easily test your web site in a wide variety of web browsers.&amp;#160; You can view in a &amp;quot;side by side&amp;quot; mode to compare how different browsers render the page or as an onion-skin overlay and use rulers, guides, and zoom/pan tools to precisely identify differences in layout. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;2. Attend the &lt;/strong&gt;&lt;a href="http://www.stirtrek.com"&gt;&lt;strong&gt;Stir Trek event&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; in Columbus, OH on May 8, 2009.&lt;/strong&gt;&amp;#160; This event will bring the content of MIX 2009 much closer to home.&amp;#160; Held at a movie theatre (read: comfortable seats), the day will feature two parallel tracks of content directly from MIX, and then conclude with a showing of the &lt;a href="http://www.startrekmovie.com/"&gt;Star Trek movie&lt;/a&gt;.&amp;#160; There will be sessions covering Silverlight 3, Internet Explorer 8, Expression Blend 3, User Experience Design, WPF, Rapid Prototyping with SketchFlow, and ASP.NET MVC.&amp;#160; The cost is only $25, for a full day of technical content, food, giveaways, and a viewing of the Star Trek movie on the day that it comes out!&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9529612" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/DpFmou-wr38" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.msdn.com/jennifer/archive/tags/Upcoming+Events/default.aspx">Upcoming Events</category><category domain="http://blogs.msdn.com/jennifer/archive/tags/Expression+Blend/default.aspx">Expression Blend</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/04/02/missed-mix.aspx</feedburner:origLink></item><item><title>Upcoming Speaking Engagements</title><link>http://feedproxy.google.com/~r/JenniferMarsman/~3/YSrk-oLabc8/upcoming-speaking-engagements.aspx</link><pubDate>Thu, 02 Apr 2009 19:38:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9529602</guid><dc:creator>jennmar</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jennifer/comments/9529602.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jennifer/commentrss.aspx?PostID=9529602</wfw:commentRss><description>&lt;p&gt;I'm giving a number of upcoming public presentations.&amp;#160; If any of the below topics interest you, feel free to attend.&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/UpcomingSpeakingEngagements_D569/micwic_4.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 5px; border-right-width: 0px" height="197" alt="micwic" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/UpcomingSpeakingEngagements_D569/micwic_thumb_1.jpg" width="200" align="right" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Michigan Celebration of Women in Computing (MICWIC)&lt;/strong&gt; - 4/3/2009-4/4/2009&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.egr.msu.edu/~msuwic/cgi-bin/micwic.php" href="http://www.egr.msu.edu/~msuwic/cgi-bin/micwic.php"&gt;http://www.egr.msu.edu/~msuwic/cgi-bin/micwic.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I will be speaking on an Industry Careers panel and giving lightning talks on some cool research from Microsoft (AutoCollage and PhotoSynth).&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ann Arbor Cloud Camp&lt;/strong&gt; - 4/9/2009 &lt;/p&gt;  &lt;p&gt;&lt;a title="http://a2geeks.org/display/geek/CloudCamp+09" href="http://a2geeks.org/display/geek/CloudCamp+09"&gt;http://a2geeks.org/display/geek/CloudCamp+09&lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/UpcomingSpeakingEngagements_D569/logo_cloudcamp_2.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 0px 0px 5px; border-left: 0px; border-bottom: 0px" height="55" alt="logo_cloudcamp" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/UpcomingSpeakingEngagements_D569/logo_cloudcamp_thumb.gif" width="240" align="right" border="0" /&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I will be speaking on &amp;quot;Developing your first Windows Azure cloud service&amp;quot;.&amp;#160; In this session we take a tour of the capabilities of the Microsoft cloud platform by building and running a simple service using the platform SDK.&amp;#160; The sample service highlights some of the features of the platform including service management, storage, and an integrated developer experience.&amp;#160; This is a demo-heavy session.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Great Lakes Area .NET User Group (GANG) &lt;/strong&gt;- 4/15/2009&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.migang.org"&gt;http://www.migang.org&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I and Joe Engalan will be speaking on &amp;quot;Developing for the Microsoft Surface&amp;quot;.&amp;#160; Learn how to write code for the Surface!&amp;#160; This session introduces the (not publically available) Surface SDK that forms the basis of the Windows 7 multi-touch programming model. In addition, learn about the unique attributes of Surface computing, dive into the core controls like ScatterView and vision-system tagging, and leverage your existing investments in Windows Presentation Foundation and Microsoft Visual Studio.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Central Ohio Day of .NET&lt;/strong&gt; - 4/18/2009 &lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/UpcomingSpeakingEngagements_D569/CentralOhioDoDNLogo_small_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 5px; border-right-width: 0px" height="155" alt="CentralOhioDoDNLogo_small" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/UpcomingSpeakingEngagements_D569/CentralOhioDoDNLogo_small_thumb.png" width="144" align="right" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cinnug.org/cododn"&gt;http://cinnug.org/cododn&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I will be delivering an &amp;quot;Introduction to the Visual Studio Tools for Office (VSTO)&amp;quot;.&amp;#160; VSTO is a .NET Smart Client technology that allows you to build managed code applications with .NET languages like VB.NET and C#, and have the functionality of those applications manifest in the rich user interfaces of Microsoft Office Excel, Word, PowerPoint, Visio, Outlook, and others from the Office stack.&amp;#160; We will walk through multiple demos to show just how easy it is to build powerful VSTO applications, demonstrating adding controls into Excel, adding functionality to the Office 2007 Ribbon UI, and adding custom task panes. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;DevLink&lt;/strong&gt; - 8/13/2009-8/15/2009 &lt;a href="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/UpcomingSpeakingEngagements_D569/devlinkLogo_2.gif"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 5px; border-right-width: 0px" height="41" alt="devlinkLogo" src="http://blogs.msdn.com/blogfiles/jennifer/WindowsLiveWriter/UpcomingSpeakingEngagements_D569/devlinkLogo_thumb.gif" width="150" align="right" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devlink.net"&gt;http://www.devlink.net&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I'm presenting 3 talks, on VSTO, WPF, and Azure.&amp;#160; See the complete session list at &lt;a title="http://www.devlink.net/Sessions/tabid/124/Default.aspx" href="http://www.devlink.net/Sessions/tabid/124/Default.aspx"&gt;http://www.devlink.net/Sessions/tabid/124/Default.aspx&lt;/a&gt;.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9529602" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/JenniferMarsman/~4/YSrk-oLabc8" height="1" width="1"/&gt;</description><category domain="http://blogs.msdn.com/jennifer/archive/tags/Upcoming+Events/default.aspx">Upcoming Events</category><feedburner:origLink>http://blogs.msdn.com/jennifer/archive/2009/04/02/upcoming-speaking-engagements.aspx</feedburner:origLink></item></channel></rss>
