<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Go Live on Azure</title><link>http://blogs.msdn.com/b/golive/</link><description /><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>Go Live Partners Series: Extended Results, Inc.</title><link>http://blogs.msdn.com/b/golive/archive/2012/06/21/go-live-partners-series-extended-results-inc.aspx</link><pubDate>Thu, 21 Jun 2012 20:08:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10322721</guid><dc:creator>GregOliver</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10322721</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2012/06/21/go-live-partners-series-extended-results-inc.aspx#comments</comments><description>&lt;p&gt;Founded in 2006, Redmond, Washington based traditional ISV Extended Results (&lt;a href="http://www.extendedresults.com"&gt;http://www.extendedresults.com&lt;/a&gt;) specializes in business intelligence solutions.&amp;#160; They sell primarily to enterprises worldwide across many verticals.&lt;/p&gt;  &lt;p&gt;Companies spend a lot of money these days building business intelligence capabilities based on various vendor technologies.&amp;#160; Workers sitting at their desks or connected via VPN are in great shape – their KPI’s are right where they need them.&amp;#160; Extended Result’s PushBI product sees to that.&amp;#160; But what about when they’re NOT at work?&lt;/p&gt;  &lt;p&gt;Mobile devices operate outside the firewall.&amp;#160; They don’t have direct access to a company’s internal systems and for good reason – it’s too easy to lose one.&amp;#160; So – what’s the answer to most computing problems?&amp;#160; Add a level of indirection!&amp;#160; That’s what Extended Results did with the Windows Azure component of PushBI Mobile.&amp;#160; (&lt;a href="http://www.pushbi.com"&gt;http://www.pushbi.com&lt;/a&gt;)&amp;#160; Now users of popular mobile devices (Windows Phone 7, iPhone, iPad, Android, Blackberry, Windows 7 Slate) can get access to their critical business information while on the road or in the coffee shop via a short hop through a cloud component running in Windows Azure.&lt;/p&gt;  &lt;p&gt;This long time Microsoft partner chose Windows Azure because they know .NET well.&amp;#160; This familiarity allowed them to create this innovation quickly and get it to market in record time.&lt;/p&gt;  &lt;p&gt;Congratulations, Extended Results!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10322721" width="1" height="1"&gt;</description></item><item><title>Go Live Partners Series: Rare Crowds</title><link>http://blogs.msdn.com/b/golive/archive/2012/06/21/go-live-partners-series-rare-crowds.aspx</link><pubDate>Thu, 21 Jun 2012 16:38:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10322670</guid><dc:creator>GregOliver</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10322670</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2012/06/21/go-live-partners-series-rare-crowds.aspx#comments</comments><description>&lt;p&gt;Founded in 2012, Bellevue, Washington based Rare Crowds (&lt;b&gt;&lt;a href="http://wp.rarecrowds.com"&gt;http://wp.rarecrowds.com&lt;/a&gt;&lt;/b&gt;), is a SaaS Cloud Service Vendor and Microsoft Bizspark partner.&amp;#160; Rare Crowds sells ad purchasing efficiency solutions to international enterprises in the advertising industry with plans to expand into SMB over time.&lt;/p&gt;  &lt;p&gt;Ad buys are expensive, and no one ever buys just one ad so the waste associated with buying inefficient ads multiply.&amp;#160; Especially in large companies that buy hundreds of ad placements at a time, any efficiencies at all can yield large monetary returns.&amp;#160; To generate these efficiencies, Rare Crowds needs data – and lots of it.&amp;#160; Not to mention the computing power to crunch all of that data.&amp;#160; Putting it all together yields the right ad being delivered to the right audience at the right time.&lt;/p&gt;  &lt;p&gt;Rare Crowds had choices when it came to deciding on which cloud vendor to work with.&amp;#160; Several factors contributed to their decision to work with Microsoft to build on Windows Azure.&amp;#160; Obviously, the technical capabilities of the Windows Azure platform had to be there.&amp;#160; But they also wanted great developer support and a great partner to work with – one throat to choke, as it were.&amp;#160; Their comfort with the .NET Framework makes it important that their cloud vendor fully supports .NET as a first class citizen.&amp;#160; The solid integration with Visual Studio, making developers more productive because of their familiarity with the tools, played a big role as well.&amp;#160; And to top it all off, they find OPX to be noticeably cheaper on Azure.&lt;/p&gt;  &lt;p&gt;Congratulations, Rare Crowds, and thanks for your commitment to Windows Azure!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10322670" width="1" height="1"&gt;</description></item><item><title>Go Live Partners Series: Cloud49, LLC.</title><link>http://blogs.msdn.com/b/golive/archive/2012/04/30/go-live-partners-series-cloud49-llc.aspx</link><pubDate>Tue, 01 May 2012 04:41:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10299393</guid><dc:creator>GregOliver</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10299393</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2012/04/30/go-live-partners-series-cloud49-llc.aspx#comments</comments><description>&lt;p&gt;Founded in 2010 and based in Anchorage, Alaska, Cloud49 LLC (&lt;a href="http://www.cloud49.com)"&gt;http://www.cloud49.com)&lt;/a&gt; is a BizSpark startup and SaaS ISV providing human capital management software (HCMS) primarily to enterprises in the US over $100M in annual revenue.&amp;#160; &lt;/p&gt;  &lt;p&gt;Co-founders Nathaniel Gates and Paul Dicang worked together for several years in Alaska Native Corporations (ANCs) and experienced first-hand the limitations and expense of available solutions.&amp;#160; In June of 2010 they left their jobs to start Cloud49, a cloud-based infrastructure services (i.e. backup, DR) company.&amp;#160; They then built on their success by moving into building and selling HCMS solutions.&amp;#160; &lt;/p&gt;  &lt;p&gt;(NOTE: ANCs are regional or village companies in the State of Alaska that serve the interests of their shareholders - i.e. the inhabitants.&amp;#160; By their nature, they are a mix of public sector, human resources, education and social. )&lt;/p&gt;  &lt;p&gt;FireweedHCMS (&lt;a href="http://www.fireweedhcms.com)"&gt;http://www.fireweedhcms.com)&lt;/a&gt; is a new software suite incorporating 5 application areas (e.g. Shareholder Data Management, Student &amp;amp; Scholarship Management) that provide instant financial and social benefits.&amp;#160; Azure compute, storage and SQL Azure were used to build the system.&lt;/p&gt;  &lt;p&gt;Cloud49 chose the Azure platform for a couple of reasons.&amp;#160; They were already familiar and comfortable with .NET technologies.&amp;#160; They wanted to build and run their system in a cloud that runs .NET not as an afterthought, but as a first class citizen.&amp;#160; In addition, data security and platform reliability are very important to their customers.&amp;#160; When prospects hear that the system is running in Microsoft datacenters, these concerns vanish from the discussion.&lt;/p&gt;  &lt;p&gt;Congratulations, Cloud49!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10299393" width="1" height="1"&gt;</description></item><item><title>Auto-scaling Azure with WASABi–From the Ground Up</title><link>http://blogs.msdn.com/b/golive/archive/2012/04/26/auto-scaling-azure-with-wasabi-from-the-ground-up.aspx</link><pubDate>Thu, 26 Apr 2012 14:49:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10298070</guid><dc:creator>GregOliver</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10298070</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2012/04/26/auto-scaling-azure-with-wasabi-from-the-ground-up.aspx#comments</comments><description>&lt;p&gt;(The information in this post was created using Visual Studio 2010, the January refresh of the Windows Azure Platform Training Kit and v1.6 of the Windows Azure SDK in April of 2012. The autoscaler was installed in the compute emulator.&amp;#160; The “app to be scaled” was deployed to Azure.)&lt;/p&gt;  &lt;p&gt;The Microsoft Enterprise Library Autoscaling Application Block (WASABi) lets you add automatic scaling behavior to your Windows Azure applications. You can choose to host the block in Windows Azure or in an on-premises application. The Autoscaling Application Block can be used without modification; it provides all of the functionality needed to define and monitor autoscaling behavior in a Windows Azure application.&lt;/p&gt;  &lt;p&gt;A lot has been written about the WASABi application block, notably in these two locations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;h&lt;a title="http://msdn.microsoft.com/en-us/library/hh680892(v=pandp.50).aspx" href="http://msdn.microsoft.com/en-us/library/hh680892(v=pandp.50).aspx"&gt;ttp://msdn.microsoft.com/en-us/library/hh680892(v=pandp.50).aspx&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a title="http://entlib.codeplex.com/" href="http://entlib.codeplex.com/"&gt;http://entlib.codeplex.com/&lt;/a&gt;&amp;#160; (PS:&amp;#160; this is the place to get support questions answered!)       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Plus a very informative video: &lt;a title="http://channel9.msdn.com/posts/Autoscaling-Windows-Azure-applications" href="http://channel9.msdn.com/posts/Autoscaling-Windows-Azure-applications"&gt;http://channel9.msdn.com/posts/Autoscaling-Windows-Azure-applications&lt;/a&gt;&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;In this post, I demonstrate the use of WASABi in a compute emulator hosted worker role scaling both web and worker roles for the “Introduction to Windows Azure” hands on lab from the training kit (the “app to be scaled”).&amp;#160; I use a performance counter to scale down the web role and queue depth to scale up the worker.&amp;#160; Here are a few links:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows Azure Platform Training Kit: &lt;a title="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=8396" href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=8396"&gt;http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=8396&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Adding the Autoscaling Application Block to a Host: &lt;a title="http://msdn.microsoft.com/en-us/library/hh680920(v=pandp.50).aspx" href="http://msdn.microsoft.com/en-us/library/hh680920(v=pandp.50).aspx"&gt;http://msdn.microsoft.com/en-us/library/hh680920(v=pandp.50).aspx&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;My earlier blog post on Azure Diagnostics: &lt;a title="http://blogs.msdn.com/b/golive/archive/2012/04/21/windows-azure-diagnostics-from-the-ground-up.aspx" href="http://blogs.msdn.com/b/golive/archive/2012/04/21/windows-azure-diagnostics-from-the-ground-up.aspx"&gt;http://blogs.msdn.com/b/golive/archive/2012/04/21/windows-azure-diagnostics-from-the-ground-up.aspx&lt;/a&gt;&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;Here’s an overview of the steps:&amp;#160; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create a new cloud app, add a worker role.&lt;/li&gt;    &lt;li&gt;Using the documentation in the link above, use Nuget to add the autoscaling application block to your worker role.&lt;/li&gt;    &lt;li&gt;Use the configuration tool (check it out: &lt;a title="http://msdn.microsoft.com/en-us/library/ff664633(v=pandp.50).aspx" href="http://msdn.microsoft.com/en-us/library/ff664633(v=pandp.50).aspx"&gt;http://msdn.microsoft.com/en-us/library/ff664633(v=pandp.50).aspx&lt;/a&gt;) to set up app.config correctly.&lt;/li&gt;    &lt;li&gt;Start another instance of Visual Studio 2010.&amp;#160; Load up “Introduction to Windows Azure”, Ex3-WindowsAzureDeployment, whichever language you like.&lt;/li&gt;    &lt;li&gt;Change the CSCFG file such that you’ll deploy 2 instances of the web role and 1 instance of the worker role.&lt;/li&gt;    &lt;li&gt;Modify WorkerRole.cs so that queue messages won’t get picked up from the queue.&amp;#160; We want them to build up so the autoscaler thinks the role needs to be scaled.&lt;/li&gt;    &lt;li&gt;Modify WebRole.cs so that the required performance counter is output on a regular basis.&lt;/li&gt;    &lt;li&gt;Deploy the solution to a hosted service in Azure.&lt;/li&gt;    &lt;li&gt;Set up the Service Information Store file.&amp;#160; This describes the “app to be scaled” to the autoscaler.&lt;/li&gt;    &lt;li&gt;Set up rules for the autoscaler.&amp;#160; Upload the autoscaler’s configuration files to blob storage.&lt;/li&gt;    &lt;li&gt;Run the autoscaler, watch your web role and worker role instance numbers change.&amp;#160; Success!&lt;/li&gt;  &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And now some details:&lt;/p&gt;  &lt;p&gt;For #3 above there are a few things to be configured:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Nothing under “Application Settings”.&amp;#160; You can ignore this section.&lt;/li&gt;    &lt;li&gt;The Data Point Storage Account must be in the Azure Storage Service rather than the storage emulator.&amp;#160; The reason is that they’re using the new upsert statement which is not supported in the emulator.&amp;#160; (how many hours did this one cost me???)      &lt;br /&gt;      &lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7563.image_5F00_1144935E.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7178.image_5F00_thumb_5F00_54AC94C0.png" width="503" height="129" /&gt;&lt;/a&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Your autoscaling rules file can be stored in a few different places.&amp;#160; I chose blob storage.&amp;#160; It can be either storage emulator or Azure Storage Service.&amp;#160; An example of a rule is “if CPU % utilization goes above 80% on average for 5 minutes, scale up”.      &lt;br /&gt;      &lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/4442.image_5F00_3B449186.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7585.image_5F00_thumb_5F00_73EF3B93.png" width="503" height="305" /&gt;&lt;/a&gt;      &lt;br /&gt;      &lt;br /&gt;The Monitoring Rate is the rate at which the autoscaler will check for runtime changes in the rules.&amp;#160; You can ignore the certificate stuff for now.&amp;#160; It’s there in case you want to encrypt your rules.       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Next is the Service Information Store.&amp;#160; This file describes the service that you want to monitor and automate.&amp;#160; In it you tell the system which hosted service, which roles, and so on.&amp;#160; The same configuration details as those for the rules file pertain.&lt;/li&gt;    &lt;li&gt;You can ignore the “Advanced Options” for now.&lt;/li&gt;    &lt;li&gt;When you’re done with the configuration tool, take a look at app.config.&amp;#160; Down near the bottom is a section for &amp;lt;system.diagnostics&amp;gt;.&amp;#160; In it, the Default listener is removed in a couple places.&amp;#160; Unless you configure your diagnostics correctly, the effect of this is that the trace messages from the autoscaler will go nowhere.&amp;#160; My advice: remove the lines that remove the default listener.&amp;#160; This will cause the trace messages to go into the Output window of Visual Studio.&amp;#160; As follows:      &lt;br /&gt;      &lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7178.image_5F00_411F351F.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/2772.image_5F00_thumb_5F00_2ED66E5D.png" width="340" height="291" /&gt;&lt;/a&gt;      &lt;br /&gt;      &lt;br /&gt;(If you have read my previous blog post about Azure Diagnostics (&lt;a href="http://blogs.msdn.com/b/golive/archive/2012/04/21/windows-azure-diagnostics-from-the-ground-up.aspx" target="_blank"&gt;link&lt;/a&gt;), you already know how to get the trace log to output to table storage, so this step isn’t necessary.)       &lt;br /&gt;&lt;/li&gt;  &lt;/ol&gt;  &lt;p&gt;For #6 above, I just commented the line that gets the CloudQueueMessage:    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/2388.image_5F00_32085645.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/5100.image_5F00_thumb_5F00_468DA5C3.png" width="405" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For #8 above, reference my earlier blog post (&lt;a href="http://blogs.msdn.com/b/golive/archive/2012/04/21/windows-azure-diagnostics-from-the-ground-up.aspx" target="_blank"&gt;link&lt;/a&gt;) on configuration of diagnostics to switch on the CPU% performance counter.&amp;#160; Here are the lines you’ll need to add to the DiagnosticMonitorConfiguration object:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/3060.image_5F00_7F384FD0.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/1200.image_5F00_thumb_5F00_05EB5954.png" width="607" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For #9 above, there are a few things I want to point out.&amp;#160; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;In the &amp;lt;subscription&amp;gt;, the certificate stuff points to where to find your management certificate in the WASABi host.&amp;#160; WASABi knows where to find the matching certificate in your subscription once it has your subscription ID.&lt;/li&gt;    &lt;li&gt;In the &amp;lt;roles&amp;gt; elements, the alias attributes point at (match – case sensitive) the target attributes in your rules in #10 (coming next).&lt;/li&gt;    &lt;li&gt;In the &amp;lt;storageAccount&amp;gt; element you need to define the queue that you’ll be sampling and call it out by name.&amp;#160; The alias attribute of the &amp;lt;queue&amp;gt; matches to the queue attribute of the &amp;lt;queueLength&amp;gt; element in the rules file.&lt;/li&gt;  &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7673.image_5F00_656419A1.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/5826.image_5F00_thumb_5F00_702170F6.png" width="397" height="274" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For #10 above, this is the fun part.&amp;#160; &lt;img class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/6406.wlEmoticon_2D00_smile_5F00_0B59C9F8.png" /&gt;&lt;/p&gt;  &lt;p&gt;To show the operation of performance counters causing a scaling event, I set up a rule to scale down the web role if CPU% is less than 5%.&amp;#160; Since I’m not driving any load to it, this will be immediately true.&amp;#160; Scaling should happen pretty soon.&amp;#160; To show the operation of queue depth causing a scaling event, I set up a rule to scale up if the queue gets greater than 5 deep.&amp;#160; Then I push a few queue messages up by executing a few web role transactions (uploading pictures).&lt;/p&gt;  &lt;p&gt;Most folks initially learning about autoscaling wisely think that we need to set up some kind of throttle so that the system doesn’t just scale up to infinity or down to zero because of some logic error.&amp;#160; This is built in to WASABi.&amp;#160; Here’s how this manifests in this example:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7585.image_5F00_6B3EBD3A.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/0310.image_5F00_thumb_5F00_2B08A3C0.png" width="609" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Next, we need to think about how to define the criteria that we’ll use to scale.&amp;#160; We need some kind of way to designate which performance counter to use, how often it gets evaluated, and how it’s evaluated (min/max/avg, whatever).&amp;#160; The role’s code might be outputting more than one counter – we need some way to reference them.&amp;#160; Same goes for the queue.&amp;#160; With WASABi, this is done with an “operand”.&amp;#160; They are defined in this example as follows:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/8750.image_5F00_758FE19A.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/2388.image_5F00_thumb_5F00_2E3A8BA8.png" width="615" height="157" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here, the alias attributes are referenced in the rules we’re about to write.&amp;#160; The queue attribute value “q1” is referenced in the Service Information Store file that we set up in step #10.&amp;#160; The queueLength operand in this case looks for the max depth of the queue in a 5 minute window.&amp;#160; The performanceCounter operand looks for the average CPU% over a 10 minute window.&lt;/p&gt;  &lt;p&gt;You should be able to discern from this that autoscaling is not instantaneous.&amp;#160; It takes time to evaluate conditions and respond appropriately.&amp;#160; The WASABi documentation gives a good treatment of this topic.&lt;/p&gt;  &lt;p&gt;Finally, we write the actual rules where the operands are evaluated against boundary conditions.&amp;#160; When the boundary conditions are met, the rules engine determines that a scaling event should take place and implements the appropriate Service Management API to do it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/1222.image_5F00_4972E4A9.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7288.image_5F00_thumb_5F00_612A1C0F.png" width="369" height="270" /&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/8540.image_5F00_729A7CE7.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/4846.image_5F00_thumb_5F00_4B6033B2.png" width="367" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note that the target names are case-sensitive.&amp;#160; Note also the match between the operand name in the reactive rule, and the alias in the operand definition.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For #11.&amp;#160; Run the autoscaler and the “app to be scaled”, upload 6 pictures.&amp;#160; Because we’ve disabled the ingest of queue messages in the worker role, thumbnails won’t be generated.&amp;#160; It might be easier to use really little pictures.&amp;#160; Now sit back and wait about 10 minutes.&amp;#160; After about 5 minutes you should start to expect the worker role to scale up.&amp;#160; After about 10 minutes you should start to expect the web role to scale down.&amp;#160; Watch the messages that are appearing in the Output or table storage.&amp;#160; They offer an informative view into how WASABi works.&amp;#160; Because the actual scaling of the roles causes all of them to go to an “updating…” status, you might not see the distinct events unless you spread them out with your time values.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Please note this is a sample and doesn’t include best practices advice on how often to sample performance counters and queues, how often to push the information to table storage, and so on.&amp;#160; I leave that to the authoritative documentation included with WASABi.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Cheers!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10298070" width="1" height="1"&gt;</description></item><item><title>Windows Azure Diagnostics–From the Ground Up</title><link>http://blogs.msdn.com/b/golive/archive/2012/04/21/windows-azure-diagnostics-from-the-ground-up.aspx</link><pubDate>Sat, 21 Apr 2012 21:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10296150</guid><dc:creator>GregOliver</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10296150</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2012/04/21/windows-azure-diagnostics-from-the-ground-up.aspx#comments</comments><description>&lt;p&gt;(The information in this post was created using Visual Studio 2010 and the Windows Azure SDK 1.6 in April of 2012.&amp;#160; All tests were done in the compute emulator.)&lt;/p&gt;  &lt;p&gt;I think of Azure diagnostics in two broad categories: the stuff that you get more-or-less for free and the stuff that you log with statements similar to Trace.WriteLine.&amp;#160; There is more – quite a lot actually – but with these two forming the basis the rest should flow more easily by referencing the documentation in MSDN.&lt;/p&gt;  &lt;p&gt;Starting with Visual Studio 2010, create a new cloud project and add a worker role.&amp;#160; Delete the Diagnostics plug in from your CSDEF file and the Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString from all CSCFG files (they have to match).&amp;#160; Run the project.&amp;#160; Take a look at the contents of the new GUID/directory/DiagnosticStore directory as depicted below.&amp;#160; Put the lines back in the config files and run it again, examining the DiagnosticStore directory.&amp;#160; Explore the Monitor directory deeply.&amp;#160; You should see some pretty interesting things.&amp;#160; This page gives the details:    &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/windowsazure/hh411546.aspx" href="http://msdn.microsoft.com/en-us/library/windowsazure/hh411546.aspx"&gt;http://msdn.microsoft.com/en-us/library/windowsazure/hh411546.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;What we’ve just demonstrated (with zero code) is the level of diagnostics information that you get more-or-less for free with the worker role and web role templates.&amp;#160; This MSDN page details what we just did and what it means:    &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.diagnostics.diagnosticmonitor.aspx" href="http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.diagnostics.diagnosticmonitor.aspx"&gt;http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.diagnostics.diagnosticmonitor.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Before:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/4263.image_5F00_5B7F5152.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7206.image_5F00_thumb_5F00_53F3E1E5.png" width="777" height="168" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7317.image_5F00_733688B8.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/0535.image_5F00_thumb_5F00_39B378C1.png" width="780" height="185" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The information that’s being gathered is in a binary format, so you can’t view it easily.&amp;#160; To do that, you need to set up a periodic transfer of the information to Azure table storage.&amp;#160; This not only converts the information into a readable form, but also puts it into a location that is easy to access.&lt;/p&gt;  &lt;p&gt;There is a singleton DiagnosticsMonitor associated with each role (web or worker) in your service.&amp;#160; This object defines how much, how often and what is pushed out to table storage.&amp;#160; There is a factory default configuration embedded into the object that says “push nothing to table storage”.&amp;#160; There are three straightforward ways of changing this.&amp;#160; One of them is to add code to your role.&amp;#160; OnStart is the typical location of this code.&amp;#160; Putting it here affects all role instances.&amp;#160; Here’s an example (#1):&amp;#160; (information logged with this example appears in Azure table WADDiagnosticInfrastructure)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7384.image_5F00_1FDF4292.png"&gt;&lt;img style="display: inline; background-image: none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/8468.image_5F00_thumb_5F00_34649210.png" width="786" height="222" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Another way (#2) is to edit a rendition of the default configuration file that is put into blob storage when your instances start up.&amp;#160; There is one of these files for each instance.&amp;#160; If you edit this file, the DiagnosticsMonitor will pick up the change and change its behavior accordingly.&amp;#160; So where are you going to find these files?&amp;#160; In a container called “wad-control-container”.&amp;#160; Which storage account?&amp;#160; The one designated by the Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString setting in your CSCFG file.&amp;#160; Seriously, try it!&amp;#160; Don’t put the code above into OnStart, run your role, then edit the configuration file.&amp;#160; Wait a couple minutes and voila!&amp;#160; Diagnostics information will start dropping into table storage.&lt;/p&gt;  &lt;p&gt;This page gives another code sample and some explanation of this:    &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.diagnostics.diagnosticmonitorconfiguration.aspx" href="http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.diagnostics.diagnosticmonitorconfiguration.aspx"&gt;http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.diagnostics.diagnosticmonitorconfiguration.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This page talks more about the various methods of altering DiagnosticMonitor’s configuration:    &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/windowsazure/hh411551.aspx" href="http://msdn.microsoft.com/en-us/library/windowsazure/hh411551.aspx"&gt;http://msdn.microsoft.com/en-us/library/windowsazure/hh411551.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;So much for the more-or-less free stuff.&amp;#160; What about sending trace output to the Azure logs?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is almost as free.&amp;#160; You have to write the Trace.WriteLine statements.&amp;#160; And you have to tinker with the DiagnosticMonitorConfiguration a bit as well, but no more than you did for the previous stuff.&amp;#160; Instead of DiagnosticMonitorConfiguration.DiagnosticInformationLogs as in the example above, set values for the properties of DiagnosticMonitorConfiguration.Logs instead.&amp;#160; You can do this in either of the three ways noted above (I only gave examples of two, but you get the point.)&amp;#160; The information shows up in WADLogsTable.&amp;#160; &lt;/p&gt;  &lt;p&gt;An important aspect to diagnostics is Trace Listeners.&amp;#160; Listeners basically hook up information sources (IIS, your Trace.WriteLine code, etc.) with output mechanisms (text file, output window in Visual Studio, etc.)&amp;#160; The web and worker role templates also include a listener for Azure diagnostics: Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener.&amp;#160; This is configured in &amp;lt;system.diagnostics&amp;gt;in web.config or app.config.&amp;#160; If you remove the listener, nothing breaks but you won’t get any output, either.&amp;#160; Try it!&amp;#160; Just remove the listener from app.config, run your project, then take a look in the Resources directory (detailed above).&amp;#160; It’s pretty empty.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Logging isn’t free!&amp;#160; It’s using Windows Azure Storage, both blobs and tables.&amp;#160; There are about 43k minutes per month.&amp;#160; If you push trace information once per minute and only use one storage transaction per push, that’s about $0.43 / month.&amp;#160; Now multiply that by the number of things you’re logging.&amp;#160; We are careful about writing multiple records at a time to minimize costs, but we can only do so much.&amp;#160; Since you can configure logging so easily, be judicious about the amount and frequency of logging.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I used a couple of tools to assist with these tests.&amp;#160; I used &lt;a href="http://azurestorageexplorer.codeplex.com/" target="_blank"&gt;Azure Storage Explorer&lt;/a&gt; to access my developer storage directly – blobs/tables/queues.&amp;#160; Cerebrata &lt;a href="http://cerebrata.com/Products/AzureDiagnosticsManager/" target="_blank"&gt;Azure Diagnostics Manager v2&lt;/a&gt; did a really nice job of formatting the diagnostic information that was pushed into table storage.&amp;#160; It allows you to look at it from offline, historical and live sources.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Cheers!&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;[UPDATE on 4/26/2012] Thanks to Fernando for pointing out an arithmetic error, which has been corrected.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10296150" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/golive/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/golive/archive/tags/Windows+Azure+Storage/">Windows Azure Storage</category><category domain="http://blogs.msdn.com/b/golive/archive/tags/Diagnostics/">Diagnostics</category></item><item><title>Go Live Partners Series: Wealth Habit, Inc.</title><link>http://blogs.msdn.com/b/golive/archive/2012/03/29/go-live-partners-series-wealth-habit-inc.aspx</link><pubDate>Fri, 30 Mar 2012 04:30:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10289243</guid><dc:creator>GregOliver</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10289243</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2012/03/29/go-live-partners-series-wealth-habit-inc.aspx#comments</comments><description>&lt;p&gt;Angel-funded startup and Bizspark member Wealth Habit (&lt;a href="https://wealthhabit.com/"&gt;https://wealthhabit.com/&lt;/a&gt;) is a Cloud Services company located in Portland, Oregon. Led by CEO James Werner, and CTO Brian Gambs, Wealth Habit provides enterprise-level B2B financial services. It adds value by reducing or removing financial stress on employees by providing up to the minute feedback on purchasing and savings decisions - either via a web browser or on the user's mobile phone. Based on the latest research in behavioral economics, their products help to reduce employee financial distress by clearly framing the spending and savings decisions of users.&amp;#160; &lt;/p&gt;  &lt;p&gt;Wealth Habit chose Windows Azure as their deployment platform because the costs are very low and the platform adds value over and above simply providing compute and storage capabilities.&lt;/p&gt;  &lt;p&gt;For example, their SQL Azure database just runs, without any intervention on their part due to the massively scaled infrastructure of the Windows Azure cloud. While periodic backups are always recommended, failures due to hardware fault are all but unheard of due to replication-in-triplicate built in at a very low level to the Azure storage services.&lt;/p&gt;  &lt;p&gt;In addition, their compute infrastructure is based on Azure web and worker roles. Because of this, they never have to be concerned with downtime or labor intensive patching, no matter how big their user base gets because Windows Azure automatically performs guest OS upgrades on their behalf. And, as their user base grows, their compute infrastructure will scale seamlessly, both up and down, to meet current user resource requirements.&lt;/p&gt;  &lt;p&gt;Wealth Habit is a great example of the benefits that can accrue to folks that embrace the cloud.&lt;/p&gt;  &lt;p&gt;Cheers!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10289243" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/golive/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/golive/archive/tags/Partners/">Partners</category></item><item><title>Installing Windows Features in a Windows Azure Role Instance</title><link>http://blogs.msdn.com/b/golive/archive/2011/08/15/installing-windows-features-in-a-windows-azure-role-instance.aspx</link><pubDate>Mon, 15 Aug 2011 20:45:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10195867</guid><dc:creator>GregOliver</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10195867</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2011/08/15/installing-windows-features-in-a-windows-azure-role-instance.aspx#comments</comments><description>&lt;p&gt;In this posting I’ll talk about my experiences and final solution to what is usually a simple thing with a Windows Server box: installing Windows features.   &lt;br /&gt;    &lt;hr /&gt;&lt;/p&gt;  &lt;p&gt;If your Azure solution requires a Windows Feature, you might be tempted to set up a VHD and then upload to a VM Role.&amp;#160; While this will work, for various reasons it’s not the optimal solution if a worker or web role can do the job.&amp;#160; And, as is frequently the case these days, startup tasks can be used to handle this requirement quite nicely.&lt;/p&gt;  &lt;p&gt;Initially, I experimented with techniques such as OCSetup and ServerManagerCmd.&amp;#160; I used Remote Desktop to try out scripting these options before settling on PowerShell.&amp;#160; OCSetup doesn’t give great feedback and has no option for querying status of existing features, and ServerManagerCmd is deprecated.&amp;#160; I needed to learn a little bit about PowerShell, but as it’s the technology of the future I decided it was worth the effort.&amp;#160; &lt;/p&gt;  &lt;p&gt;I used a couple of excellent resources to learn what I needed to know:&amp;#160; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Powershell.com has a free eBook entitled Mastering Powershell.&amp;#160; Here’s the link: &lt;a title="http://powershell.com/cs/blogs/ebook/default.aspx" href="http://powershell.com/cs/blogs/ebook/default.aspx"&gt;http://powershell.com/cs/blogs/ebook/default.aspx&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Microsoft’s own Scripting Guy, Ed Wilson, published an excellent series of videos for the beginner: &lt;a title="http://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx" href="http://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx"&gt;http://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx&lt;/a&gt;. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The particular Windows Features that I needed to add are “Ink Support” and “Ink Handwriting Recognition”, where “Ink Support” requires a reboot and is a prerequisite for “Ink Handwriting Recognition”.&amp;#160; Fortunately, the startup task that you can specify in your CSDEF file gets run every time a role instance boots (not only when the instance is created.)&lt;/p&gt;  &lt;p&gt;Two scripts are needed in a PowerShell scenario,&amp;#160; one CMD file and one PS1 file:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Startup.CMD      &lt;br /&gt;      &lt;br /&gt;powershell -command &amp;quot;Set-ExecutionPolicy Unrestricted&amp;quot; 2&amp;gt;&amp;gt; err.out&amp;#160; &lt;br /&gt;powershell .\startup.ps1 2&amp;gt;&amp;gt; err.out       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Startup.PS1      &lt;br /&gt;      &lt;br /&gt;Import-Module Servermanager       &lt;br /&gt;$ink = Get-WindowsFeature &amp;quot;IH-Ink-Support&amp;quot;       &lt;br /&gt;$hwr = Get-WindowsFeature &amp;quot;IH-Handwriting&amp;quot;       &lt;br /&gt;if (!$ink.Installed) {       &lt;br /&gt;&amp;#160; Add-WindowsFeature -name &amp;quot;IH-Ink-Support&amp;quot; -Restart       &lt;br /&gt;}       &lt;br /&gt;if (!$hwr.Installed) {       &lt;br /&gt;&amp;#160; Add-WindowsFeature -name &amp;quot;IH-Handwriting&amp;quot;       &lt;br /&gt;} &lt;/li&gt; &lt;/ol&gt;  &lt;ol&gt;Here, Get-WindowsFeature returns an object with various properties.&amp;#160; The one we care about is “.Installed”, which returns a boolean value indicating the installation status of the feature.&amp;#160; For the non-C crowd, the exclamation point, in PowerShell speak, indicates “not”.&lt;/ol&gt;  &lt;p&gt;Just a few notes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Set-ExecutionPolicy      &lt;br /&gt;      &lt;br /&gt;Here’s a great blog post that deals with this:       &lt;br /&gt;&lt;a title="http://blogs.msdn.com/b/jimoneil/archive/2011/02/07/azure-startup-tasks-and-powershell-lessons-learned.aspx" href="http://blogs.msdn.com/b/jimoneil/archive/2011/02/07/azure-startup-tasks-and-powershell-lessons-learned.aspx"&gt;http://blogs.msdn.com/b/jimoneil/archive/2011/02/07/azure-startup-tasks-and-powershell-lessons-learned.aspx&lt;/a&gt;       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Set up remote desktop      &lt;br /&gt;      &lt;br /&gt;Another Jim O’Neil posting:       &lt;br /&gt;&lt;a title="http://blogs.msdn.com/b/jimoneil/archive/2010/12/29/azure-home-part-13-remote-desktop-configuration.aspx" href="http://blogs.msdn.com/b/jimoneil/archive/2010/12/29/azure-home-part-13-remote-desktop-configuration.aspx"&gt;http://blogs.msdn.com/b/jimoneil/archive/2010/12/29/azure-home-part-13-remote-desktop-configuration.aspx&lt;/a&gt;       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;This page has a list of installable Windows Features on WS2008R2:      &lt;br /&gt;      &lt;br /&gt;&lt;a title="http://technet.microsoft.com/en-us/library/cc732757.aspx" href="http://technet.microsoft.com/en-us/library/cc732757.aspx"&gt;http://technet.microsoft.com/en-us/library/cc732757.aspx&lt;/a&gt;       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Another good way to see a list of features but also each one’s current status on your instance is to open a PowerShell box, &lt;em&gt;Import-Module Servermanager&lt;/em&gt; and then &lt;em&gt;Get-WindowsFeature&lt;/em&gt;.&amp;#160; Pipe the output to “&lt;em&gt;more&lt;/em&gt;” (| more) if you want to see a page at a time.       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;And here’s Steve Marx’ very useful blog posting on Startup Tasks:      &lt;br /&gt;      &lt;br /&gt;&lt;a title="http://blog.smarx.com/posts/introduction-to-windows-azure-startup-tasks" href="http://blog.smarx.com/posts/introduction-to-windows-azure-startup-tasks"&gt;http://blog.smarx.com/posts/introduction-to-windows-azure-startup-tasks&lt;/a&gt;       &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And finally, as mentioned before (but always important to remember), don’t create a command file in Visual Studio.&amp;#160; Doing so inserts a couple of byte order chars at the front that prevent the command interpreter from being able to read it.&amp;#160; Start your command file with notepad, add it to your project, then you can edit in VS.&lt;/p&gt;  &lt;p&gt;Cheers!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10195867" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/golive/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/golive/archive/tags/Startup+Task/">Startup Task</category><category domain="http://blogs.msdn.com/b/golive/archive/tags/PowerShell/">PowerShell</category></item><item><title>Automating Blob Uploads, Part 2</title><link>http://blogs.msdn.com/b/golive/archive/2011/06/14/automating-blob-uploads-part-2.aspx</link><pubDate>Tue, 14 Jun 2011 22:04:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10174572</guid><dc:creator>GregOliver</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10174572</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2011/06/14/automating-blob-uploads-part-2.aspx#comments</comments><description>&lt;p&gt;I tossed out a challenge in a comment I left on the first of this series – there’s a problem with this approach to automating blob uploads.&amp;#160; It’s not a problem that affects everyone.&amp;#160; For example, perhaps you have a multi-tenant solution where each customer has their own storage account.&amp;#160; &lt;/p&gt;  &lt;p&gt;When a Windows Client wants access to the Azure Storage Service directly, the storage credentials must be available locally in order to structure the REST requests.&amp;#160; Usually, as in the code that I’ve provided, the credentials are stored in clear text in the configuration file.&amp;#160; However, if the client is part of a hybrid solution and many customers will have it, you probably don’t want to do this.&amp;#160; These credentials are the keys to the kingdom – with them anything can be done with any of the data in the storage account.&lt;/p&gt;  &lt;p&gt;One solution to this problem is to put the credentials behind a web service call.&amp;#160; SSL encrypt the call to the web service and authenticate callers with the AppFabric Access Control Service (ACS) or some other means, then pass the storage credentials back to the client.&amp;#160; Without going into the details of encryption/decryption, certificates, etc., this solution is the same as the one that I have already provided with very minor tweaks to the code.&lt;/p&gt;  &lt;p&gt;Another solution is the one for which I am providing additional &lt;a href="http://azureblobpusher.codeplex.com/releases/view/68329" target="_blank"&gt;sample code&lt;/a&gt;.&amp;#160; Use a &lt;a href="http://msdn.microsoft.com/en-us/library/ee393343.aspx" target="_blank"&gt;Shared Access Signature&lt;/a&gt; (SAS) to protect blob storage access and put the accesses to queue storage behind secured and authenticated web service calls.&amp;#160; In a nutshell, a SAS is a time-bombed key with specific access rights to either blobs in a container or a single blob.&lt;/p&gt;  &lt;p&gt;In this modified solution, I have added a WCF web role to my Azure service.&amp;#160; This WCF web role is based on the Visual Studio template that is listed along with web role, worker role, etc, when creating a new Cloud Solution.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/1731.image_5F00_2D34F28D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7607.image_5F00_thumb_5F00_7345AFA0.png" width="450" height="311" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The flow of control is altered only slightly:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Prior to uploading the blob, a call is made to request the SAS from the web service.&amp;#160; The SAS is a string.&amp;#160; This string is supplied as a parameter on the upload calls.&lt;/li&gt;    &lt;li&gt;Instead of accessing queue storage directly, additional calls were added to the web service:&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;Send notification message&lt;/li&gt;      &lt;li&gt;Get acknowledgement message&lt;/li&gt;      &lt;li&gt;Delete acknowledgement message&lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p&gt;While this solution solves some security concerns, there is again a cost.&amp;#160; The client cannot run without the server in this architecture.&amp;#160; I have lost loose coupling in favor of security.&amp;#160; In my third article on this topic I’ll partially deal with this problem.&amp;#160; (Hint: AppFabric Service Bus Queues)&lt;/p&gt;  &lt;p&gt;Full source is provided &lt;a href="http://azureblobpusher.codeplex.com/releases/view/68329" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10174572" width="1" height="1"&gt;</description></item><item><title>Automating Blob Uploads</title><link>http://blogs.msdn.com/b/golive/archive/2011/06/11/automating-blob-uploads.aspx</link><pubDate>Sat, 11 Jun 2011 22:00:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10173660</guid><dc:creator>GregOliver</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10173660</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2011/06/11/automating-blob-uploads.aspx#comments</comments><description>&lt;p&gt;In my travels I hear about a lot of patterns of cloud computing.&amp;#160; One that I hear frequently is “upload a file and process it”.&amp;#160; This file could be financial data, pictures, video, electric meter readings, and lots more.&amp;#160; It’s so common, and yet when I Bing (yes, Bing &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/1731.wlEmoticon_2D00_smile_5F00_791B54A8.png" /&gt; ) for blob uploaders, they’re all manual.&lt;/p&gt;  &lt;p&gt;Now, I’m sure that lots of people have tackled this problem for their own needs, but I thought I’d put something together and share it with the community.&amp;#160; Both client and server source code are &lt;a href="http://azureblobpusher.codeplex.com/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Architecture View&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/7674.image_5F00_63BD9F40.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/1234.image_5F00_thumb_5F00_63516C4B.png" width="566" height="381" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Process Flow &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/6507.image_5F00_29CE5C54.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/2804.image_5F00_thumb_5F00_497D361C.png" width="571" height="368" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Sorry for the eye chart.&amp;#160; &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Sad smile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-43-06-metablogapi/3465.wlEmoticon_2D00_sadsmile_5F00_7B08A3B1.png" /&gt;&amp;#160; I’ll try to explain (in order of the basic system flow.)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;UI Thread&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;A FileSystemWatcher detects new files in a directory in the local file store.&amp;#160; A tracking record is inserted into a SQL Express tracking DB.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Process Files Thread&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If it’s a big enough file that the upload is attempted before the file is fully copied into the directory, the thread waits by attempting a write lock.&amp;#160; The file is uploaded to Azure blob storage using parallel blocks.&amp;#160; The block size and number of simultaneous blocks is configurable using the StorageClient API.&amp;#160; Once the file is uploaded, a record is placed into the Notification Queue and the tracking record is updated.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Azure Worker&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The Azure worker detects the notification, determines that the blob is “ok” in some way (application specific), acknowledges receipt (in order to free up client resources), processes the blob (or sets it aside for later), then deletes the notification message.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Process Acknowledgements Thread&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Receipt of the acknowledgement message triggers deletion of the file in the upload directory and update of the tracking record.&amp;#160; Then the acknowledgement message is deleted.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;What could go wrong?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In a manual upload scenario, so many controls would get in the way.&amp;#160; Automating the process demands that care is taken to ensure fault tolerance.&amp;#160; Here are some things that can go wrong and how the architecture protects against them:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Azure worker is unavailable.&amp;#160; (Perhaps it’s being upgraded, it’s very busy, it has a specific window of time that it runs.)      &lt;br /&gt;By placing the data into blob storage and creating the notification record, the system is unaffected by absence of the worker.&amp;#160; If you need more workers to process the data, they can easily be created and will immediately start taking load.&amp;#160; This procedure can be automated or manual.       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Azure worker fails. (Hardware?&amp;#160; Program bug?)      &lt;br /&gt;The last step in the process is deleting the notification message.&amp;#160; The message will re-appear in the queue for processing by another worker in this case.&amp;#160; You should check the number of times the message is de-queued to ensure the message or data in themselves aren’t the problem.       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Upload fails.&amp;#160; (Network connection?)      &lt;br /&gt;The upload is protected in a couple of ways.&amp;#160; By uploading in blocks, if your upload fails in the middle you only need to upload the missing blocks.&amp;#160; The last block that’s uploaded stitches the component blocks together.&amp;#160; Also, the last step in the upload process is update of the tracking record.&amp;#160; If the tracking record is not updated, the upload will be attempted again at a later time.       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Client resource stretched.&amp;#160; (Too many files in the directory.)      &lt;br /&gt;Files to be uploaded can come from many sources and perhaps 100’s at a time.&amp;#160; By watching for acknowledgement of receipt from the server side the program can recycle this resource effectively.&amp;#160; This is the main reason the program was written as a set of cooperating threads – so that a long upload wouldn’t prevent keeping the directory cleaned up.       &lt;br /&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Alternatives to the Process&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Following on #4 above, if there’s lots of processing to be done on each data file (blob), but there’s also lots of files to be uploaded, you can run into trouble.&amp;#160; If you don’t have enough workers running (costs more), files could back up on the client and potentially cause problems.&amp;#160; By splitting the task load up, you will be able to acknowledge receipt of files quicker and clean up on the client more frequently.&amp;#160; Just be sure you’re running enough workers to get the overall work done during your window of opportunity.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What about those queues?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Yes, you could use SQL Azure tables to manage your notifications and acknowledgements.&amp;#160; Queues have the advantage of being highly available and highly accessible in parallel via HTTP, though this comes at a cost.&amp;#160; If you have millions of files to process, these costs are worth considering.&amp;#160; On the other hand, presumably your SQL Azure database will be busy with other work and you don’t want to load it down.&amp;#160; Also, if you have lots of customers you would need to either wrap access to SQL Azure behind a web service or open its firewall to them all.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What about the FileSystemWatcher?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;FSW has a buffer to hold events while they’re being processed by your code.&amp;#160; This buffer can be expanded, but not infinitely.&amp;#160; So you need to keep the code in your event logic to a minimum.&amp;#160; If large numbers of files are being dropped into the upload directory, you can overwhelm the buffer. In a case like this it might make sense to set up multiple incoming directories, multiple upload programs, etc.&amp;#160; An alternative to FSW is enumerating files, but this can be slow.&lt;/p&gt;  &lt;p&gt;As always, I’m interested in your thoughts.&amp;#160; Comment freely here or send a mail.&amp;#160; Full source for both client and server are &lt;a href="http://azureblobpusher.codeplex.com/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10173660" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/golive/archive/tags/Windows+Azure/">Windows Azure</category><category domain="http://blogs.msdn.com/b/golive/archive/tags/Windows+Azure+Storage/">Windows Azure Storage</category></item><item><title>Accumulus Makes Subscription Billing Easy for Windows Azure</title><link>http://blogs.msdn.com/b/golive/archive/2011/02/21/accumulus-makes-subscription-billing-easy-for-windows-azure.aspx</link><pubDate>Mon, 21 Feb 2011 19:18:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10132329</guid><dc:creator>GregOliver</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10132329</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2011/02/21/accumulus-makes-subscription-billing-easy-for-windows-azure.aspx#comments</comments><description>&lt;p&gt;The &lt;a href="http://accumulus.com/recurring-billing"&gt;Accumulus Subscription and Usage Billing System &lt;/a&gt;enables businesses to find more success with subscriptions and recurring payments. The system includes a suite of integrated tools designed to help a business grow its customer base by improving customer acquisition, fully automating the customer life-cycle and maximizing customer retention. The system handles promotion tracking, usage tracking, fee calculation, credit card processing, provisioning, billing statement emailing and customer support.&lt;/p&gt;  &lt;p&gt;I sat down with Gregory Kim, CEO of Accumulus, and Christian Dreke, President/COO of Accumulus to talk about how the Accumulus Subscription and Usage Billing System makes it easy to monetize subscription services in Windows Azure. The &lt;a href="http://channel9.msdn.com/Blogs/bruceky/Accumulus-Makes-Subscription-Billing-Easy-for-Windows-Azure" target="_blank"&gt;video&lt;/a&gt; ends with a demonstration of how quick it is to get started with Accumulus.&lt;/p&gt;  &lt;p&gt;Please take a look!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10132329" width="1" height="1"&gt;</description></item><item><title>Azure Email-Enables Lists, Low-Cost Storage for SharePoint</title><link>http://blogs.msdn.com/b/golive/archive/2011/02/14/azure-email-enables-lists-low-cost-storage-for-sharepoint.aspx</link><pubDate>Mon, 14 Feb 2011 22:22:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10129233</guid><dc:creator>GregOliver</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10129233</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2011/02/14/azure-email-enables-lists-low-cost-storage-for-sharepoint.aspx#comments</comments><description>&lt;p&gt;vorApps for SharePoint Online delivers an email enabled information management solution leveraging the power of Microsoft SharePoint Online. &lt;/p&gt;  &lt;p&gt;Diane Gallagher of Vorsite Corp talks to Greg Oliver, ISV Architect Evangelist, about how vorApps was built on Windows Azure and how Office 365 customers can use it with Exchange Online and SharePoint Online.&lt;/p&gt;  &lt;p&gt;View the video: &lt;a title="http://tinyurl.com/4df67fs" href="http://tinyurl.com/4df67fs"&gt;http://tinyurl.com/4df67fs&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Cheers!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10129233" width="1" height="1"&gt;</description></item><item><title>Installing a Windows Service in a Windows Azure Worker Role</title><link>http://blogs.msdn.com/b/golive/archive/2011/02/11/installing-a-windows-service-in-a-worker-role.aspx</link><pubDate>Sat, 12 Feb 2011 00:32:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10128356</guid><dc:creator>GregOliver</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10128356</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2011/02/11/installing-a-windows-service-in-a-worker-role.aspx#comments</comments><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;It might seem like a giant leap backward to bother with installing a Windows service in a worker role.&amp;#160; After all, the Windows Azure and Visual Studio teams went to a lot of trouble to create worker roles as a core part of the platform.&amp;#160; Worker role code is monitored by the fabric controller, so we know when it is no longer healthy and we can take steps to remediate.&amp;#160; Windows services have additional plumbing associated with them so they can be started up, paused, shut down and managed by the Services.msc MMC plug-in.&amp;#160; So why bother?&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;At this point I know of only one good reason: on-ramping to the cloud.&amp;#160; You might have a Windows service that you rely on and want to do a proof of concept on Windows Azure but not want to take the time to refactor to worker role code.&amp;#160; I’m sure that there are other good reasons and I’d love to hear them!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;The process to making this happen is pretty simple.&amp;#160; It involves the use of admin mode (available with the 1.3 SDK) and a short cmd script.&amp;#160; Here’s a brief overview of the process:&lt;/font&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;font size="2"&gt;Create a Windows service app for your test.&amp;#160; I used the template in VS2010, made it installable and gave it a name.&amp;#160; Nothing else.&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Create a new cloud solution and add a worker role.&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Add the Windows service app (my example is testapp.exe) to the worker role files.&amp;#160; Mark its properties “Build Action = None”, “Copy to Output Directory = Copy Always”.&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Add InstallUtil.exe and InstallUtil.exe.config in the same way.&amp;#160; My service was compiled using .NET 4.0, so I found the .NET 4.0 version of InstallUtil on my system to use.&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Create a command script using Notepad.&amp;#160; This command script will install your service using admin mode during the spin up of your worker role instances.&amp;#160; Include this file in your worker role files the same way as the others.&amp;#160; (NOTE: Don’t use VS to create the command script.&amp;#160; According to Steve Marx’ and Wade Wegner’s recent Cloud Cover &lt;a href="http://channel9.msdn.com/Shows/Cloud+Cover/Cloud-Cover-Episode-34-Advanced-Startup-Tasks-and-Video-Encoding"&gt;episode&lt;/a&gt;, this causes the file to not execute.)&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Add a few lines to your ServiceDefinition file that will cause your script to run.&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size="2"&gt;Configure Remote Desktop connections on your roles.&amp;#160; You’ll use RD to debug your script.&amp;#160; Here’s another Cloud Cover &lt;a href="http://channel9.msdn.com/Shows/Cloud+Cover/Cloud-Cover-Episode-33-Portal-Enhancements-and-Remote-Desktop"&gt;episode&lt;/a&gt; that should help you get this going.&lt;/font&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;font size="2"&gt;When you’ve got it set up correctly, your service will install automatically each time an instance of your role starts up.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Here are a few details:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-43-06-metablogapi/5531.WorkerService_5F00_0CF083AE.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WorkerService" border="0" alt="WorkerService" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-43-06-metablogapi/7510.WorkerService_5F00_thumb_5F00_0FD5C294.png" width="656" height="395" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;InstallService.cmd creates a new user account and makes it an administrator.&amp;#160; This user account is needed for the InstallUtil invocation.&amp;#160; The last line (exit /B 0) is to ensure that the script exits with a good return code.&amp;#160; This allows you to RDP into the instance while testing.&amp;#160; If you didn’t do this, the worker role will cycle, attempting to get a clean start.&amp;#160; Once your code is clean, you can remove the exit.&lt;/p&gt;  &lt;p&gt;One more thing: what did I put into my worker role code?&amp;#160; Nothing!&amp;#160; I just used the code as it comes out of the template.&amp;#160; It loops, waits 10 seconds, loops, etc.&lt;/p&gt;  &lt;p&gt;Cheers!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10128356" width="1" height="1"&gt;</description></item><item><title>Putting data in cold storage with Windows Azure Table</title><link>http://blogs.msdn.com/b/golive/archive/2011/02/08/putting-data-in-cold-storage-with-windows-azure-table.aspx</link><pubDate>Wed, 09 Feb 2011 02:43:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10126551</guid><dc:creator>GregOliver</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10126551</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2011/02/08/putting-data-in-cold-storage-with-windows-azure-table.aspx#comments</comments><description>&lt;p&gt;Sometimes the data that’s being kept in SQL Azure relational storage doesn’t really need to be there.&amp;#160; A couple of examples of this are blobs and historical records.&amp;#160; Lots of folks have discovered the wonders of moving blobs from relational storage to Windows Azure blob storage.&amp;#160; Just leave behind a pointer and add a line of code and instantly save relational storage capacity for more valuable pursuits.&lt;/p&gt;  &lt;p&gt;It’s a little more complicated with historical records.&amp;#160; Lots of transactional systems have a few big tables (such as invoice item).&amp;#160; The rest or the tables can be thought of as forming contextual frameworks (customer / product) or provide reference (zip code).&amp;#160; Most of the transactional records just sit there doing nothing most of the time.&amp;#160; You input them, manage them through to a completed state (paid invoice, for example) then print a few reports.&amp;#160; Done.&amp;#160; Wouldn’t it be nice if you didn’t have to keep them in (relatively expensive) relational storage for the next few years though you must keep them for regulatory or compliance reasons (for example)?&lt;/p&gt;  &lt;p&gt;The idea of expensive storage and cheap storage isn’t new.&amp;#160; The main thing I wanted to do with this blog is remind folks of it and give an example of some code that implements one variation.&amp;#160; In this example, I imagine that each and every invoice must be represented in the relational store with a tombstone so that it can be retrieved easily.&amp;#160; You never know when someone will decide to reach back a couple months or years into the archive.&amp;#160; &lt;/p&gt;  &lt;p&gt;A tombstone in this context is just a record that says data exists, but not in the relational table.&amp;#160; The tombstone contains enough information to find the original data at need.&amp;#160; You could set up tombstones to represent single records or any grouping that you care to imagine and that makes sense.&amp;#160; For example, maybe you permit people to reach into the archive to print a report for a single day and so you set up your tombstones to represent a whole day’s transactions.&lt;/p&gt;  &lt;p&gt;Ideally, the tombstone record is small relative to the data that you’re archiving.&amp;#160; A few bytes to point to a lot of bytes.&amp;#160; In my example, the invoice record has a invoice number, customer number and a creation date making up the primary key.&amp;#160; The actual invoice record will have columns representing shipment method, payment terms, the amount of the invoice, the amount paid, and so on.&amp;#160; For simplicity sake, I created an InvoiceMetadata table that has exactly one record for each Invoice record.&amp;#160; The InvoiceMetadata table has the primary keys plus a couple of flags that are used for tracking archived data.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-43-06-metablogapi/4064.Datamodel_5F00_2CE25B51.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Datamodel" border="0" alt="Datamodel" src="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-43-06-metablogapi/1016.Datamodel_5F00_thumb_5F00_71AE7F85.png" width="622" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When the management of the invoice is complete (it’s paid), the ReadyToArchiveFlag is set to true.&amp;#160; If the ArchivedFlag is set to true, it means that there is a copy of the Invoice record in the archive already.&lt;/p&gt;  &lt;p&gt;There are 4 main use cases associated with this example:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create new invoice records and manage them through their lifecycle     &lt;br /&gt;In the sample code, this is accomplished through the “Reset” button and “Test” button.&amp;#160; “Reset” clears the data store and then creates 50 invoices.&amp;#160; “Test” sets some of them as “paid” and therefore ReadyToArchiveFlag is also set.&amp;#160; Finally, a message is dropped into a queue.&amp;#160; The message instructs a worker role to archive any invoices that are ready.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Archive invoices that have completed their lifecycle     &lt;br /&gt;The worker role finds the message and makes a copy of each invoice that is ready.&amp;#160; It copies the records to Azure Table storage and deletes them from the SQL Azure table.&amp;#160; It also sets the “ArchivedFlag” in InvoiceMetadata.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Bring back invoices that are needed for research, reporting, etc.     &lt;br /&gt;For this use case I have a “Report” button.&amp;#160; I imagine that someone wants to print invoices for a certain date.&amp;#160; The code behind the “Report” button drops a message into the queue.&amp;#160; The worker role picks up the message and as instructed, copies the records from Table storage back to SQL Azure.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Remove invoices from relational storage that are no longer needed     &lt;br /&gt;After the report is printed, any invoice that’s in SQL Azure that has the “ArchivedFlag” set is deleted.&amp;#160; There’s already a copy in the archive so nothing else needs to be done.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;How can costs and savings be calculated?&amp;#160; Both SQL Azure and Azure Table storage are charged by the gigabyte.&amp;#160; SQL Azure storage charges are calculated daily.&amp;#160; So – if your database has a max capacity of 5gb for the day, you’re charged 5 * $9.99 / (average # days / month).&amp;#160; If you can do your retrieval of archived data without expanding your database, then it costs nothing extra to do your “reports” under this scheme.&amp;#160; (If you do need to expand your database to hold archived data temporarily, use &lt;a href="http://msdn.microsoft.com/en-us/library/ff394109.aspx"&gt;ALTER DATABASE&lt;/a&gt;.)&amp;#160; Savings may be calculated as the number of gb that get archived * ($9.99 – .15) and prorated to the number of days in the month.&amp;#160; &lt;/p&gt;  &lt;p&gt;A few comments about the &lt;a href="http://azurecoldstorage.codeplex.com"&gt;source code&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;I built this starting with a plain cloud project + 1 web role + 1 worker role.&amp;#160; I added a data model and used Entity Framework for data access.&amp;#160; The deletes were done with embedded SQL so that I didn’t have to read the records into memory that I wanted to delete.&amp;#160; Some readers may be familiar with sparse columns in SQL Server.&amp;#160; SQL Azure doesn’t support sparse columns at this point, so I elected to split out the InvoiceMetadata.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10126551" width="1" height="1"&gt;</description></item><item><title>Accommodating Your Batch Window in Windows Azure</title><link>http://blogs.msdn.com/b/golive/archive/2011/01/26/accommodating-your-batch-window-in-windows-azure.aspx</link><pubDate>Wed, 26 Jan 2011 22:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10120724</guid><dc:creator>GregOliver</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/golive/rsscomments.aspx?WeblogPostID=10120724</wfw:commentRss><comments>http://blogs.msdn.com/b/golive/archive/2011/01/26/accommodating-your-batch-window-in-windows-azure.aspx#comments</comments><description>&lt;p&gt;Certain functions of a system need to run once per day in a typical “batch window” scenario.&lt;/p&gt;  &lt;p&gt;You might already be aware that Azure compute is paid by the CPU-hour.&amp;#160; If you’re occupying the CPU, whether or not actively using it, you’re still paying for it.&amp;#160; You occupy the CPU ‘slot’ by having a role deployed, regardless of state - it doesn’t have to be in the ‘Ready’ state.&lt;/p&gt;  &lt;p&gt;So how do you get your batch of work done without paying for the slot 24 hours per day?&lt;/p&gt;  &lt;p&gt;The answer is found in the &lt;a href="http://msdn.microsoft.com/en-us/library/ff800682.aspx" target="_blank"&gt;Windows Azure Service Management API&lt;/a&gt;.&amp;#160; The &lt;a href="http://msdn.microsoft.com/en-us/library/ee460813.aspx" target="_blank"&gt;CreateDeployment&lt;/a&gt; API can be used to deploy an app into an existing Hosted Service.&amp;#160; You can do this in various ways including client code, a PowerShell script, or a web or worker role that’s running in Windows Azure.&lt;/p&gt;  &lt;p&gt;There are a couple of versions of the Service Management API: managed code and REST.&amp;#160; At the time of this writing, the REST version of the API is the most complete and feature rich.&amp;#160; The managed version doesn’t currently support the ability to &lt;a href="http://msdn.microsoft.com/en-us/library/ee460813.aspx" target="_blank"&gt;CreateDeployment&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For my purposes, I looked at how to use an Azure role to deploy an app.&amp;#160; The PowerShell script already exists and is easy to use – as depicted in one of the Hands on Labs in the &lt;a href="http://www.microsoft.com/downloads/en/results.aspx?freetext=Windows+Azure+Platform+Training+Kit&amp;amp;displaylang=en&amp;amp;stype=s_basic" target="_blank"&gt;Windows Azure Platform Training Kit&lt;/a&gt;.&amp;#160; By creating code that runs in a worker role you can then replicate (multi-instance) it in a management pack for your service, thus giving it high availability and fault tolerance.&lt;/p&gt;  &lt;p&gt;The sample code that I provide is in a web role.&amp;#160; I used the web page to display diagnostics as I went along.&amp;#160; The project is just a new cloud solution with a web role as provided by Visual Studio 2010.&amp;#160; I’m using the 1.3 version of the Windows Azure SDK, but everything I’ve done here can also be done with the 1.2 version.&amp;#160; In my code, I:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Load the certificate &lt;/li&gt;    &lt;li&gt;Initialize storage &lt;/li&gt;    &lt;li&gt;(user clicks “test” button) &lt;/li&gt;    &lt;li&gt;Get ServiceConfiguration.cscfg from blob storage &lt;/li&gt;    &lt;li&gt;Build request and payload &lt;/li&gt;    &lt;li&gt;Submit the request &lt;/li&gt;    &lt;li&gt;Display the ID of the request as returned from the platform. &lt;/li&gt; &lt;/ol&gt;  &lt;ol&gt;The &lt;a href="http://azurerolebaseddeploy.codeplex.com/" target="_blank"&gt;source code&lt;/a&gt; is posted on CodePlex.&lt;/ol&gt;  &lt;p&gt;Following are signposts to help you avoid some of the bumps on the road:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Certificate Handling&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When you are accessing the Service Management API from the client, you must use a certificate to authenticate the program to the portal.&amp;#160; You must upload the management certificate to the Azure portal and have the original certificate on the client.&amp;#160; The PowerShell script (or windows client) references the local version and matches it to the version that’s in the portal.&lt;/p&gt;  &lt;p&gt;When you’re using a web or worker role, the cert has to be loaded into the role as well as the management certificate store so the role can match its copy to the one in the management certificate store.&amp;#160; Hence, you actually have to export the certificate twice – once to the DER version (to a file with .CER extension) as well as export the private key version (.PFX extension).&amp;#160; The &lt;a href="http://azurerolebaseddeploy.codeplex.com" target="_blank"&gt;source code&lt;/a&gt; that I’ve provided has additional details.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Request URI&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;One of the parameters in the request URI is &amp;lt;service-name&amp;gt;.&amp;#160; The value that you need to use is the one in the ‘DNS Prefix’ field in the management portal.&amp;#160; It’s case sensitive.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Creating the Payload&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The web request for CreateDeployment requires a payload.&amp;#160; I tried a couple of ways to create the payload and decided I like using XDocument and XElement (&lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.linq.aspx" target="_blank"&gt;System.XML.Linq&lt;/a&gt;) to manage this.&amp;#160; The other way I tried is plain old embedded text.&lt;/p&gt;  &lt;p&gt;If you like the plain old text method, there’s a wrinkle to avoid.&amp;#160; Don’t precede your XML with a newline.&amp;#160; I tried this at first for readability, but the request fails with InvalidXMLRequest.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;GOOD&lt;/p&gt;    &lt;p&gt;&lt;span style="font-size: xx-small"&gt;payload = string.Format(@&amp;quot;&amp;lt;?xml version=&amp;quot;&amp;quot;1.0&amp;quot;&amp;quot; encoding=&amp;quot;&amp;quot;utf-8&amp;quot;&amp;quot; standalone=&amp;quot;&amp;quot;yes&amp;quot;&amp;quot;?&amp;gt;        &lt;br /&gt;&amp;lt;CreateDeployment xmlns=&amp;quot;&amp;quot;&lt;/span&gt;&lt;a href="http://schemas.microsoft.com/windowsazure&amp;quot;&amp;quot;"&gt;&lt;span style="font-size: xx-small"&gt;http://schemas.microsoft.com/windowsazure&amp;quot;&amp;quot;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: xx-small"&gt;&amp;gt; &amp;lt;Name&amp;gt;{0}&amp;lt;/Name&amp;gt;        &lt;br /&gt;…&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="font-size: x-small"&gt;BAD&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span style="font-size: xx-small"&gt;payload = string.Format(@&amp;quot;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: xx-small"&gt;&amp;lt;?xml version=&amp;quot;&amp;quot;1.0&amp;quot;&amp;quot; encoding=&amp;quot;&amp;quot;utf-8&amp;quot;&amp;quot; standalone=&amp;quot;&amp;quot;yes&amp;quot;&amp;quot;?&amp;gt;        &lt;br /&gt;&amp;lt;CreateDeployment xmlns=&amp;quot;&amp;quot;&lt;/span&gt;&lt;a href="http://schemas.microsoft.com/windowsazure&amp;quot;&amp;quot;"&gt;&lt;span style="font-size: xx-small"&gt;http://schemas.microsoft.com/windowsazure&amp;quot;&amp;quot;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: xx-small"&gt;&amp;gt; &amp;lt;Name&amp;gt;{0}&amp;lt;/Name&amp;gt;        &lt;br /&gt;…&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;If you prefer the System.XML.Linq approach, there is another wrinkle to avoid.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;span style="font-size: xx-small"&gt;XNamespace xn = &amp;quot;&lt;/span&gt;&lt;a href="http://schemas.microsoft.com/windowsazure&amp;quot;;"&gt;&lt;span style="font-size: xx-small"&gt;http://schemas.microsoft.com/windowsazure&amp;quot;;&lt;/span&gt;&lt;/a&gt;       &lt;br /&gt;&lt;span style="font-size: xx-small"&gt;XDocument doc = new XDocument(        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new XElement(xn + &amp;quot;CreateDeployment&amp;quot;,         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new XElement(xn + &amp;quot;Name&amp;quot;, &amp;quot;gotest-20101231&amp;quot;),         &lt;br /&gt;…&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;After building up the XDocument, you need to get it into a string before transmitting it.&amp;#160; This string must be UTF-8 encoded.&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/bb335859.aspx" target="_blank"&gt;XDocument.Save&lt;/a&gt; wants a &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.stringwriter.aspx" target="_blank"&gt;StringWriter&lt;/a&gt;, and StringWriter.ToString() outputs UTF-16.&amp;#160; (If you forget and do this, you’ll get ProtocolError.)&amp;#160; The solution is to subclass StringWriter, adding an encoder that outputs UTF-8.&amp;#160; Again, details are in the &lt;a href="http://azurerolebaseddeploy.codeplex.com" target="_blank"&gt;provided source&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Referencing REST Resources&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In general, REST resource designators are case sensitive in the Windows Azure REST API.&amp;#160; The portal will enforce lower case on some things, but your deployment package might be upper and lower case, so be careful with that.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Multiple Versions&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There have been several releases of the API, and older versions are still supported.&amp;#160; Hence, when you build your request, you need to specify x-ms-version in a request header.&amp;#160; Check carefully for the correct version; the value given for CreateDeployment is 2009-10-01 (or later) in the Request Headers section of the documentation.&amp;#160; If you read further you’ll find that it must be 2010-04-01 if you include StartDeployment or TreatWarningsAsError in your payload.&lt;/p&gt;  &lt;p&gt;I hope these tips come in handy.&amp;#160; Please comment freely and let me know if there are other aspects of this topic that you’d like to hear more about.&lt;/p&gt;  &lt;p&gt;Cheers!&lt;/p&gt;  &lt;p&gt;Attribution:&lt;/p&gt;  &lt;p&gt;Thanks to &lt;a href="http://blog.smarx.com/" target="_blank"&gt;Steve Marx&lt;/a&gt; for his very valuable assistance on several fronts.     &lt;br /&gt;Thanks to &lt;a href="http://www.ricardovillalobos.com/" target="_blank"&gt;Ricardo Villalobos&lt;/a&gt; for his assistance with the StringWriter subclass.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10120724" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/golive/archive/tags/Service+Management+API/">Service Management API</category><category domain="http://blogs.msdn.com/b/golive/archive/tags/Windows+Azure/">Windows Azure</category></item></channel></rss>