<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Clydesdale Software Blog</title>
    <description>Clydesdale software is a leader in software product lifecycle management and application lifecycle management.  Assessing product readiness is key when bringing a software product to market, making sure all pieces are in alignment to make it a success.</description>
    <link>http://www.clydesdalesoftware.com/Blog.aspx</link>
    <docs>http://backend.userland.com/rss</docs>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ClydesdaleSoftwareBlog" /><feedburner:info uri="clydesdalesoftwareblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>More With the Azure Cache</title>
      <description>&lt;p&gt;&lt;font size="2"&gt;In &lt;/font&gt;&lt;a href="http://www.clydesdalesoftware.com/blog/12-01-23/Azure_Cache_DataCacheException_ndash_SOLVED.aspx" target="_blank"&gt;&lt;font size="2"&gt;my last post&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; I showed how I fixed a ton of errors that were being received with a very simple approach for working with the Azure Cache.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;This time I will share how I dealt with serialization issues because I decided to add a property to an object I stored in the cache then deployed, &lt;strong&gt;BOOM&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Another simple approach, when an error happens trying to get the item from the cache (then casting it), remove that item from the cache and the next call will add it back in and life will go on.&amp;#160; If you do not do this the item will be attempted to be retrieved many times each throwing an exception.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;EXAMPLE&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000" size="2"&gt;public static CustomerInfo GetCustomerInfoByAccessKey(string accessKey)     &lt;br /&gt; {      &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; if (RoleEnvironment.IsAvailable)      &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; {      &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; try      &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; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000" size="2"&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; //GetCacheItem is the method from &lt;a href="http://www.clydesdalesoftware.com/blog/12-01-23/Azure_Cache_DataCacheException_ndash_SOLVED.aspx" target="_blank"&gt;my previous post&lt;/a&gt;      &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; var customerCacheItem = GetCacheItem(accessKey);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000" size="2"&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; if (customerCacheItem == null)     &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; {      &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; var customer = RetrieveCustomerInfoByAccessKeyFromDB(accessKey);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000" size="2"&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; if (customer != null)     &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; {      &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;&amp;#160;&amp;#160;&amp;#160; DataCache.Put(customer.AccessKey, customer, TimeSpan.FromHours(2));      &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; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000" size="2"&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; return customer;     &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; }      &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; else      &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; {      &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; return (CustomerInfo)customerCacheItem.Value;      &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; }      &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; }      &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; catch (Exception ex)      &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; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000" size="2"&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; //Trys to Remove (i.e. the remove is in a try/catch) the &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000" size="2"&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; //CustomerInfo object related to the accessKey from the cache     &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; &lt;/font&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&lt;strong&gt; FlushCustomer(accessKey);&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&lt;strong&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; &lt;/strong&gt;//I want to know this happened        &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; Log.Error(&amp;quot;Caching Error: &amp;quot; + ex, CategorySources.Caching);        &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; }        &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; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Either not running in azure or emulator or the try to get it form the cache has failed &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000" size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return RetrieveCustomerInfoByAccessKeyFromDB(accessKey);     &lt;br /&gt;&amp;#160; }&lt;/font&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/dOUkxEFYu2Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/dOUkxEFYu2Q/More_With_the_Azure_Cache.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/12-01-31/More_With_the_Azure_Cache.aspx</comments>
      <guid isPermaLink="false">b4866204-ce74-42c5-8325-ca5dd9a51efe</guid>
      <pubDate>Tue, 31 Jan 2012 20:24:40 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/12-01-31/More_With_the_Azure_Cache.aspx</feedburner:origLink></item>
    <item>
      <title>Choose Your Demographic Wisely</title>
      <description>&lt;p&gt;When building a product make sure to think hard about your demographic.&amp;#160; The common mistake is to try and hit all your demographics at once and not putting much effort behind any one of them.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;From a product perspective, the&amp;#160; product is likely to become marginal in all the demographics with this approach and the feedback is so diverse the development of the product now becomes hindered.&amp;#160; It actually creates a cycle that is hard to break.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;hit all demographics&amp;#160; -&amp;gt; feedback from all demographics – &amp;gt; develop to all demographics –&amp;gt; hit all demographics –&amp;gt; Rinse and Repeat&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Result is not a product that is everything to everyone but a product that is marginal to everyone.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Focus on one demographic while sampling others to gain analytics that an educated decision can be based on resulting in a much clearer direction.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/PHeKlbJLjyQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/PHeKlbJLjyQ/Choose_Your_Demographic_Wisely.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/12-01-30/Choose_Your_Demographic_Wisely.aspx</comments>
      <guid isPermaLink="false">a68379af-8814-407c-88e3-e5553e6c5452</guid>
      <pubDate>Mon, 30 Jan 2012 20:14:56 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/12-01-30/Choose_Your_Demographic_Wisely.aspx</feedburner:origLink></item>
    <item>
      <title>Azure Cache: DataCacheException &amp;ndash;SOLVED!</title>
      <description>&lt;p&gt;&lt;font size="2"&gt;I have found a simple solution to the azure caching issue.&amp;#160; First off the error of&amp;#160; SubStatus&amp;lt;ES0006&amp;gt; which is &lt;strong&gt;throttled&lt;/strong&gt; is not true.&amp;#160; The real issue is stale connections (I think).&amp;#160; When the cache is not used for a bit the connections go stale, then when you try to use them they throw the throttled exception again and again and it seems to take some time for it to stop being used and a new one created.&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;The solution/work around is to try and get the cache item once and if it fails recreated the cache object then go for the cache object.&amp;#160; Before I put this in place I got hundreds of errors.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;The code:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;font size="2"&gt;Instead to using the DataCache’s GetCacheItem use this one.&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;private static DataCacheItem GetCacheItem(string key)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; //See if the cache connections are valid&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; return DataCache.GetCacheItem(key);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; //This is an attempt to get fresh connections everytime&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; InitCache();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return DataCache.GetCacheItem(key);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;font size="2"&gt;And the InitCache:&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;private static void InitCache()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lock (lockObject)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; var cacheFactory = new DataCacheFactory();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; var cache = cacheFactory.GetDefaultCache();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; instance = cache;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;font size="2"&gt;Instance and lockObject are fields:&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;private static DataCache instance;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;private static readonly Object lockObject = new object();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;font size="2"&gt;And for other cache operation such as puts I have this property:&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;private static DataCache DataCache&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; if (instance == null)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; {&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; InitCache();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&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; return instance;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;u&gt;The Result&lt;/u&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Now no emails about this error and throughput has increased because only the first request fails with the cache then recreates the cache object and everything runs smoothly.&lt;/font&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/vpL1yXX2oJU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/vpL1yXX2oJU/Azure_Cache_DataCacheException_ndash_SOLVED.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/12-01-23/Azure_Cache_DataCacheException_ndash_SOLVED.aspx</comments>
      <guid isPermaLink="false">71b70b2b-65fa-4137-9b2f-5960cffb1dbf</guid>
      <pubDate>Tue, 24 Jan 2012 03:02:24 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/12-01-23/Azure_Cache_DataCacheException_ndash_SOLVED.aspx</feedburner:origLink></item>
    <item>
      <title>Umbraco in Azure</title>
      <description>&lt;p&gt;&lt;font size="2"&gt;I’m sure I’m not the only one that started looking for a better way to have Umbraco in Azure then using the Umbraco Accelerator that hits blob storage every second.&amp;#160; There are many limitations to the accelerator and after spending a day modifying it I decided to go another direction.&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;font size="2"&gt;Firstly understand my usage scenario may not be the same as others.&amp;#160; I use a CDN for public content (such as images) and I created a handler to retrieve private content (such as user downloads) from blob storage.&amp;#160; For css, master page changes, etc I deploy then vip swap.&amp;#160; Quite honestly this is not what I use Umbraco for.&amp;#160; I do not upload images or private content to Umbraco so I do not need file syncing at the moment, though I do have some ideas on how to achieve this with notifications and web services.&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;font size="2"&gt;The main issue is Umbraco Caching.&amp;#160; When content is published it needs to notify all the instances in Azure so the cache can be updated.&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;font size="2"&gt;Umbraco supports load balanced environments so the trick is setting it up in Azure.&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;font size="2"&gt;1) Add &lt;strong&gt;&amp;lt;Runtime executionContext=&amp;quot;elevated&amp;quot; /&amp;gt;&lt;/strong&gt; to your service definition right under the WebRole element.&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;font size="2"&gt;2) Make sure &lt;strong&gt;umbracoUseSSL&lt;/strong&gt; in the web.config appSettings is set to &lt;strong&gt;false&lt;/strong&gt;.&amp;#160; The reason for this is each server listed in the umbracoSettings.config has a webservice called made on it.&amp;#160; The internal Umbraco code uses this setting and will try to use https for this call and since these are internal ips there will be a cert error and it will not work.&amp;#160; You can still access the admin portal with https, it will just not auto redirect (could probably use url rewriting to get around this). &lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;font size="2"&gt;3) In &lt;strong&gt;umbracoSettings.config&lt;/strong&gt; enable &lt;strong&gt;distributedCall&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;font size="2"&gt;4) Use the &lt;strong&gt;&lt;a href="http://www.clydesdalesoftware.com/blogcontent/umbracoazuresetup.txt" target="_blank"&gt;UmbracoAzureSetup&lt;/a&gt;&lt;/strong&gt; class to get load balancing setup. Add &lt;strong&gt;UmbracoAzureSetup.Setup() &lt;/strong&gt;to your &lt;strong&gt;OnStart&lt;/strong&gt; of the &lt;strong&gt;WebRole&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="2"&gt;NOTE 1: Please read through the UmbracoAzureSetup class because it is coded with some limitations that may require a code change to meet your requirements.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font size="2"&gt;NOTE 2: I recommend wrapping your code in OnStart in a try/catch and write to the event log on error so you can get details when something goes wrong.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font size="2"&gt;5) Enjoy Umbraco in Azure and watch caching work like a charm.&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;font size="2"&gt;Details of the &lt;a href="http://www.clydesdalesoftware.com/blogcontent/umbracoazuresetup.txt" target="_blank"&gt;UmbracoAzureSetup&lt;/a&gt; Class:&lt;/font&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;This class is pretty simple, it does two basic things.&amp;#160; &lt;strong&gt;One&lt;/strong&gt;, sets full control permissions for NETWORK SERVICE and &lt;strong&gt;two&lt;/strong&gt;, updates the umbracoSettingsConfig with the ip addresses of the instances in Azure.&lt;/font&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;div style="border-bottom: #000080 1px solid; border-left: #000080 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; color: #000; font-size: 10pt; border-top: #000080 1px solid; border-right: #000080 1px solid"&gt;   &lt;div style="padding-bottom: 2px; background-color: #000000; padding-left: 5px; width: 650px; padding-right: 5px; white-space: nowrap; max-height: 500px; overflow: auto; padding-top: 2px"&gt;&lt;span style="color: #808080"&gt;// ----------------------------------------------------------------------------------&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #808080"&gt;//&amp;#160; Unified Logging&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #808080"&gt;//&amp;#160; &lt;/span&gt;      &lt;br /&gt;&lt;span style="color: #808080"&gt;//&amp;#160; Copyright (c) UL Analytics, LLC. All rights reserved.&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #808080"&gt;//&amp;#160; &lt;/span&gt;      &lt;br /&gt;&lt;span style="color: #808080"&gt;//&amp;#160; ----------------------------------------------------------------------------------&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #cc7832"&gt;using&lt;/span&gt;&lt;span style="color: #ffffff"&gt; System;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #cc7832"&gt;using&lt;/span&gt;&lt;span style="color: #ffffff"&gt; System.Collections.Generic;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #cc7832"&gt;using&lt;/span&gt;&lt;span style="color: #ffffff"&gt; System.IO;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #cc7832"&gt;using&lt;/span&gt;&lt;span style="color: #ffffff"&gt; System.Security.AccessControl;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #cc7832"&gt;using&lt;/span&gt;&lt;span style="color: #ffffff"&gt; System.Xml;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #cc7832"&gt;using&lt;/span&gt;&lt;span style="color: #ffffff"&gt; System.Xml.Linq;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #cc7832"&gt;using&lt;/span&gt;&lt;span style="color: #ffffff"&gt; System.Xml.XPath;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #cc7832"&gt;using&lt;/span&gt;&lt;span style="color: #ffffff"&gt; Microsoft.WindowsAzure.ServiceRuntime;&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #cc7832"&gt;namespace&lt;/span&gt;&lt;span style="color: #ffffff"&gt; UnifiedLogging.Web.Site&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;{&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;static&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;class&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;UmbracoAzureSetup&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #da4832"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt;&lt;span style="color: #ffffff"&gt; public Static Methods&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Sets up umbraco for load balancing in Azure.&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Things to Note:&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; 1) This is coded to work with one Site element under Sites in the RoleModel.xml.&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Update the code if this is not your case.&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; 2) Sets permissions for NETWORK SERVICE, if the app pool is different update the code.&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;static&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;void&lt;/span&gt;&lt;span style="color: #ffffff"&gt; Setup()&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SetPermissions();&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpdateUmbracoSettings();&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #da4832"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #da4832"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt;&lt;span style="color: #ffffff"&gt; private Static Methods&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; This will get the attribute of the first Site under Sites in the RoleModel.xml.&amp;#160; &lt;/span&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; If there are multpile site elements be sure to update this method to return the correct physical path.&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;static&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;string&lt;/span&gt;&lt;span style="color: #ffffff"&gt; GetWebSiteDirectory()&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; rootPath = &lt;/span&gt;&lt;span style="color: #cc7832"&gt;string&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.Empty;&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; roleRootDir = &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Environment&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.GetEnvironmentVariable(&lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;RdRoleRoot&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;);&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; roleModelDoc = &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;XDocument&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.Load(&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Path&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.Combine(roleRootDir, &lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;RoleModel.xml&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;));&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; namespaceManager = &lt;/span&gt;&lt;span style="color: #cc7832"&gt;new&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;XmlNamespaceManager&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(&lt;/span&gt;&lt;span style="color: #cc7832"&gt;new&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;NameTable&lt;/span&gt;&lt;span style="color: #ffffff"&gt;());&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; namespaceManager.AddNamespace(&lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;empty&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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;&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; &lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;);&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; siteElement = roleModelDoc.XPathSelectElement(&lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;/empty:RoleModel/empty:Sites/empty:Site&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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;&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;&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; namespaceManager);&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;if&lt;/span&gt;&lt;span style="color: #ffffff"&gt; (siteElement != &lt;/span&gt;&lt;span style="color: #cc7832"&gt;null&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; attr = siteElement.Attribute(&lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;physicalDirectory&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;if&lt;/span&gt;&lt;span style="color: #ffffff"&gt; (attr != &lt;/span&gt;&lt;span style="color: #cc7832"&gt;null&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; rootPath = &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Path&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.Combine(roleRootDir, attr.Value);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; }&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;return&lt;/span&gt;&lt;span style="color: #ffffff"&gt; rootPath + &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Path&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.DirectorySeparatorChar;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Will set full control permissions for NETWORK SERVICE on the entire web directory.&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;static&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;void&lt;/span&gt;&lt;span style="color: #ffffff"&gt; SetPermissions()&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; roleRootDir = GetWebSiteDirectory();&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;if&lt;/span&gt;&lt;span style="color: #ffffff"&gt; (&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;String&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.IsNullOrEmpty(roleRootDir) == &lt;/span&gt;&lt;span style="color: #cc7832"&gt;false&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; roleRootDir = roleRootDir.TrimEnd(&lt;/span&gt;&lt;span style="color: #a5c25c"&gt;'\\'&lt;/span&gt;&lt;span style="color: #ffffff"&gt;);&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; accessControl = &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Directory&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.GetAccessControl(roleRootDir);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; accessControl.AddAccessRule(&lt;/span&gt;&lt;span style="color: #cc7832"&gt;new&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FileSystemAccessRule&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(&lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;NETWORK SERVICE&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;, &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FileSystemRights&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.FullControl,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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;&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;&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; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;InheritanceFlags&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.ContainerInherit |&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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;&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;&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; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;InheritanceFlags&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.ObjectInherit,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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;&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;&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; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;PropagationFlags&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.None,&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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;&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;&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; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;AccessControlType&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.Allow));&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Directory&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.SetAccessControl(roleRootDir, accessControl);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; Updates the umbracosetting.config with the ip addresses of the instances in the role.&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;static&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;void&lt;/span&gt;&lt;span style="color: #ffffff"&gt; UpdateUmbracoSettings()&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; serverIps = &lt;/span&gt;&lt;span style="color: #cc7832"&gt;new&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;List&lt;/span&gt;&lt;span style="color: #ffffff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #cc7832"&gt;string&lt;/span&gt;&lt;span style="color: #ffffff"&gt;&amp;gt;();&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;if&lt;/span&gt;&lt;span style="color: #ffffff"&gt; (&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;RoleEnvironment&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.IsAvailable)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;foreach&lt;/span&gt;&lt;span style="color: #ffffff"&gt; (&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;RoleInstance&lt;/span&gt;&lt;span style="color: #ffffff"&gt; roleInstance &lt;/span&gt;&lt;span style="color: #cc7832"&gt;in&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;RoleEnvironment&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.CurrentRoleInstance.Role.Instances)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;foreach&lt;/span&gt;&lt;span style="color: #ffffff"&gt; (&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;RoleInstanceEndpoint&lt;/span&gt;&lt;span style="color: #ffffff"&gt; endpoint &lt;/span&gt;&lt;span style="color: #cc7832"&gt;in&lt;/span&gt;&lt;span style="color: #ffffff"&gt; roleInstance.InstanceEndpoints.Values)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; ipString = endpoint.IPEndpoint.Address.ToString();&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;if&lt;/span&gt;&lt;span style="color: #ffffff"&gt; (serverIps.Contains(ipString) == &lt;/span&gt;&lt;span style="color: #cc7832"&gt;false&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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;&amp;#160;&amp;#160;&amp;#160; serverIps.Add(ipString);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; }&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; }&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; }&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteDistributedServers(serverIps);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;static&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;void&lt;/span&gt;&lt;span style="color: #ffffff"&gt; WriteDistributedServers(&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;List&lt;/span&gt;&lt;span style="color: #ffffff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #cc7832"&gt;string&lt;/span&gt;&lt;span style="color: #ffffff"&gt;&amp;gt; serverIps)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; websiteRoot = GetWebSiteDirectory();&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #808080"&gt;//taken from umbraco source:)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; configPath = websiteRoot + &lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;config&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt; +&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Path&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.DirectorySeparatorChar + &lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;umbracoSettings.config&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;;&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; umbracoSettings = &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;XDocument&lt;/span&gt;&lt;span style="color: #ffffff"&gt;.Load(configPath);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; serversElement = umbracoSettings.XPathSelectElement(&lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;/settings/distributedCall/servers&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;);&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;if&lt;/span&gt;&lt;span style="color: #ffffff"&gt; (serversElement != &lt;/span&gt;&lt;span style="color: #cc7832"&gt;null&lt;/span&gt;&lt;span style="color: #ffffff"&gt;)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; serversElement.RemoveNodes();&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;foreach&lt;/span&gt;&lt;span style="color: #ffffff"&gt; (&lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; serverIp &lt;/span&gt;&lt;span style="color: #cc7832"&gt;in&lt;/span&gt;&lt;span style="color: #ffffff"&gt; serverIps)&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; {&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var&lt;/span&gt;&lt;span style="color: #ffffff"&gt; serverElement = &lt;/span&gt;&lt;span style="color: #cc7832"&gt;new&lt;/span&gt;&lt;span style="color: #ffffff"&gt; &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;XElement&lt;/span&gt;&lt;span style="color: #ffffff"&gt;(&lt;/span&gt;&lt;span style="color: #a5c25c"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: #ffffff"&gt;, serverIp);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; serversElement.Add(serverElement);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&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; }&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #ffffff"&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; umbracoSettings.Save(configPath);&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;span style="color: #da4832"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: #ffffff"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/WS4M9YyOMA8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/WS4M9YyOMA8/Umbraco_in_Azure.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/12-01-07/Umbraco_in_Azure.aspx</comments>
      <guid isPermaLink="false">13ffb2ac-a99b-4bb0-b653-5279f275b76c</guid>
      <pubDate>Sat, 07 Jan 2012 22:37:28 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/12-01-07/Umbraco_in_Azure.aspx</feedburner:origLink></item>
    <item>
      <title>Will the US Government Open Their Eyes?</title>
      <description>&lt;p&gt;I’m in complete disbelief how naive the US Government is these days by trying to take 35% of US companies profits and then surprised when some of our largest companies move their business elsewhere and take their money with them.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The US Government’s response is to create more tax laws trying to force companies to pay taxes and close loopholes.&amp;#160; This is not rocket science, basic toddler behavior, the more rules you try to enforce the more erratic and undesirable behavior results. Maybe the US politicians have never raised a kid or they have not watched enough star wars. Give companies a reason to stay, incentivize them.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So the US is currently willing to accept 0% of profits and stick by their laws instead of accepting something less than 35% and incentivize companies to stay in the US. Seems pretty bull headed to me, but who am I to say; oh wait I’m one of the millions paying our politicians salaries!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In conclusion, it seems the US government has forgotten that our nation is built on top of our people not our policies and laws.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/7HiVG9WWfE8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/7HiVG9WWfE8/Will_the_US_Government_Open_Their_Eyes.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/11-08-15/Will_the_US_Government_Open_Their_Eyes.aspx</comments>
      <guid isPermaLink="false">5b889acd-f728-4de0-ad38-3e627aa8b1c5</guid>
      <pubDate>Mon, 15 Aug 2011 17:41:44 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/11-08-15/Will_the_US_Government_Open_Their_Eyes.aspx</feedburner:origLink></item>
    <item>
      <title>Thecus vs Drobo, and the Winner Is</title>
      <description>&lt;p&gt;I will not keep you waiting, the winner is easily the Thecus N5500.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Started out purchasing the Drobo FS with high hopes it would suite all my needs.  Well first pitfall which was a deal breaker is there is no Active Directory or LDAP integration.  Drobo support says this is because they are targeting the small office.  I call Bull Sh#$, plenty of small offices have active directory and are using small business server.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;So back the Drobo went and I ordered the Thecus N5500.  Once I got the N5500 I dropped in five 1TB drives configured in RAID 6 and away I went.  The web interface is great and setting permissions on folders is very simple.  Performance is good and I expect it to even be better once I setup link aggregation.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;So far the Thecus N5500 has done everything with ease I have asked of it.&lt;/p&gt; &lt;br&gt; &lt;/br&gt;&lt;br&gt; &lt;/br&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/tWdozXBPXds" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/tWdozXBPXds/Thecus_vs_Drobo_and_the_Winner_Is.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/11-07-25/Thecus_vs_Drobo_and_the_Winner_Is.aspx</comments>
      <guid isPermaLink="false">7de1055b-9d5a-494c-8b54-4731d0bebe56</guid>
      <pubDate>Mon, 25 Jul 2011 17:29:54 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/11-07-25/Thecus_vs_Drobo_and_the_Winner_Is.aspx</feedburner:origLink></item>
    <item>
      <title>Rally Custom App: Release Estimation Board</title>
      <description>&lt;p&gt;I love the estimation board in Rally but I dislike that it shows everything.&amp;#160; I wanted to have it filter by release so here is the custom app that you can add that does just that.&lt;/p&gt;  &lt;br /&gt; &lt;textarea cols="80" rows="40"&gt; &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt; &lt;!-- Copyright (c) 2011  Rally Software Development Corp.  All rights reserved --&gt; &lt;html&gt; &lt;head&gt;     &lt;title&gt;Estimation Board&lt;/title&gt;     &lt;meta name="Name" content="App: Estimation Board" /&gt;     &lt;meta name="Version" content="2011.04.20" /&gt;     &lt;meta name="Vendor" content="Rally Software" /&gt;      &lt;script type="text/javascript" src="/apps/1.23/sdk.js"&gt;&lt;/script&gt;      &lt;script type="text/javascript"&gt;
        function EstimationBoard(rallyDataSource, settingsShow, sizes) {
            var cardboard;
            var that = this;
            var checkBoxes = [];

            this._createLayout = function (element) {

                rally.sdk.ui.AppHeader.showPageTools(true);
                rally.sdk.ui.AppHeader.setHelpTopic("/display/rlyhlp/Estimation+Board");

                var headerDiv = document.createElement("div");
                element.appendChild(headerDiv);

                var checkBoxContainerDiv = document.createElement("div");
                dojo.addClass(checkBoxContainerDiv, "typeFilterContainer");
                headerDiv.appendChild(checkBoxContainerDiv);

                var showSpan = document.createElement("span");
                showSpan.appendChild(document.createTextNode("Show:"));
                checkBoxContainerDiv.appendChild(showSpan);

                var userStoriesSpan = document.createElement("span");
                userStoriesSpan.id = "userStories";
                checkBoxContainerDiv.appendChild(userStoriesSpan);

                var userStoriesCheckBox = new rally.sdk.ui.basic.Checkbox({
                    showLabel: true,
                    label: "User Stories",
                    labelPosition: "after",
                    value: "HierarchicalRequirement",
                    checked: true
                });
                checkBoxes.push(userStoriesCheckBox);
                userStoriesCheckBox.display(userStoriesSpan);

                var defectsSpan = document.createElement("span");
                defectsSpan.id = "defects";
                checkBoxContainerDiv.appendChild(defectsSpan);

                var defectsCheckBox = new rally.sdk.ui.basic.Checkbox({
                    showLabel: true,
                    label: "Defects",
                    labelPosition: "after",
                    value: "Defect",
                    checked: true
                });
                checkBoxes.push(defectsCheckBox);
                defectsCheckBox.display(defectsSpan);

                var defectSuitesSpan = document.createElement("span");
                defectSuitesSpan.id = "defectSuites";
                checkBoxContainerDiv.appendChild(defectSuitesSpan);

                var defectSuitesCheckBox = new rally.sdk.ui.basic.Checkbox({
                    showLabel: true,
                    label: "Defect Suites",
                    labelPosition: "after",
                    value: "DefectSuite"
                });
                checkBoxes.push(defectSuitesCheckBox);
                defectSuitesCheckBox.display(defectSuitesSpan);

                //Create dropdowns
                var dropdownConfig = {
                    showLabel: true,
                    label: "Release: "
                };
                var dropdownContainerSpan = document.createElement("span");
                dojo.addClass(dropdownContainerSpan, "dropdownContainer");
                headerDiv.appendChild(dropdownContainerSpan);
                releaseDropdown = new rally.sdk.ui.ReleaseDropdown(dropdownConfig, rallyDataSource);
                releaseDropdown.display(dropdownContainerSpan, that._refreshBoard);

                var kanbanBoard = document.createElement("div");
                kanbanBoard.id = "cardBoard";
                dojo.addClass(kanbanBoard, "cardBoard");
                element.appendChild(kanbanBoard);


                //Wire up events
                dojo.forEach(checkBoxes, function (checkBox) {
                    checkBox.addEventListener("onChange", that._refreshBoard);
                });
            };

            this._getColumns = function (callback) {
                var columns = {};
                rally.forEach(sizes, function (label, size) {
                    columns[size] = { displayValue: label };
                });
                callback(columns);
            };

            this._getItems = function (callback) {
                //Build types based on checkbox selections
                var queries = [];
                dojo.forEach(checkBoxes, function (checkBox) {
                    if (checkBox.getChecked()) {
                        var query = new rally.sdk.util.Query("ScheduleState = Defined");
                        if (releaseDropdown.getQueryFromSelected()) {
                            query = query.and(releaseDropdown.getQueryFromSelected());
                        }

                        queries.push({ key: checkBox.getValue(),
                            type: checkBox.getValue(),
                            fetch: "Name,FormattedID,Owner,ObjectID,Rank,PlanEstimate,Children,Ready",
                            query: query,
                            order: "Rank"
                        });
                    }
                });

                function bucketItems(results) {
                    var items = [];
                    rally.forEach(queries, function (query) {
                        if (results[query.key]) {
                            rally.forEach(results[query.key], function (item) {
                                //exclude epic stories since estimates cannot be altered
                                if ((item._type !== 'HierarchicalRequirement') ||
                                        (item._type === 'HierarchicalRequirement' &amp;&amp; item.Children.length === 0)) {
                                    items = items.concat(item);
                                }
                            });
                        }
                    });

                    var columns = dojo.clone(cardboard.getColumns());
                    columns.shift();
                    rally.forEach(items, function (item) {
                        item.RealPlanEstimate = item.PlanEstimate;
                        if (item.PlanEstimate === null || item.PlanEstimate === undefined) {
                            item.PlanEstimate = 0; //Show in not estimated field
                        } else {
                            var bucketed = false;
                            rally.forEach(columns, function (column) {
                                if (!bucketed) {
                                    var columnSize = column.getColumnValue();
                                    if (item.PlanEstimate &lt;= columnSize) {
                                        item.PlanEstimate = columnSize;
                                        bucketed = true;
                                    }
                                }
                            });

                            if (!bucketed) {
                                item.PlanEstimate = columns[columns.length - 1].getColumnValue();
                            }
                        }
                    });
                    callback(items);
                }

                rallyDataSource.findAll(queries, bucketItems);
            };

            this._refreshBoard = function () {
                var cardboardConfig = {
                    types: [],
                    attribute: "PlanEstimate",
                    columns: that._getColumns,
                    maxCardsPerColumn: 200,
                    items: that._getItems,
                    sortAscending: true,
                    order: "Rank"
                };

                //Build types based on checkbox selections
                dojo.forEach(checkBoxes, function (checkBox) {
                    if (checkBox.getChecked()) {
                        cardboardConfig.types.push(checkBox.getValue());
                    }
                });

                if (!cardboard) {
                    if (cardboardConfig.types.length === 0) {
                        checkBoxes[0].setChecked(true);
                        cardboardConfig.types.push(checkBoxes[0].getValue());
                    }
                    cardboard = new rally.sdk.ui.CardBoard(cardboardConfig, rallyDataSource);
                    cardboard.addEventListener("preUpdate", function (c, args) {
                        if (parseInt(args.fieldsToUpdate.PlanEstimate) === 0) {
                            args.fieldsToUpdate.PlanEstimate = null;
                        }
                    });
                    cardboard.display("cardBoard");
                } else {
                    cardboard.refresh(cardboardConfig);
                }
            };

            this.display = function (element) {
                var settingsDialog = new EstimationBoardSettings(rallyDataSource);

                //Build app layout
                this._createLayout(element);
                
            };
        }
        /**
        Copyright (c) 2011  Rally Software Development Corp.  All rights reserved
        */

        EstimationBoardSettings = function (rallyDataSource, sizes, prefs) {
            rally.sdk.ComponentBase.call(this);

            var that = this;
            var accessors = [], deleteLinkConnections = [];
            var dialog, projectPrefRef, sizesObject;
            var validationDiv = dojo.byId("validationErrors");

            that.show = function () {
                if (dialog) {
                    dialog.show();
                }
            };

            that.hide = function () {
                if (dialog) {
                    dialog.hide();
                }
            };

            that._saveComplete = function () {
                window.location.reload();
            };

            that._getValues = function () {
                var values = { fieldInfos: {} };
                rally.forEach(accessors, function (value) {
                    values.fieldInfos[value.field] = value.get();
                });
                return values;
            };

            that._storeValues = function (callback) {
                var pref;

                function errorCallback(results) {
                    rally.Logger.warn(results);
                }

                if (!projectPrefRef) {
                    pref = {
                        Name: "EstimationBoard/Settings",
                        Value: that._getValues(),
                        Project: "/Project/" + rallyDataSource.projectOid
                    };
                    rallyDataSource.preferences.createAppPreference(pref, callback, errorCallback);
                } else {
                    pref = {
                        _ref: projectPrefRef,
                        Value: that._getValues()
                    };
                    rallyDataSource.preferences.update(pref, callback, errorCallback);
                }
            };

            that.validateSizes = function () {
                var validationErrors = [], uniqueEstimates = [], uniqueColumns = [];
                rally.forEach(accessors, function (value) {
                    if (dojo.trim(value.get().label) === "") {
                        var columnError = "Please enter a value for all your column names.";
                        if (validationErrors.indexOf(columnError) === -1) {
                            validationErrors.push(columnError);
                        }
                    }
                    if (uniqueColumns.indexOf(dojo.trim(value.get().label)) === -1) {
                        uniqueColumns.push(dojo.trim(value.get().label));
                    } else {
                        var uniqueColumnError = "Please enter unique values for all your column names.";
                        if (validationErrors.indexOf(uniqueColumnError) === -1) {
                            validationErrors.push(uniqueColumnError);
                        }
                    }
                    if (dojo.trim(value.get().planEstimate) === "" || isNaN(value.get().planEstimate) || value.get().planEstimate &lt; 0) {
                        var planEstimateError = "Please enter a positive number for all your plan estimates.";
                        if (validationErrors.indexOf(planEstimateError) === -1) {
                            validationErrors.push(planEstimateError);
                        }
                    }
                    if (uniqueEstimates.indexOf(dojo.trim(value.get().planEstimate)) === -1) {
                        uniqueEstimates.push(dojo.trim(value.get().planEstimate));
                    } else {
                        var uniqueEstimateError = "Please enter unique numbers for all your plan estimates.";
                        if (validationErrors.indexOf(uniqueEstimateError) === -1) {
                            validationErrors.push(uniqueEstimateError);
                        }
                    }
                });
                if (validationErrors.length &gt; 0) {
                    validationDiv.innerHTML = validationErrors.join("&lt;br/&gt;");
                    dojo.removeClass(validationDiv, "hide");
                }
                return validationErrors.length === 0;
            };

            that._addControlToRow = function (row, divId, control, containerCss) {
                var td = document.createElement("td");
                var div = document.createElement("div");
                dojo.addClass(div, containerCss);
                td.appendChild(div);
                div.id = divId;
                if (divId.search(/deleteLink/) === -1) {
                    control.display(div);
                } else {
                    dojo.place(control, div);
                }
                row.appendChild(td);
            };

            that.deleteTableRow = function (fieldName) {
                dojo.byId(fieldName).parentNode.removeChild(dojo.byId(fieldName));  //remove size's form row
                dojo.forEach(accessors, function (value, i) {
                    if (value &amp;&amp; fieldName === value.field) {
                        accessors.splice(i, 1); //remove size's object from accessors array
                    }
                });
            };

            that._createTableRow = function (size) {
                var fieldName = size.label ? size.label : "new_" + new Date();
                var row = document.createElement("tr");
                row.id = fieldName;

                var labelTextBox = new rally.sdk.ui.basic.TextBox({ rememberValue: false, value: size.label });
                that._addControlToRow(row, fieldName + "-labelTextBox", labelTextBox, "labelTextBoxContainer");

                var isNoPlanEstimateRow = size.planEstimate === 0 || size.planEstimate === "0";
                var planEstimateTextBox = new rally.sdk.ui.basic.TextBox({ rememberValue: false, value: size.planEstimate, readOnly: isNoPlanEstimateRow });
                that._addControlToRow(row, fieldName + "-planEstimateTextBox", planEstimateTextBox, "planEstimateTextBoxContainer");

                if (!isNoPlanEstimateRow) {
                    var deleteLink = "&lt;a href='' id='" + fieldName + "DeleteLink'&gt;Delete&lt;/a&gt;";
                    that._addControlToRow(row, fieldName + "-deleteLink", deleteLink, "deleteLinkContainer");
                }

                var accessor = {
                    field: fieldName,
                    get: function () {
                        var result = {};
                        result.label = labelTextBox.getValue();
                        result.planEstimate = planEstimateTextBox.getValue();
                        return result;
                    },
                    set: function (object) {
                        labelTextBox.setValue(object.label);
                        planEstimateTextBox.setValue(object.planEstimate);
                    }
                };
                accessors.push(accessor);
                return row;
            };

            that.restrictDialogHeight = function () {
                //restrict size of dialog to prevent scrolling issues when a field has A LOT of attributes
                dojo.query(".dijitDialog").forEach(function (node) {
                    dojo.attr(node, "style", {
                        "max-height": "550px",
                        "overflow": "auto"
                    });
                });
            };

            that.displaySaveCancelFeatures = function () {
                var buttonContainer = dojo.query(".buttonContainer")[0];

                var saveButton = new rally.sdk.ui.basic.Button({ text: "Save", value: "Save" });
                saveButton.display(buttonContainer, function () {
                    if (that.validateSizes()) {
                        that._storeValues(that._saveComplete);
                    }
                });

                var cancelLink = "&lt;a href='' id='cancelLink'&gt;Cancel&lt;/a&gt;";
                dojo.place(cancelLink, buttonContainer);
                dojo.connect(dojo.byId('cancelLink'), "onclick", function (event) {
                    dojo.addClass(validationDiv, "hide");
                    dialog.hide();
                    dojo.stopEvent(event);
                });

            };

            that.getValidEvents = function () {
                return { onHide: "onHide" };
            };

            that.displayDialog = function () {
                if (dialog) {
                    return;
                }

                dojo.byId("settingsDialogDiv").style.visibility = "visible";

                dialog = new rally.sdk.ui.basic.Dialog({
                    id: new Date().toString(),
                    title: "Configure Settings for Estimation Board",
                    draggable: false,
                    closable: false,
                    content: dojo.byId("settingsDialogDiv")
                });
                dialog.addEventListener("onHide", function () {
                    that.fireEvent(that.getValidEvents().onHide, {});
                });
                dojo.addClass(validationDiv, "hide");
                dialog.display();
                that.displaySaveCancelFeatures();

                that.restrictDialogHeight();
            };

            that.connectDeleteLinkHandlers = function () {
                dojo.forEach(deleteLinkConnections, dojo.disconnect);
                dojo.forEach(dojo.query(".deleteLinkContainer"), function (deleteContainer) {
                    deleteLinkConnections.push(
                            dojo.connect(deleteContainer.children[0], "onclick", function (event) {
                                var fieldName = event.target.id.replace("DeleteLink", "");
                                that.deleteTableRow(fieldName);
                                dojo.stopEvent(event);
                            })
                    );
                });
                that.displayDialog();
            };

            that.displayUnits = function () {
                function displayRetrievedUnits(results) {
                    if (results &amp;&amp; results.units[0]) {
                        units = results.units[0].IterationEstimateUnitName;
                        dojo.byId("units").innerHTML = "(" + units + ")";
                    }
                    that.connectDeleteLinkHandlers();
                }

                rallyDataSource.find({
                    key: "units",
                    type: "WorkspaceConfiguration",
                    fetch: "IterationEstimateUnitName"
                }, displayRetrievedUnits);
            };

            that.displayAddLink = function () {
                dojo.byId("addLinkCell").innerHTML = "&lt;a href='' id='addLink'&gt;Add &lt;img src='/slm/analytics/images/plus-196b89-gr.png'&gt;&lt;/a&gt;";
                dojo.connect(dojo.byId('addLink'), "onclick", function (event) {
                    if (accessors.length &lt; 12) {
                        var row = that._createTableRow({ label: "", planEstimate: "" });
                        dojo.byId("settingsTableBody").appendChild(row);
                        that.connectDeleteLinkHandlers();
                    } else {
                        validationDiv.innerHTML = "There is a limit of 12 columns.";
                        dojo.removeClass(validationDiv, "hide");
                    }
                    dojo.stopEvent(event);
                });
                that.displayUnits();
            };

            that._setPreferenceValues = function (values) {
                sizesObject = {};
                rally.forEach(values.fieldInfos, function (size) {
                    sizesObject[size.planEstimate] = { label: size.label, planEstimate: size.planEstimate };
                });
            };

            that._setDefaultValues = function () {
                sizesObject = {};
                rally.forEach(sizes, function (sizeValue, sizeKey) {
                    sizesObject[sizeKey] = { label: sizeValue, planEstimate: sizeKey };
                });
            };

            that._retrievePreferences = function (/*function*/callback) {
                var projectPref;
                if (prefs &amp;&amp; prefs.length) {
                    dojo.forEach(prefs, function (p) {
                        if (p.Project) {
                            //projectOid is a string need both strings to compare.
                            var projectRef = rally.sdk.util.Ref.getOidFromRef(p.Project) + "";
                            if (projectRef === rallyDataSource.projectOid) {
                                projectPref = p;
                                projectPrefRef = projectPref._ref;
                            }
                        }
                    });
                    if (projectPref) {
                        that._setPreferenceValues(projectPref.Value);
                        callback({ projectName: projectPref.Project._refObjectName });
                    }
                } else {
                    that._setDefaultValues();
                    callback({});
                }
            };

            that.display = function () {
                function createForm() {
                    accessors = [];

                    rally.forEach(sizesObject, function (size) {
                        var row = that._createTableRow(size);
                        dojo.byId("settingsTableBody").appendChild(row);
                    });

                    that.displayAddLink();
                }
                that._retrievePreferences(createForm);
            };

        };

    &lt;/script&gt;      &lt;script type="text/javascript"&gt;

        var projectOid = '__PROJECT_OID__';
        projectOid = projectOid.indexOf("__") !== -1 ? "723187" : projectOid;

        function onLoad() {
            var rallyDataSource = new rally.sdk.data.RallyDataSource(
                    '__WORKSPACE_OID__',
                    projectOid,
                    '__PROJECT_SCOPING_UP__',
                    '__PROJECT_SCOPING_DOWN__');
            rallyDataSource.projectOid = projectOid;

            var settings, estimationBoard, sizes, prefs;

            //get pref settings exist, use them otherwise use default settings
            function processPref(results) {
                if (results.length) {
                    prefs = results;
                    sizes = {};
                    rally.forEach(results[0].Value.fieldInfos, function (value) {
                        sizes[value.planEstimate] = value.label;
                    });
                } else {
                    sizes = { 0: "Not Estimated",
                        1: "Very Small",
                        2: "Small",
                        3: "Medium",
                        5: "Big",
                        8: "Very Big",
                        13: "Huge"
                    };
                }
                createBoard(sizes);
            }

            rallyDataSource.preferences.getAppPreferences(processPref);

            function settingsShow() {
                if (!settings) {
                    settings = new EstimationBoardSettings(rallyDataSource, sizes, prefs);
                    settings.display();
                } else {
                    settings.show();
                }
            }

            rally.sdk.ui.AppHeader.addPageTool({
                key: "showSettings",
                label: "Settings...",
                onClick: settingsShow
            });

            function createBoard(sizes) {
                estimationBoard = new EstimationBoard(rallyDataSource, settingsShow, sizes);
                estimationBoard.display(dojo.body());
            }

        }

        rally.addOnLoad(onLoad);

    &lt;/script&gt;  &lt;/head&gt; &lt;body&gt;     &lt;div style="display: none"&gt;         &lt;div id="settingsDialogDiv"&gt;             &lt;div id="validationErrors" class="appMessage error"&gt;             &lt;/div&gt;             &lt;table id="settingsTable" cellspacing="7"&gt;                 &lt;tr class="tableHeaderRow"&gt;                     &lt;td id="columnNameTd"&gt;                         Column Name&lt;/td&gt;                     &lt;td id="planEstimateTd"&gt;                         Plan Estimate &lt;span id="units"&gt;&lt;/span&gt;&lt;/td&gt;                 &lt;/tr&gt;                 &lt;tbody id="settingsTableBody"&gt;                 &lt;/tbody&gt;                 &lt;tr&gt;                     &lt;td id="addLinkCell"&gt;                     &lt;/td&gt;                 &lt;/tr&gt;             &lt;/table&gt;         &lt;/div&gt;     &lt;/div&gt; &lt;/body&gt; &lt;/html&gt;  &lt;/textarea&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/BiQH5v7gRlk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/BiQH5v7gRlk/Rally_Custom_App_Release_Estimation_Board.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/11-05-24/Rally_Custom_App_Release_Estimation_Board.aspx</comments>
      <guid isPermaLink="false">86130db8-db12-42bd-8ef8-54815fdae18c</guid>
      <pubDate>Wed, 25 May 2011 01:28:32 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/11-05-24/Rally_Custom_App_Release_Estimation_Board.aspx</feedburner:origLink></item>
    <item>
      <title>Sonos Review</title>
      <description>&lt;p&gt;Since the turn of the century I have been looking for a music system that was an easy to use mutli room audio system.&amp;#160; Is Sonos the answer?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Well, yes and no depending on your setup.&amp;#160; Here are some simple things you need to know.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;- UPnP must be support by your router&lt;/li&gt; &lt;/ul&gt;  &lt;ol&gt;   &lt;li&gt;- A 2.4 GHz Network is required (or at least I could not get it to work on my 5 GHz network)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I’m sure many of you meet these requirements but I did not and it took me a some time to come up with a solution.&amp;#160; First off I run a business class network on a Cisco ASA 5505 security appliance which it turns out does not support UPnP.&amp;#160; So I could either ditch the Cisco ASA or bring up another network router that supports UPnP.&amp;#160; I opted to ditch Cisco, it has been a love/hate relationship with the ASA and I decided to just use the E3000 router instead which supports UPnP.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Next when I tried to use the Sonos controller on my iPad 2 it could not find the Sonos Bridge but when I used my iPhone 3GS it worked great.&amp;#160; The difference, one uses the 2.4 GHz network and one uses the 5GHz network.&amp;#160; Once I switched the iPad 2 to use the 2.4 GHz network it worked like a charm. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I really am sideways about Cisco not support UPnP as there are plenty of small business that use an ASA security appliance and want to have music in their waiting room or somewhere else.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now that things are setup it works great!&amp;#160; I’m loving the Sonos but when will Cisco support UPnP on the ASA security appliance so I can use it again… or maybe I will end up switching to another router that supports multiple public ip’s and UPnP. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/z8lYqxembnw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/z8lYqxembnw/Sonos_Review.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/11-05-09/Sonos_Review.aspx</comments>
      <guid isPermaLink="false">c89d9ef9-344e-4416-9150-88744d1c126b</guid>
      <pubDate>Tue, 10 May 2011 00:50:57 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/11-05-09/Sonos_Review.aspx</feedburner:origLink></item>
    <item>
      <title>Sitefinity 4.0 Migration&amp;ndash;Blog Posts</title>
      <description>&lt;p&gt;Anyone who has migrated from Sitefinity 3.7 to 4.0 and have had a blog has quickly realized all the post dates are wrong.&amp;#160; The correct dates are in the database but they are not the published dates you are seeing.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I wrote a quick sql script to correct this.&amp;#160; Run the script after publishing the posts to update the date to the date that should be displayed.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;create table #temp    &lt;br /&gt;(     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; content_id uniqueidentifier,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; publication_date datetime     &lt;br /&gt;)&lt;/p&gt;  &lt;p&gt;insert into #temp    &lt;br /&gt;SELECT content_id, publication_date     &lt;br /&gt;FROM sf_blog_posts     &lt;br /&gt;WHERE content_state = 'PUBLISHED'&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;UPDATE sf_blog_posts    &lt;br /&gt;SET publication_date = #temp.publication_date     &lt;br /&gt;FROM sf_blog_posts     &lt;br /&gt;INNER JOIN #temp     &lt;br /&gt;ON #temp.content_id = sf_blog_posts.original_content_id     &lt;br /&gt;WHERE sf_blog_posts.original_content_id = #temp.content_id&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;drop table #temp&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/JEHppQsGm5g" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/JEHppQsGm5g/Sitefinity_4_0_Migration_ndash_Blog_Posts.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/11-03-02/Sitefinity_4_0_Migration_ndash_Blog_Posts.aspx</comments>
      <guid isPermaLink="false">4edb0231-1443-430b-907a-fa22c10e607a</guid>
      <pubDate>Wed, 02 Mar 2011 22:57:41 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/11-03-02/Sitefinity_4_0_Migration_ndash_Blog_Posts.aspx</feedburner:origLink></item>
    <item>
      <title>Sitefinity 4.0, What did Telerik Do?</title>
      <description>&lt;p&gt;At first I was very excited to move from Sitefinity 3.7 to 4.0 but…&amp;#160; After going through the migration process using the less than exceptional codeplex migration project I started to realize this was not a fully baked product.&amp;#160; The migration process feels like a complete afterthought, case and point the blog posts post dates are not migrated correctly (the real issue is with there api for the blog, follow-up post to follow).&amp;#160; All 3.7 sitefinity images do not work, could be a hassle for sites with large number of pages with sitefinity images on them.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I feel like Sitefinity team has forgotten about their current customers.&amp;#160; Like many current Sitefinity customers there is a fair amount of custom coded widgets and navigation that were created in 3.7 because it was just so easy to extend.&amp;#160; In 4.0 nothing works because 4.0 is a new version 1 product.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Where did they go wrong?&amp;#160; &lt;/p&gt;  &lt;p&gt;First off they need more custom code examples.&amp;#160; This was fantastic in 3.7, all the Sitefinity team had to do is look at what guidance already existed for 3.7 and create it for 4.0.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The left out what I consider foundational functionality such as having pages be defined as links to another page either internally or externally.&amp;#160; Another biggie is not shipping a Lists module, this is a basic construct that humans have used since caveman days and there is even a computer language based on this (lisp).&amp;#160; So why have cavemen figured out how important lists are but the Sitefinity team was quick to dismiss it from there 4.0 initial delivery, there is a big lesson learned here that I hope they take the opportunity to realize.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;This is for the Sitefinity team&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;A product is more than what's gets shipped.&amp;#160; The guidance, sales, marketing, branding, customer support, etc. are all part of successfully shipping a product.&amp;#160; In short this product was shipped 3-6 months too early and I’m sure your customer service team is paying the price for it now. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/H6Kp-ZeNSfc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/H6Kp-ZeNSfc/Sitefinity_4_0_What_did_Telerik_Do.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/11-02-27/Sitefinity_4_0_What_did_Telerik_Do.aspx</comments>
      <guid isPermaLink="false">78fb5d90-411b-4fb7-aa26-593d2dfcc744</guid>
      <pubDate>Mon, 28 Feb 2011 03:21:32 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/11-02-27/Sitefinity_4_0_What_did_Telerik_Do.aspx</feedburner:origLink></item>
    <item>
      <title>Daily Telerik WTF</title>
      <description>&lt;p&gt;- User Submit bug/question to Telerik Sitefinity group&lt;/p&gt;  &lt;p&gt;- User receives answer that does not address the question but does elude to an existing ticket number&lt;/p&gt;  &lt;p&gt;- User receives response from support saying “Like I said look at ticket number ######”&lt;/p&gt;  &lt;p&gt;- User Responds: OK, where do I find ticket number #####&lt;/p&gt;  &lt;p&gt;- Support Responds:&amp;#160; &lt;strong&gt;Tickets are internal only&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/t9gm1XWuAuo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/t9gm1XWuAuo/Daily_Telerik_WTF.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/11-02-23/Daily_Telerik_WTF.aspx</comments>
      <guid isPermaLink="false">b8e02bb5-44ae-4e41-af20-993da3d92685</guid>
      <pubDate>Wed, 23 Feb 2011 20:24:36 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/11-02-23/Daily_Telerik_WTF.aspx</feedburner:origLink></item>
    <item>
      <title>The Power of Humility</title>
      <description>&lt;p&gt;Adding a little bit of humility to ones character can go a long way to enhance your personal power.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A great example of this is &lt;a href="http://www.mackeyscomebackkennel.com/" target="_blank"&gt;Lance Mackey&lt;/a&gt;, his humility makes him very likeable and it strengthens his personal power as shown in the 2008 Iditarod when he snuck out ahead of Jeff King while he was sleeping.&amp;#160; No one woke Jeff King because of Lance Mackey’s person power.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The opposite is the case with Jeff King.&amp;#160; He says things like, “I’m the guy people wish they could be” which definitely lowers his personal power and instead of humility he shows arrogance.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/48lpZCci3cA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/48lpZCci3cA/The_Power_of_Humility.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/11-01-12/The_Power_of_Humility.aspx</comments>
      <guid isPermaLink="false">1d28db5f-fdf5-4456-acc5-55fd7eee1cbf</guid>
      <pubDate>Thu, 13 Jan 2011 03:42:49 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/11-01-12/The_Power_of_Humility.aspx</feedburner:origLink></item>
    <item>
      <title>Remote Desktop and Local Resources</title>
      <description>&lt;p&gt;Learned a valuable lesson the other day.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;:&amp;#160; Copy/Paste on a remote server was extremely slow.&amp;#160; So slow it took 45 minutes to copy and paste 50 MB from one folder to another on the same server and same drive.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Problem and Solution&lt;/strong&gt;:&amp;#160; In my connection profile for that server I had my C: drive checked as a local resource.&amp;#160; I did not even remember doing this.&amp;#160; Well even though I was &lt;strong&gt;not&lt;/strong&gt; copying/pasting anything from my local computer it was routing the operation through my remote connection.&amp;#160; Once I unchecked the C: from the local resource it was lightening fast again.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/0ZPaP_I3JNw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/0ZPaP_I3JNw/Remote_Desktop_and_Local_Resources.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/10-09-16/Remote_Desktop_and_Local_Resources.aspx</comments>
      <guid isPermaLink="false">63edffd2-814c-4b95-ad2f-6a83c871595f</guid>
      <pubDate>Thu, 16 Sep 2010 20:42:08 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/10-09-16/Remote_Desktop_and_Local_Resources.aspx</feedburner:origLink></item>
    <item>
      <title>SQL Server 2008 R2 is Getting More Useful</title>
      <description>&lt;p&gt;Good News, &lt;a href="http://www.microsoft.com/express/database/" target="_blank"&gt;SQL Server 2008 R2&lt;/a&gt; supports database sizes up to 10GB!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/yy1_davBK84" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/yy1_davBK84/SQL_Server_2008_R2_is_Getting_More_Useful.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/10-09-13/SQL_Server_2008_R2_is_Getting_More_Useful.aspx</comments>
      <guid isPermaLink="false">fe42800a-c32b-4ccc-907c-f860b7f5e55b</guid>
      <pubDate>Mon, 13 Sep 2010 21:49:53 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/10-09-13/SQL_Server_2008_R2_is_Getting_More_Useful.aspx</feedburner:origLink></item>
    <item>
      <title>Stop the Chaos: The Gold Build</title>
      <description>&lt;p&gt;Delivering great software is not a race to the finish line (by finish line I mean deployment to production).&amp;#160; Instead mark your acceptable builds as Gold Builds and when the business is ready to have it deployed, deploy the latest gold build.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There will always be a push to get more done with less.&amp;#160; Using gold builds will alleviate the stress of trying to hit a deadline and having the go no go call the day before go live.&amp;#160; Another very important side effect of managing builds and deployment this way is the number of bugs released into production goes down.&amp;#160; Most likely this is due to the decrease in stress and increase in time to make sure the pinned gold build is truly the one to go live.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Sounds easy but it is hard because setting the expectations with the business, sales, marketing even IT can be hard if the expectations are left uncontrolled.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ClydesdaleSoftwareBlog/~4/I7tTrfIwi4s" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ClydesdaleSoftwareBlog/~3/I7tTrfIwi4s/Stop_the_Chaos_The_Gold_Build.aspx</link>
      <author>Clydesdale Software</author>
      <comments>http://www.clydesdalesoftware.com/Blog/10-08-03/Stop_the_Chaos_The_Gold_Build.aspx</comments>
      <guid isPermaLink="false">3c0cddcf-62e7-4bb0-87f2-97c1126253ad</guid>
      <pubDate>Tue, 03 Aug 2010 22:53:01 GMT</pubDate>
    <feedburner:origLink>http://www.clydesdalesoftware.com/Blog/10-08-03/Stop_the_Chaos_The_Gold_Build.aspx</feedburner:origLink></item>
  </channel>
</rss>

