<?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://rss.joshholmes.com/~d/styles/itemcontent.css"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Josh Holmes</title><link>http://www.joshholmes.com/blog/</link><description>What Box? Nobody told me about a box...</description><language>en-us</language><copyright>Josh Holmes</copyright><lastBuildDate>Wed, 10 Feb 2010 03:17:25 GMT</lastBuildDate><generator>newtelligence dasBlog 2.3.9074.18820</generator><managingEditor>josh@joshholmes.com</managingEditor><webMaster>josh@joshholmes.com</webMaster><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://rss.joshholmes.com/JoshHolmes" /><feedburner:info uri="joshholmes" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><geo:lat>42.14784</geo:lat><geo:long>-84.031232</geo:long><feedburner:emailServiceId>JoshHolmes</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=9982ec05-59ea-4d01-b20c-254288d2a23d</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,9982ec05-59ea-4d01-b20c-254288d2a23d.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,9982ec05-59ea-4d01-b20c-254288d2a23d.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=9982ec05-59ea-4d01-b20c-254288d2a23d</wfw:commentRss><title>Hello World Azure in PHP</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,9982ec05-59ea-4d01-b20c-254288d2a23d.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/4TRKXhRH07g/HelloWorldAzureInPHP.aspx</link><pubDate>Wed, 10 Feb 2010 03:17:25 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;img style="margin: 5px; display: inline" align="left" src="http://farm4.static.flickr.com/3604/3411273755_3acce33c69.jpg" width="338" height="254"&gt;&lt;/img&gt;Building&#xD;
on the &lt;a href="http://www.joshholmes.com/blog/2010/02/05/WindowsAzureCommandLineTools.aspx"&gt;Windows&#xD;
Azure Command Line Tools&lt;/a&gt; blog post, I thought we could kick it up a notch and&#xD;
get PHP running in Azure leveraging the command line tools. The primary thing that&#xD;
we need to do is to copy the PHP bits up with the rest of your deployment and configure&#xD;
the FastCGI handler to know where the PHP interpreter can be found. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
If you have PHP installed, locate your directory. Otherwise, download one of the versions&#xD;
from &lt;a title="http://windows.php.net/download/" href="http://windows.php.net/download/"&gt;http://windows.php.net/download/&lt;/a&gt;.&#xD;
I haven’t personally tested it with every possibly distribution but it should work&#xD;
with all of them up there. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
To get started, setup a simple folder structure as before but with the addition of&#xD;
a folder called PHP:&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&amp;gt;Project&lt;br&gt;&#xD;
        &amp;gt;WebRole&lt;br&gt;&#xD;
                &#xD;
&amp;gt;php&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Now copy the contents of the PHP download or your PHP install to the php folder. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Now add a file called index.php to the WebRole directory:&#xD;
&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Hello&#xD;
World PHP&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;php &lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://www.php.net/echo"&gt;echo&lt;/a&gt; '&lt;span style="color: #8b0000"&gt;Today&#xD;
is &lt;/span&gt;'. &lt;a style="color: #ffa500" href="http://www.php.net/date"&gt;date&lt;/a&gt;('&lt;span style="color: #8b0000"&gt;Y-m-d&lt;/span&gt;')&#xD;
."&lt;span style="color: #8b0000"&gt;\n&lt;/span&gt;"; &lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
The one other actual difference between the HTML version and the PHP version of this&#xD;
little hello world sample is that you need to add one more file to the WebRole directory&#xD;
called web.roleconfig. &#xD;
&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml&#xD;
version="1.0" encoding="utf-8" &lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.webServer&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fastCgi&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;application&lt;/span&gt;&lt;span style="color: #ff0000"&gt;fullPath&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"%RoleRoot%\approot\php\php-cgi.exe"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fastCgi&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.webServer&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
On your own IIS server you would call this the web.config but in Azure, it’s called&#xD;
the web.roleconfig. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Now, just like in the other sample you need to set up your Config and Definition files. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Simple.csdef&#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml&#xD;
version="1.0" encoding="utf-8"&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceDefinition&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Simple"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;WebRole&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"WebRole"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;enableNativeCodeExecution&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;InputEndpoints&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;&amp;lt;!--&#xD;
Must use port 80 for http and port 443 for https when running in the cloud --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;InputEndpoint&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"HttpIn"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;protocol&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;port&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"80"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;InputEndpoints&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;WebRole&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
Simple.cscfg&#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml&#xD;
version="1.0"&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceConfiguration&lt;/span&gt;&lt;span style="color: #ff0000"&gt;serviceName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Simple"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Role&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"WebRole"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Instances&lt;/span&gt;&lt;span style="color: #ff0000"&gt;count&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Role&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceConfiguration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
Package everything up with cspack.&#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;c:\Project&amp;gt;cspack simple.csdef /copyonly&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Windows(R) Azure(TM) Packaging Tool version 1.0.0.0&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;for Microsoft(R) .NET Framework 3.5&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Copyright (c) Microsoft Corporation. All rights reserved.&#xD;
&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
And run in the dev fabric with csrun. &#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;c:\Project&amp;gt;csrun simple.csx simple.cscfg&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Windows(R) Azure(TM) Desktop Execution Tool version 1.0.0.0&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;for Microsoft(R) .NET Framework 3.5&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Copyright (c) Microsoft Corporation. All rights reserved.&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Using session id 1&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Created deployment(31)&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Started deployment(31)&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Deployment input endpoint HttpIn of role WebRole at http://127.0.0.1:82/&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
Now you are ready to run and test&#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/HelloWorldAzureinPHP_12733/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/HelloWorldAzureinPHP_12733/image_thumb.png" width="486" height="275"&gt;&lt;/img&gt;&lt;/a&gt; &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
And that’s all that there really is to getting PHP running in Azure. Soon I’ll blog&#xD;
about getting a full blown app running in Azure. Stay tuned. &#xD;
&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=9982ec05-59ea-4d01-b20c-254288d2a23d"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4TRKXhRH07g:e14O8eSXF8U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4TRKXhRH07g:e14O8eSXF8U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=4TRKXhRH07g:e14O8eSXF8U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4TRKXhRH07g:e14O8eSXF8U:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=4TRKXhRH07g:e14O8eSXF8U:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4TRKXhRH07g:e14O8eSXF8U:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4TRKXhRH07g:e14O8eSXF8U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=4TRKXhRH07g:e14O8eSXF8U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/4TRKXhRH07g" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,9982ec05-59ea-4d01-b20c-254288d2a23d.aspx</comments><feedburner:origLink>http://www.joshholmes.com/blog/2010/02/10/HelloWorldAzureInPHP.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=dc78ae59-cf21-435f-b33a-c00d40f1f736</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,dc78ae59-cf21-435f-b33a-c00d40f1f736.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,dc78ae59-cf21-435f-b33a-c00d40f1f736.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=dc78ae59-cf21-435f-b33a-c00d40f1f736</wfw:commentRss><title>Getting MySql Running on Azure</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,dc78ae59-cf21-435f-b33a-c00d40f1f736.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/_f4OXXP0Prk/GettingMySqlRunningOnAzure.aspx</link><pubDate>Tue, 09 Feb 2010 04:29:39 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;a href="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/RunningJoomlaonAzure_BFDC/azure%5B1%5D_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 5px; display: inline; border-top: 0px; border-right: 0px" title="azure[1]" border="0" alt="azure[1]" align="left" src="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/RunningJoomlaonAzure_BFDC/azure%5B1%5D_thumb.png" width="244" height="244"&gt;&lt;/img&gt;&lt;/a&gt; There&#xD;
are a few applications that I’m playing with in Windows Azure that are reliant on&#xD;
MySql for various reason. For example, I’m working with a group that is doing Joomla&#xD;
development and it’s completely dependent on MySql. Mostly this is due to using MySql&#xD;
native drivers rather than using a database independent layer such as ADO.NET in .NET&#xD;
or PDO in PHP or leveraging database specific features that are only found in MySql.&#xD;
Regardless of the reason, for me to run these applications in Windows Azure, I have&#xD;
to get MySql running in Azure. I found that it wasn’t as hard as I initially thought&#xD;
it would be and it’s a technique that I can reuse for a lot of binary executables. &#xD;
&lt;/p&gt;&lt;h4&gt;Thoughts and Recommendations&#xD;
&lt;/h4&gt;&lt;p&gt;&#xD;
Before I go into the technical details of getting MySql working, I thought I should&#xD;
share what I think of running MySql in Windows Azure to save you the time of reading&#xD;
through all of this before I try to talk you out of it. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
The reality is that even though you can run MySql in Windows Azure, it’s not overly&#xD;
practical to do so. My recommendation is to use this as a last resort or stopgap until&#xD;
Sql Server support for your application is ready to go. There are multiple reasons&#xD;
why this is my recommendation, some technical, some financial. None of them have to&#xD;
do with MySql itself but rather the process that you have to go through to run and&#xD;
manage it in Windows Azure. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
First, let’s dig into the technical. The way that hosting MySql in Windows Azure working&#xD;
is that you create a worker role that will actually host the binary. You have to copy&#xD;
up the executable and then have just a little bit of Windows Azure specific code to&#xD;
actually execute the application and pipe requests to it. You can actually do that&#xD;
with just about any type of executable as long as it can be XCopy deployed and run&#xD;
headless. This could be especially good for things like doing distributed calculations. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
With regards to mySql, however, one issue that I see with this is that you have to&#xD;
pay $0.12 an hour per web role that you have live which means that on average (at&#xD;
0.12 * 24 * 30) you’re paying $86.40 a month for a single instance of MySql. That’s&#xD;
prior to having any type of failover or durability. SqlAzure is only $9.99 a month&#xD;
for a gig of storage. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
If you want failover and durability, you need to run at least one extra instance of&#xD;
MySql in another worker role and configure them in a master/slave configuration. The&#xD;
reality is that you can get some fairly high durability with this configuration and&#xD;
it’s out of the box part of the &lt;a href="http://code.msdn.microsoft.com/winazuremysqlphp"&gt;Windows&#xD;
Azure MySQL PHP Solution Accelerator&lt;/a&gt; that we’re going to download in a moment. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Now, if you want to manage the MySql instances, you’ve got a couple of options. One&#xD;
of those is to run PHPMyAdmin which runs in a web role. Or you can connect to your&#xD;
MySql databases with a remote admin tool of some sort. Contrast that to being able&#xD;
to log into the Windows Azure admin page and administer your SQL Azure databases. &#xD;
&lt;/p&gt;&lt;h4&gt;Getting MySql Running on Azure&#xD;
&lt;/h4&gt;&lt;p&gt;&#xD;
Now that I’ve convinced you not to do this unless you absolutely have to, let’s dig&#xD;
into the technical steps of getting MySql running. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
There’s a PDC talk that covers some of this material at &lt;a href="http://microsoftpdc.com/Sessions/SVC51"&gt;Developing&#xD;
PHP and MySQL Applications with Windows Azure&lt;/a&gt;.. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
First, I wanted to get MySql running in Windows Azure. &#xD;
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&#xD;
First, I downloaded the &lt;a href="http://code.msdn.microsoft.com/winazuremysqlphp"&gt;Windows&#xD;
Azure MySQL PHP Solution Accelerator&lt;/a&gt;. There’s a manual for that accelerator that&#xD;
lays out the rest of the requirements for getting MySql running in Windows Azure. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
The first requirement is MySql itself. I downloaded the XCopy deploy version of MySQL&#xD;
(&lt;a href="http://dev.mysql.com/downloads/mysql/5.1.html#winx64"&gt;http://dev.mysql.com/downloads/mysql/5.1.html#winx64&lt;/a&gt;). &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Next, since we are going to use PHPMyAdmin to administer the MySql databases, I downloaded&#xD;
PHP - &lt;a title="http://windows.php.net/download" href="http://windows.php.net/download"&gt;http://windows.php.net/download&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&#xD;
And then, obviously, PHPMyAdmin - &lt;a title="http://www.phpmyadmin.net/home_page/downloads.php" href="http://www.phpmyadmin.net/home_page/downloads.php"&gt;http://www.phpmyadmin.net/home_page/downloads.php&lt;/a&gt;. &#xD;
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&#xD;
Now that I had the basic requirements down for MySql running in Azure, there are a&#xD;
couple of steps that I had to take. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
First, I installed the &lt;a href="http://code.msdn.microsoft.com/winazuremysqlphp"&gt;Windows&#xD;
Azure MySQL PHP Solution Accelerator&lt;/a&gt; and extracted MySql, PHP and PHPMyAdmin. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Then I ran the “Buildme.cmd” script that comes with the accelerator. That checked&#xD;
to see if the MySQL binaries were in the right place. Since I hadn’t done anything&#xD;
other than download and unzip MySQL, the Buildme.cmd script fixed that for me and&#xD;
copied them to the right directory (.\MySql_WorkerRole\mysql). BTW, this could take&#xD;
a little while. Then it asked me for the &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Next thing is to open up the .\, I renamed php.ini-recommended to be php.ini and did&#xD;
a few edits. &#xD;
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&#xD;
Change the extension_dir to be as follow: &#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
extension_dir = "./ext"&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&#xD;
Uncomment (remove the ; from in front of the following: &#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
extension=php_mbstring.dll &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
extension=php_mcrypt.dll &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
extension=php_mysql.dll&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&#xD;
Second, I extracted PHPMyAdmin to a holding directory and made a few edits to /libraries/config.default.php. &#xD;
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&#xD;
Search for 'auth_type’ and ensure that it’s as follow: &#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
$cfg['Servers'][$i]['auth_type'] = 'cookie';&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&#xD;
Search for 'AllowArbitraryServer' and ensure that it’s as follows: &#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
$cfg['AllowArbitraryServer'] = true;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&#xD;
Now that those edits are done we are almost ready to try running the MySql portion&#xD;
of this exercise in the DevFabric.  Last this is that I *highly* recommend changing&#xD;
the username/password from mysqluser/#ms123 to something else. Now we’re ready to&#xD;
test. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Before we do that, let’s take a quick peek at what the solution accelerator comes&#xD;
with. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
First, there are 4 projects that are (or at least can be) deployed and a couple of&#xD;
helper folders. &#xD;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&#xD;
MySql_WorkerRole – this is the primary application that we’re concerned about as it&#xD;
is the one that deploys MySql for us. &#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
MySqlPHP – Windows Azure configuration bits for the projects&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&#xD;
PHPMyAdminWebRole – this role packages up PHPMyAdmin and runs it in Azure. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
InstanceManagerClient – this is an admin application that you can use to get command&#xD;
line access to the worker roles running MySql. This can be very useful for a lot of&#xD;
reasons. It connects to the InstanceManagerServer &#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
InstanceManagerServer – this runs in each of the MySql_WorkerRole instances listening&#xD;
for connections from the InstanceManagerClient. &#xD;
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&#xD;
WorkerRole – Logging and maintenance worker role &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Roles.Common – helper project &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Test.Common – test project&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&#xD;
Really, for this exercise we just care about the top three of those projects. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
In the config project is the ServiceConfiguration.cscfg which has a worker role configured&#xD;
for MySql:&#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml&#xD;
version="1.0"&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceConfiguration&lt;/span&gt; .&#xD;
. .&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Role&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"MySql_WorkerRole"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Instances&lt;/span&gt;&lt;span style="color: #ff0000"&gt;count&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"3"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;&amp;lt;!--&amp;lt;Setting&#xD;
name="DataConnectionString" value="UseDevelopmentStorage=true" /&amp;gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"TableStorageEndpoint"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://table.core.windows.net"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"BlobStorageEndpoint"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://blob.core.windows.net"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"DataConnectionString"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"DefaultEndpointsProtocol=https;AccountName=azuresolaccstorage;AccountKey=yQai0qLjF7lUTPy3pcf+j2xyjAKQnf7nCv2IYMIPPBWsqkGiOZqD/KMb9aolc9/kh41pm6XB5Zt0boBje7MXlg=="&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"DiagnosticsConnectionString"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"DefaultEndpointsProtocol=https;AccountName=azuresolaccstorage;AccountKey=yQai0qLjF7lUTPy3pcf+j2xyjAKQnf7nCv2IYMIPPBWsqkGiOZqD/KMb9aolc9/kh41pm6XB5Zt0boBje7MXlg=="&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ContainerName"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"mysqlphp11"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"FullBackupHour"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"06:00"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"IncrementalBackupDuration"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"10"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"RecycleThreadSleepTime"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"300"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"EnableWindowsAzureDrive"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"False"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setting&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"EnableBackup"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"True"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Role&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;. . .&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceConfiguration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
Here’s where you configure if you want to use more than one instance (for failover&#xD;
and the like) and whether or not you want to actually write out to blob storage and&#xD;
all. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
The second thing is a MySql_WorkerRole project. This is a C# project that does a little&#xD;
bit of very important work for us. To sum up, it copies the MySql bits out to Windows&#xD;
Azure, starts the process running and then monitors the health of the MySql server. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
All we have to do now is deploy. To do that, run the Runme.cmd. This will package&#xD;
things up, copy them out to the development fabric, starts the various roles and then&#xD;
launches the browser. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Side note on the development experience - I’ll also warn you now that playing with&#xD;
the firewall on your dev box is a little tricky because every time that you redeploy&#xD;
it creates a new package and copies the MySql executables to a new location. That&#xD;
means that you pretty much have to open a incoming port rather than just authorizing&#xD;
the program unless you want to reauthorize the with your firewall every time. &#xD;
&lt;/p&gt;&lt;h4&gt;Conclusions&#xD;
&lt;/h4&gt;&lt;p&gt;&#xD;
Although I recommend using MySql on Windows Azure for stopgap and last resort, the&#xD;
awesome news is that with the &lt;a href="http://code.msdn.microsoft.com/winazuremysqlphp"&gt;Windows&#xD;
Azure MySQL PHP Solution Accelerator&lt;/a&gt; it’s actually not that hard to setup and&#xD;
works pretty well. &#xD;
&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=dc78ae59-cf21-435f-b33a-c00d40f1f736"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=_f4OXXP0Prk:tjIHqnUjlcg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=_f4OXXP0Prk:tjIHqnUjlcg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=_f4OXXP0Prk:tjIHqnUjlcg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=_f4OXXP0Prk:tjIHqnUjlcg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=_f4OXXP0Prk:tjIHqnUjlcg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=_f4OXXP0Prk:tjIHqnUjlcg:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=_f4OXXP0Prk:tjIHqnUjlcg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=_f4OXXP0Prk:tjIHqnUjlcg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/_f4OXXP0Prk" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,dc78ae59-cf21-435f-b33a-c00d40f1f736.aspx</comments><feedburner:origLink>http://www.joshholmes.com/blog/2010/02/09/GettingMySqlRunningOnAzure.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=83fc8372-60a0-45fb-8272-288359b723ba</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,83fc8372-60a0-45fb-8272-288359b723ba.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,83fc8372-60a0-45fb-8272-288359b723ba.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=83fc8372-60a0-45fb-8272-288359b723ba</wfw:commentRss><title>Windows Azure Command Line Tools</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,83fc8372-60a0-45fb-8272-288359b723ba.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/bza2SA_FCEs/WindowsAzureCommandLineTools.aspx</link><pubDate>Fri, 05 Feb 2010 22:19:41 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;a title="Josh Holmes - Erubycon 2009 - Day 2" href="http://www.flickr.com/photos/40542539@N00/3801953073/"&gt;&lt;img class="flickr" border="0" hspace="5" alt="Josh Holmes - Erubycon 2009 - Day 2" vspace="5" align="left" src="http://static.flickr.com/3550/3801953073_26cb3d66e6_m.jpg"&gt;&lt;/img&gt;&lt;/a&gt;There&#xD;
are times that you just need to leverage the raw power that you can get from the command&#xD;
line. For example, if you are trying to script something or if you are on a machine&#xD;
that is not all tooled up with Visual Studio, Eclipse and the like and, believe it&#xD;
or not, there are times that it’s just a lot easier to get stuff done without an IDE&#xD;
in the way. Great news is that we’ve got a couple in the Windows Azure SDK called&#xD;
CSPack and CSRun that work wonders. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
To that end, please enjoy this little tutorial on using the command line tools to&#xD;
create a very simple Azure package and deploying it up to the development fabric. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Before you even start you will need one of the Windows Azure SDKs installed. I’m testing&#xD;
this with the November 1.0 release. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
First, create a directory where you will place your project. In that directory, create&#xD;
a directory called WebRole. At this point you will have&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&amp;gt;Project&lt;br&gt;&#xD;
      &amp;gt;WebRole&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
In the WebRole directory, place the files that you want to be deployed with your Windows&#xD;
Azure package. For mine, I just created a very simple HTML file that looks as follows:&#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Quick&#xD;
Sample&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;This a quick sample. &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;img&lt;/span&gt;&lt;span style="color: #ff0000"&gt;alt&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Sample&#xD;
Photo"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;src&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"photo.jpg"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
In the root folder for your project, there are two files that you need to create.&#xD;
The first file is is the definition file. I called mine simple.csdef:&#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml&#xD;
version="1.0" encoding="utf-8"&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceDefinition&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Simple"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;WebRole&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"WebRole"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;enableNativeCodeExecution&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;InputEndpoints&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #008000"&gt;&amp;lt;!--&#xD;
Must use port 80 for http and port 443 for https when running in the cloud --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;InputEndpoint&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"HttpIn"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;protocol&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;port&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"80"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;InputEndpoints&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;WebRole&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceDefinition&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
The second file is the configuration file. Mine is called simple.cscfg:&#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml&#xD;
version="1.0"&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceConfiguration&lt;/span&gt;&lt;span style="color: #ff0000"&gt;serviceName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Simple"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Role&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"WebRole"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Instances&lt;/span&gt;&lt;span style="color: #ff0000"&gt;count&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ConfigurationSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Role&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ServiceConfiguration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
Now we are ready to start using the command line tools. The first one is called &lt;a href="http://msdn.microsoft.com/en-us/library/dd179470.aspx"&gt;CSPack&lt;/a&gt;.&#xD;
What this tool does is create a deployment package for you. &#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;c:\Project&amp;gt;cspack simple.csdef /copyonly&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Windows(R) Azure(TM) Packaging Tool version 1.0.0.0&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;for Microsoft(R) .NET Framework 3.5&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Copyright (c) Microsoft Corporation. All rights reserved.&#xD;
&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
If you look in your directory structure now, you’ll see a new folder called simple.csx.&#xD;
Check it out and you’ll see that what it’s done is create a very specific folder structure&#xD;
ready to deploy out to the dev fabric. This is done with the /copyonly option. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
The next tool is the &lt;a href="http://msdn.microsoft.com/en-us/library/dd179412.aspx"&gt;CSRun&lt;/a&gt; tool.&#xD;
This does the actual deployment out to the dev fabric and can even, if you so choose,&#xD;
launch the browser for you. You need to pass it the name of the ready to deploy directory&#xD;
that the CSPack tool created and the name of the service configuration file. &#xD;
&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;c:\Project&amp;gt;csrun simple.csx simple.cscfg&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Windows(R) Azure(TM) Desktop Execution Tool version 1.0.0.0&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;for Microsoft(R) .NET Framework 3.5&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Copyright (c) Microsoft Corporation. All rights reserved.&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Using session id 1&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Created deployment(31)&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Started deployment(31)&#xD;
&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;Deployment input endpoint HttpIn of role WebRole at http://127.0.0.1:82/&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
Now you are ready to run and test&#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/WindowsAzureSDKCommandLineTools_EC52/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/WindowsAzureSDKCommandLineTools_EC52/image_thumb.png" width="244" height="181"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&#xD;
To find out more about these tools read &lt;a href="http://msdn.microsoft.com/en-us/library/dd179345.aspx"&gt;Windows&#xD;
Azure SDK Tools Reference&lt;/a&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=83fc8372-60a0-45fb-8272-288359b723ba"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=bza2SA_FCEs:d2FBg_WEt3I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=bza2SA_FCEs:d2FBg_WEt3I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=bza2SA_FCEs:d2FBg_WEt3I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=bza2SA_FCEs:d2FBg_WEt3I:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=bza2SA_FCEs:d2FBg_WEt3I:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=bza2SA_FCEs:d2FBg_WEt3I:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=bza2SA_FCEs:d2FBg_WEt3I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=bza2SA_FCEs:d2FBg_WEt3I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/bza2SA_FCEs" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,83fc8372-60a0-45fb-8272-288359b723ba.aspx</comments><feedburner:origLink>http://www.joshholmes.com/blog/2010/02/05/WindowsAzureCommandLineTools.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=779cb918-cabb-4df7-9493-caaa2a71aaa3</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,779cb918-cabb-4df7-9493-caaa2a71aaa3.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,779cb918-cabb-4df7-9493-caaa2a71aaa3.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=779cb918-cabb-4df7-9493-caaa2a71aaa3</wfw:commentRss><title>Windows Azure Storage Services REST API</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,779cb918-cabb-4df7-9493-caaa2a71aaa3.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/aFNts0l6O-w/WindowsAzureStorageServicesRESTAPI.aspx</link><pubDate>Fri, 05 Feb 2010 04:55:04 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;a title="Hard Drive" href="http://www.flickr.com/photos/14968334@N00/4331140698/"&gt;&lt;img class="flickr" border="0" hspace="5" alt="Hard Drive" vspace="5" align="left" src="http://static.flickr.com/4066/4331140698_e3c1c094fb_t.jpg"&gt;&lt;/img&gt;&lt;/a&gt;In&#xD;
playing Windows Azure, I’ve started getting into the &lt;a href="http://msdn.microsoft.com/en-us/library/dd179355.aspx"&gt;Windows&#xD;
Azure Storage Services REST API&lt;/a&gt;. The REST API gives developers from any languages&#xD;
and/or platforms access to all of the Storage from either inside of Windows Azure&#xD;
or outside. It supports both HTTP and HTTPS. With it you can do just about anything&#xD;
that you need to with Blobs, Queues and Tables. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
For example, if you want to create a new table in the Windows Azure Table Storage&#xD;
you can just send it a little bit of XML that looks like this:&#xD;
&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml&#xD;
version="1.0" encoding="utf-8" standalone="yes"&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;entry&lt;/span&gt;&lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;d&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/ado/2007/08/dataservices"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;m&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://www.w3.org/2005/Atom"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;updated&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;2010-02-04T10:48:34.9840639-05:00&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;updated&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;author&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;author&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;content&lt;/span&gt;&lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"application/xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;m&lt;/span&gt;:&lt;span style="color: #800000"&gt;properties&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;d&lt;/span&gt;:&lt;span style="color: #800000"&gt;TableName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;MyTableName&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;d&lt;/span&gt;:&lt;span style="color: #800000"&gt;TableName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;m&lt;/span&gt;:&lt;span style="color: #800000"&gt;properties&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;entry&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&#xD;
There are a couple of small things that are a little wonky. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
First, the URL is RESTish to be honest. Check out the last bit of this sample URL&#xD;
that does a search on a set of entities in a table:&#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://myaccount.table.core.windows.net/Customers()?$filter=(Rating%20ge%203)%20and%20(Rating%20le%206"&gt;http://myaccount.table.core.windows.net/Customers()?$filter=(Rating%20ge%203)%20and%20(Rating%20le%206&lt;/a&gt;) &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
That last part of the filter is something that’s the “ish” part. It’s the query that’s&#xD;
used to search the entities. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
The second things that’s a wonky is that there are a handful of things that you can&#xD;
do from the native .NET libraries that you can’t do from the REST interfaces. For&#xD;
example, you can’t do LINQ from the REST interfaces. There are little things like&#xD;
that across all of the storage options but what it really says is that you should&#xD;
use the native libraries where possible. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Third thing that I found a little wonky but it kinda makes sense is that every request&#xD;
against the REST service has to have an authorization code. It is passed in as an&#xD;
HTTP header. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Authorization="[SharedKey|SharedKeyLite] &amp;lt;AccountName&amp;gt;:&amp;lt;Signature&amp;gt;"&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Anyways, I thought it was an interesting set of services and they are really useful&#xD;
especially if you’re doing something other than .NET. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Read more about them at &lt;a href="http://msdn.microsoft.com/en-us/library/dd179355.aspx"&gt;Windows&#xD;
Azure Storage Services REST API&lt;/a&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=779cb918-cabb-4df7-9493-caaa2a71aaa3"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=aFNts0l6O-w:vk-G0tLKzbs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=aFNts0l6O-w:vk-G0tLKzbs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=aFNts0l6O-w:vk-G0tLKzbs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=aFNts0l6O-w:vk-G0tLKzbs:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=aFNts0l6O-w:vk-G0tLKzbs:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=aFNts0l6O-w:vk-G0tLKzbs:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=aFNts0l6O-w:vk-G0tLKzbs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=aFNts0l6O-w:vk-G0tLKzbs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/aFNts0l6O-w" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,779cb918-cabb-4df7-9493-caaa2a71aaa3.aspx</comments><feedburner:origLink>http://www.joshholmes.com/blog/2010/02/05/WindowsAzureStorageServicesRESTAPI.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=8b1b46fb-0920-471f-aff6-38791610cadc</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,8b1b46fb-0920-471f-aff6-38791610cadc.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,8b1b46fb-0920-471f-aff6-38791610cadc.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8b1b46fb-0920-471f-aff6-38791610cadc</wfw:commentRss><title>When to use what Microsoft Client Technology</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,8b1b46fb-0920-471f-aff6-38791610cadc.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/TnQ_QYDQqCk/WhenToUseWhatMicrosoftClientTechnology.aspx</link><pubDate>Wed, 03 Feb 2010 18:04:48 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&#xD;
I was asked earlier when to use what Microsoft client Technology. I thought about&#xD;
just sending a link to &lt;a href="http://blogs.msdn.com/synergist/archive/2007/07/10/when-to-use-which-microsoft-presentation-technology.aspx"&gt;Michael&#xD;
Schroeder’s post&lt;/a&gt; but decided I should put in my own thoughts on the matter first. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
At the heart of Michael’s post is this table. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;table border="1" cellspacing="0" cellpadding="1" width="459"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="88"&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;/td&gt;&lt;td valign="top" width="96"&gt;&lt;strong&gt;&lt;a href="http://wpf.netfx3.com/" target="_blank" mce_href="http://wpf.netfx3.com/"&gt;&lt;font size="1"&gt;WPF&lt;/font&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="104"&gt;&lt;strong&gt;&lt;a href="http://www.xbap.org/index.html" target="_blank" mce_href="http://www.xbap.org/index.html"&gt;&lt;font size="1"&gt;WPF&#xD;
XBAP&lt;/font&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="85"&gt;&lt;strong&gt;&lt;a href="http://www.microsoft.com/silverlight/" target="_blank" mce_href="http://www.microsoft.com/silverlight/"&gt;&lt;font size="1"&gt;Silverlight&lt;/font&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="84"&gt;&lt;strong&gt;&lt;a href="http://ajax.asp.net/" target="_blank" mce_href="http://ajax.asp.net/"&gt;&lt;font size="1"&gt;ASP.Net&#xD;
+ AJAX&lt;/font&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="87"&gt;&lt;strong&gt;&lt;font size="1"&gt;Client&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="96"&gt;&lt;font size="1"&gt;Windows XP SP2 (With &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=10cc340b-f857-4a14-83f5-25634c3bf043&amp;amp;displaylang=en" target="_blank"&gt;.Net&#xD;
3.0&lt;/a&gt;), Vista and obviously Windows 7&lt;/font&gt;&lt;/td&gt;&lt;td valign="top" width="105"&gt;&lt;font size="1"&gt;Internet Explorer + Windows XP SP2 (with .&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=10cc340b-f857-4a14-83f5-25634c3bf043&amp;amp;displaylang=en" target="_blank"&gt;Net&#xD;
3.0&lt;/a&gt;) &amp;amp; Vista&lt;/font&gt;&lt;/td&gt;&lt;td valign="top" width="86"&gt;&lt;font size="1"&gt;FireFox, Mac Safari, Internet Explorer&lt;/font&gt;&lt;/td&gt;&lt;td valign="top" width="83"&gt;&lt;font size="1"&gt;Any Web Browser&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="89"&gt;&lt;strong&gt;&lt;font size="1"&gt;Deployment&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="95"&gt;&lt;font size="1"&gt;Downloadable Installer or &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-US/library/142dbbz4(VS.80).aspx" target="_blank" mce_href="http://msdn2.microsoft.com/en-US/library/142dbbz4(VS.80).aspx"&gt;&lt;font size="1"&gt;ClickOnce&lt;/font&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top" width="105"&gt;&lt;font size="1"&gt;Runs in Internet Explorer secure sandbox&lt;/font&gt;&lt;/td&gt;&lt;td valign="top" width="86"&gt;&lt;font size="1"&gt;One-time install of Silverlight plug-in&lt;/font&gt;&lt;/td&gt;&lt;td valign="top" width="83"&gt;&lt;font size="1"&gt;Web Page&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="89"&gt;&lt;strong&gt;&lt;font size="1"&gt;When to use&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="95"&gt;&lt;font size="1"&gt;Programs that need access to Windows desktop files.&lt;/font&gt;&lt;/td&gt;&lt;td valign="top" width="105"&gt;&lt;font size="1"&gt;Intranet applications for Windows-oriented companies.&lt;/font&gt;&lt;/td&gt;&lt;td valign="top" width="86"&gt;&lt;font size="1"&gt;Rich Internet Applications for public-facing web sites&lt;/font&gt;&lt;/td&gt;&lt;td valign="top" width="83"&gt;&lt;font size="1"&gt;General-purpose public-facing web sites &lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&#xD;
Here’s my 2 cents on the subject. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;WPF&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&#xD;
WPF is a fantastic choice for applications that need full access to the desktop for&#xD;
any number of reasons. That could be full 3D support, access to desktop files and&#xD;
the like. You can install these applications through XCopy, a full downloadable Installer&#xD;
or a ClickOnce installer. Where possible, I like to leverage the ClickOnce installer&#xD;
as it gives some amazing benefits around auto-update and keeps my application in a&#xD;
secure sandbox so deployment becomes really easy. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;WPF XBAP&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&#xD;
Just don’t use XBAPs anymore. This was an attractive option for Intranet applications&#xD;
back before Silverlight 2 and to a lesser degree Silverlight 3. However, now that&#xD;
Silverlight has the power that it does with .NET and OOB options and the like, opt&#xD;
for Silverlight anytime you would have considered XBAPs. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Silverlight&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&#xD;
Silverlight is the right choice for any external facing &lt;strong&gt;Applications&lt;/strong&gt;.&#xD;
But that’s the key. I really look at Silverlight not as an HTML replacement but a&#xD;
true application layer. That’s one of the central points in the talk that &lt;a href="http://www.jamesward.com"&gt;James&#xD;
Ward&lt;/a&gt; and I did at Web 2.0 Expo last year - &lt;a title="http://www.slideshare.net/joshholmes/best-and-worst-practices-building-ria-with-adobe-and-microsoft" href="http://www.slideshare.net/joshholmes/best-and-worst-practices-building-ria-with-adobe-and-microsoft"&gt;http://www.slideshare.net/joshholmes/best-and-worst-practices-building-ria-with-adobe-and-microsoft&lt;/a&gt;. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ASP.NET + AJAX&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&#xD;
ASP.NET + AJAX is the right choice for external facing, or even internal facing, web&#xD;
sites where the primary focus is information dispersal. That said, there are some&#xD;
amazing applications built with JavaScript in the browser. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Overall&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&#xD;
The reality is that there are a lot of grey lines. WPF is getting a lot easier to&#xD;
deploy breaking down the traditional decision points between desktop and web applications.&#xD;
Rich Web Applications blur those lines as well and the reality is that they could&#xD;
be used to build a lot of applications that have historically been either written&#xD;
as full desktop applications or as web applications. Then on the web application side,&#xD;
JavaScript and the browser are getting faster, strong and easier to develop all the&#xD;
time so it’s becoming more of a viable application building set of technologies. &#xD;
&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=8b1b46fb-0920-471f-aff6-38791610cadc"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=TnQ_QYDQqCk:HUPnVYb-iFM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=TnQ_QYDQqCk:HUPnVYb-iFM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=TnQ_QYDQqCk:HUPnVYb-iFM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=TnQ_QYDQqCk:HUPnVYb-iFM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=TnQ_QYDQqCk:HUPnVYb-iFM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=TnQ_QYDQqCk:HUPnVYb-iFM:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=TnQ_QYDQqCk:HUPnVYb-iFM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=TnQ_QYDQqCk:HUPnVYb-iFM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/TnQ_QYDQqCk" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,8b1b46fb-0920-471f-aff6-38791610cadc.aspx</comments><feedburner:origLink>http://www.joshholmes.com/blog/2010/02/03/WhenToUseWhatMicrosoftClientTechnology.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=d06b5448-74df-48c4-9191-6b0050814485</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,d06b5448-74df-48c4-9191-6b0050814485.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,d06b5448-74df-48c4-9191-6b0050814485.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d06b5448-74df-48c4-9191-6b0050814485</wfw:commentRss><title>Windows Azure SDK 1.1</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,d06b5448-74df-48c4-9191-6b0050814485.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/kBWRSjZsj4k/WindowsAzureSDK11.aspx</link><pubDate>Tue, 02 Feb 2010 18:47:36 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&#xD;
There’s an update to the Windows Azure SDK, version 1.1. The SDK extends Visual Studio&#xD;
2008 and the upcoming Visual Studio 2010 RC making it easy to develop, debug, package&#xD;
and deploy Windows Azure Applications. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
There’s a number of new things and a handful of bug fixes from the 1.0. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
From the download page:&#xD;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&#xD;
Windows Azure Drive: Enable a Windows Azure application to use existing NTFS APIs&#xD;
to access a durable drive. This allows the Windows Azure application to mount a page&#xD;
blob as a drive letter, such as X:, and enables easy migration of existing NTFS applications&#xD;
to the cloud. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
OS Version Support: Allows a Windows Azure application to choose the appropriate Guest&#xD;
OS to run on in the cloud. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Bug Fixes&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&#xD;
StorageClient: Expose account key from storage credentials, expose continuation tokens&#xD;
for pagination, and reduce maximum buffer size for parallel uploads. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Windows Azure Diagnostics: Fix path corruption for crash dumps, OnDemandTransfer now&#xD;
respects LogLevelFilter. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
VS 2010: Improved packaging performance. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
VS 2010: Support for linked files in Web projects. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
VS 2010: Support for ASP.NET web project web.config transformations. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Certificate selection lists certificates from LocalMachine\My instead of CurrentUser\My. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Right click on Role under Roles folder to select whether to launch the browser against&#xD;
HTTP, HTTPS or not at all.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&#xD;
Windows Azure Tools for Microsoft Visual Studio includes:&#xD;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&#xD;
C# and VB Project creation support for creating a Windows Azure Cloud Service solution&#xD;
with multiple roles. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Tools to add and remove roles from the Cloud Service. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Tools to configure each Role. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Integrated local development via the Development Fabric and Development Storage services. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Running and Debugging a Cloud Service in the Development Fabric. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Building and packaging of Cloud Service Packages. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Browsing to the Windows Azure Developer Portal.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5664019e-6860-4c33-9843-4eb40b297ab6&amp;amp;displaylang=en"&gt;Download&#xD;
details: Windows Azure Tools for Microsoft Visual Studio 1.1 (February 2010)&lt;/a&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=d06b5448-74df-48c4-9191-6b0050814485"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=kBWRSjZsj4k:K7ZrJnMjjZQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=kBWRSjZsj4k:K7ZrJnMjjZQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=kBWRSjZsj4k:K7ZrJnMjjZQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=kBWRSjZsj4k:K7ZrJnMjjZQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=kBWRSjZsj4k:K7ZrJnMjjZQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=kBWRSjZsj4k:K7ZrJnMjjZQ:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=kBWRSjZsj4k:K7ZrJnMjjZQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=kBWRSjZsj4k:K7ZrJnMjjZQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/kBWRSjZsj4k" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,d06b5448-74df-48c4-9191-6b0050814485.aspx</comments><feedburner:origLink>http://www.joshholmes.com/blog/2010/02/02/WindowsAzureSDK11.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=6feed3f0-b75b-4752-9376-8cdb69109c6b</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,6feed3f0-b75b-4752-9376-8cdb69109c6b.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,6feed3f0-b75b-4752-9376-8cdb69109c6b.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6feed3f0-b75b-4752-9376-8cdb69109c6b</wfw:commentRss><title>Taking The Polar Plunge Again</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,6feed3f0-b75b-4752-9376-8cdb69109c6b.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/XE0X45tRzC8/TakingThePolarPlungeAgain.aspx</link><pubDate>Mon, 01 Feb 2010 15:21:53 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;a href="http://www.joshholmes.com/blog/ct.ashx?id=3238275d-1111-4eca-a0b4-7604f43bc953&amp;amp;url=http%3a%2f%2fwww.flickr.com%2fphotos%2f11400133%40N05%2f3279848934%2f"&gt;&lt;img border="0" hspace="5" alt="Josh Holmes doing the Polar Plunge" vspace="5" align="left" src="http://static.flickr.com/3522/3279848934_2fcb2cf68f_m.jpg"&gt;&lt;/img&gt;&lt;/a&gt;Last&#xD;
year I did a Polar Plunge to raise money for the Special Olympics – Read about it&#xD;
at &lt;a href="http://www.joshholmes.com/blog/2009/02/14/TakingThePolarPlunge.aspx"&gt;Taking&#xD;
The Polar Plunge&lt;/a&gt;. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
I’m doing it again this year and have much loftier goals this year. Last year I raised&#xD;
$725.00 and this year I want to raise $1000.00 and inspire others to do the same.&#xD;
At the time of this writing, I’ve raised $500 personally and have inspired 2 others&#xD;
to do the dive with me. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.joshholmes.com/blog/ct.ashx?id=3238275d-1111-4eca-a0b4-7604f43bc953&amp;amp;url=http%3a%2f%2fwww.joshholmes.com%2fblog%2fct.ashx%3fid%3d1367de25-102d-4b15-b286-a65531ee0e11%26url%3dhttp%253a%252f%252fwww.joshholmes.com%252fblog%252fcontent%252fbinary%252fWindowsLiveWriter%252fPolarPlungingfortheSpecialOlympics_13808%252fclip_image002_2.jpg"&gt;&lt;strong&gt;&lt;img title="clip_image002" border="0" hspace="12" alt="clip_image002" align="right" src="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/PolarPlungingfortheSpecialOlympics_13808/clip_image002_thumb.jpg" width="160" height="204"&gt;&lt;/img&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;First,&#xD;
why in the world would I do this in the first place?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&#xD;
You may or may not know that I have a daughter with special needs. Her name is Maura.&#xD;
She’s 6 years old and while we don’t have a name for what she has the symptoms are&#xD;
that she has global delays and a seizure disorder. Despite this, she is one of the&#xD;
most passionate people that I know and approaches everything with wonder and excitement.&#xD;
She loves sports, playing with other kids and all kinds of activities. She’s amazing&#xD;
and an inspiration to me all the time. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
She is not currently in &lt;a href="http://www.somi.org/" target="_blank"&gt;Special Olympics&lt;/a&gt; but&#xD;
she will be soon so I’m supporting them now. I know that she will approach it like&#xD;
she does everything else with wonder and excitement. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Now, how can you help?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&#xD;
There are two easy ways to help with this year’s fundraising efforts, donate and/or&#xD;
plunge. The plunge that I’m doing is on Feb. 13th in Belleville, MI but you can plunge&#xD;
in any of their 19 locations and dates:&#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;January 24&lt;br&gt;&lt;/strong&gt;&lt;a href="http://somi.org/events.php?eventID=2366"&gt;Lansing&lt;/a&gt; - Eagle Eye&#xD;
Golf Course&lt;strong&gt;&lt;br&gt;&#xD;
February 6, 2010&lt;/strong&gt;&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2317"&gt;Stanton&lt;/a&gt;- Clifford Lake Inn&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2318"&gt;Muskegon&lt;/a&gt; - Fricano's Muskegon&#xD;
Lake &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;February 13, 2010&lt;/strong&gt;&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2319"&gt;Traverse City&lt;/a&gt; – Grand Traverse&#xD;
Resort &amp;amp; Spa&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2320"&gt;Cheboygan&lt;/a&gt; – Hoppies Bar&#xD;
&amp;amp; Grill &#xD;
&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2321"&gt;Belleville&lt;/a&gt; – Moose Lodge&lt;br&gt;&lt;a href="http://somi.org/events.php?eventID=2586"&gt;Fenton&lt;/a&gt; - Fenton Moose Lodge &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;February 20, 2010&lt;/strong&gt;&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2322"&gt;Jackson&lt;/a&gt; – Eagles Nest Restaurant&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2323"&gt;Mount Pleasant&lt;/a&gt;- CMU&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2324"&gt;Gaylord&lt;/a&gt; – Otsego Lake State&#xD;
Park&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2325"&gt;Ann Arbor&lt;/a&gt; – U of M&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2326"&gt;Grand Rapids&lt;/a&gt; – East Grand&#xD;
Rapids Middle School &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;February 27, 2010&lt;/strong&gt;&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2327"&gt;Detroit&lt;/a&gt; – Roostertail&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2328"&gt;Saginaw/Bay City&lt;/a&gt; – Saginaw&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2329"&gt;Mecosta/Osceola&lt;/a&gt; – Chippewa&#xD;
Lake&lt;br&gt;&lt;a href="http://somi.org/events.php?eventID=2406"&gt;Alpena&lt;/a&gt; - Burton's Last Resort &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;February 28, 2010&lt;/strong&gt;&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2330"&gt;Pinckney&lt;/a&gt; - Zukey Lake Tavern &#xD;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;March 20, 2010&lt;/strong&gt;&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2332"&gt;Kalamazoo&lt;/a&gt; – Lawson Ice Arena&lt;br&gt;&lt;a href="http://www.somi.org/events.php?eventID=2331"&gt;Marquette&lt;/a&gt; – Marquette Mountain &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
If you would rather just donate to my plunge, you can do so at &lt;a href="http://bit.ly/wonderplunge" target="_blank"&gt;Josh&#xD;
Holmes’ Polar Plunge Fundraising Page&lt;/a&gt;. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Either way, I thank you for your support!&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
If you are not able to support the Special Olympics of Michigan right now, please&#xD;
consider doing so in the future. You can see a lot great ways to get involved at &lt;a title="http://somi.org/page.php?contentID=1233" href="http://somi.org/page.php?contentID=1233"&gt;http://somi.org/page.php?contentID=1233&lt;/a&gt;. &#xD;
&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=6feed3f0-b75b-4752-9376-8cdb69109c6b"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=XE0X45tRzC8:1gOnn8dFh_0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=XE0X45tRzC8:1gOnn8dFh_0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=XE0X45tRzC8:1gOnn8dFh_0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=XE0X45tRzC8:1gOnn8dFh_0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=XE0X45tRzC8:1gOnn8dFh_0:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=XE0X45tRzC8:1gOnn8dFh_0:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=XE0X45tRzC8:1gOnn8dFh_0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=XE0X45tRzC8:1gOnn8dFh_0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/XE0X45tRzC8" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,6feed3f0-b75b-4752-9376-8cdb69109c6b.aspx</comments><feedburner:origLink>http://www.joshholmes.com/blog/2010/02/01/TakingThePolarPlungeAgain.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=eac3820b-5113-4df4-ace4-3dbcaa497f39</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,eac3820b-5113-4df4-ace4-3dbcaa497f39.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,eac3820b-5113-4df4-ace4-3dbcaa497f39.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=eac3820b-5113-4df4-ace4-3dbcaa497f39</wfw:commentRss><slash:comments>3</slash:comments><title>Review of Ext JS 3.0 Cookbook</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,eac3820b-5113-4df4-ace4-3dbcaa497f39.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/9oIK7tK9HvU/ReviewOfExtJS30Cookbook.aspx</link><pubDate>Thu, 19 Nov 2009 21:22:22 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a title="Ext JS 3.0 Cookbook (9781847198709): Jorge Ramon: Books" href="http://www.packtpub.com/ext-js-3-0-cookbook?utm_source=joshholmes.com&amp;amp;utm_medium=bookrev&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_001570"&gt;&lt;img style="margin: 5px; float: left" border="0" align="left" src="http://images.amazon.com/images/P/1847198708.01.MZZZZZZZ.jpg"&gt;&lt;/img&gt;&lt;/a&gt;&lt;p&gt;&#xD;
For full disclosure, &lt;a href="http://www.packtpub.com"&gt;Packt Publishing&lt;/a&gt; sent me&#xD;
a review copy of this book. They did not ask for a positive review, just a review. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&amp;lt;update&amp;gt;The book’s official page is at &lt;a href="http://www.packtpub.com/ext-js-3-0-cookbook?utm_source=joshholmes.com&amp;amp;utm_medium=bookrev&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_001570" target="_blank"&gt;Packt&#xD;
Pub's Official Ext JS 3.0 Cookbook site&lt;/a&gt;&amp;lt;/update&amp;gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
This is the first book by Jorge Ramon that I’ve read. This book is exactly what the&#xD;
title says that it is, a Cookbook. It’s got 109 solutions to problems solved by &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1847198708/joshholmes-20"&gt;Ext&#xD;
JS 3.0&lt;/a&gt;. I was expecting, like a lot of other books to get a fill of all of the&#xD;
philosophy behind what they are trying to promote but that wasn’t the case. This book&#xD;
just in with no nonsense and gets right to the code. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Every chapter is laid out exactly the same. It starts off with a list of problems&#xD;
solved in this chapter and a very short paragraph that gives an explanation to why&#xD;
these are related problems. The rest of the chapter is broken in to “recipes” all&#xD;
of which are laid out exactly the same as each other as well with sections “Introduction”,&#xD;
“How to do it”, “How it works”, an optional “There’s more” and a “See also” section.&#xD;
The intro is typically a short paragraph that describes when this recipe is going&#xD;
to be useful and optionally contains a screenshot or two of the solution. The How&#xD;
to do it section is almost all code with just enough text to explain where to put&#xD;
the code that you are looking at. The How it works section explains a little more&#xD;
about the events and the libraries that are at play and how they effect the code snippets&#xD;
that you just wrote. The There’s more section points out potential pitfalls or other&#xD;
benefits that this recipe brings to the table. The See also section points out related&#xD;
recipes that you should look at in addition to the recipe that you’re looking at. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
So what’s my opinion on the book? &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
if you are trying to understand JavaScript and/or &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1847198708/joshholmes-20"&gt;Ext&#xD;
JS 3.0&lt;/a&gt;, this book is not the book for you. There are plenty of other books out&#xD;
there that will step you in at a little more manageable pace. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
However, if you are somewhat familiar with JavaScript and &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1847198708/joshholmes-20"&gt;Ext&#xD;
JS 3.0&lt;/a&gt;, this is a great recipe book. The code is clean and readable. The problems&#xD;
are problems that I see on a semi-regular basis. I like it for what it is. It’s a&#xD;
handy reference and a set of problem/answers that solve discrete problems. It’s a&#xD;
good formula and I’m probably going to write a few blog posts in that format to feel&#xD;
it out. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
The price, $49.00 or 30.99 Pounds is a little steep but if it cuts an hour or two&#xD;
out of your research and development time, it’s paid for itself. Also, you can download&#xD;
the code from &lt;a href="http://www.packtpub.com"&gt;Packt Publishing&lt;/a&gt; in a zip file&#xD;
and copy paste from that so it’s definitely going to save you time if you are using&#xD;
Ext JS 3.0. This was something that I missed at first to be honest and only caught&#xD;
when I went back to reread the preface and saw the link to where the source is zipped&#xD;
up. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.packtpub.com/index"&gt;&lt;img style="margin: 5px; display: inline" title="Packt Publishing" border="0" alt="Packt Publishing" align="right" src="https://www.packtpub.com/images/PacktLogoSmall.png" width="90" height="50"&gt;&lt;/img&gt;&lt;/a&gt;Another&#xD;
interesting note about &lt;a href="http://www.packtpub.com"&gt;Packt Publishing&lt;/a&gt; is that&#xD;
on their “About Packt Publishing” page in the back of the book, they mention that&#xD;
when they publish a book based on an open source project that they pay royalties back&#xD;
to that project. I don’t know how much they pay in royalties to the project but that’s&#xD;
a really class thing to do. If one is making money on an open source project, they&#xD;
should contribute to it somehow either through code or financially or both. &#xD;
&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=eac3820b-5113-4df4-ace4-3dbcaa497f39"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=9oIK7tK9HvU:MsENNQwjQK8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=9oIK7tK9HvU:MsENNQwjQK8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=9oIK7tK9HvU:MsENNQwjQK8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=9oIK7tK9HvU:MsENNQwjQK8:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=9oIK7tK9HvU:MsENNQwjQK8:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=9oIK7tK9HvU:MsENNQwjQK8:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=9oIK7tK9HvU:MsENNQwjQK8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=9oIK7tK9HvU:MsENNQwjQK8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/9oIK7tK9HvU" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,eac3820b-5113-4df4-ace4-3dbcaa497f39.aspx</comments><feedburner:origLink>http://www.joshholmes.com/blog/2009/11/19/ReviewOfExtJS30Cookbook.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=78f7e0f4-14b1-4f63-98e0-b0ddc7a63288</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,78f7e0f4-14b1-4f63-98e0-b0ddc7a63288.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,78f7e0f4-14b1-4f63-98e0-b0ddc7a63288.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=78f7e0f4-14b1-4f63-98e0-b0ddc7a63288</wfw:commentRss><title>Updating the Simple Silverlight Countdown Blog badge</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,78f7e0f4-14b1-4f63-98e0-b0ddc7a63288.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/Xd6BrbP-YEA/UpdatingTheSimpleSilverlightCountdownBlogBadge.aspx</link><pubDate>Wed, 28 Oct 2009 19:14:56 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;a href="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/UpdatingtheSimpleSilverlightCountdownBlo_CA60/image_6.png"&gt;&lt;img style="border-right-width: 0px; margin: 5px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/UpdatingtheSimpleSilverlightCountdownBlo_CA60/image_thumb_2.png" width="109" height="213"&gt;&lt;/img&gt;&lt;/a&gt; When&#xD;
I was preparing for RIAPalooza, I created and blogged about &lt;a href="http://www.joshholmes.com/blog/2009/04/28/CreatingASimpleSilverlightCountdownBlogBadge.aspx"&gt;Creating&#xD;
a Simple Silverlight Countdown Blog badge&lt;/a&gt;. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
It was great but I wanted to updated it for the next event and realized that recompiling&#xD;
it was not really a user friendly option. The answer is that I updated the widget&#xD;
to have a level of parameterization so that I could easily update it without having&#xD;
to recode everything. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
*Update – &lt;a href="http://www.joshholmes.com/resources/silvercountdown2.zip"&gt;Source&#xD;
Code&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&#xD;
The good news is that there’s a mechanism called InitParams that allows you to pass&#xD;
in initialization parameters on startup. I’m not wild about the mechanism itself as&#xD;
it’s just a key-value pair string and not individual parameters but it works. The&#xD;
alternative is to do something where you write some javascript that will call into&#xD;
the Silverlight object and set parameters. While that works, it wasn’t my first choice&#xD;
because you have to worry about the order of events, exposing objects as scriptable&#xD;
and so on.&#xD;
&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;object &lt;/span&gt;&lt;span style="color: red"&gt;data&lt;/span&gt;&lt;span style="color: blue"&gt;="data:application/x-silverlight-2," &#xD;
&lt;br&gt;&lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="application/x-silverlight-2" &lt;/span&gt;&lt;span style="color: red"&gt;width&lt;/span&gt;&lt;span style="color: blue"&gt;="100%" &lt;/span&gt;&lt;span style="color: red"&gt;height&lt;/span&gt;&lt;span style="color: blue"&gt;="100%"&amp;gt; &lt;/span&gt;&lt;span style="color: blue"&gt;.&#xD;
. . &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;param &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;="initParams" &#xD;
&lt;br&gt;&lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;="eventDate=01/13/2010,registrationUrl=www.codemash.com,&lt;br&gt;&#xD;
registerText=Check it out!,startImageUrl=logo_codemash_2010.jpg,&lt;br&gt;&#xD;
endImageUrl=logo_codemash_2009.jpg" /&amp;gt; . . . &#xD;
&lt;br&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;object&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;&#xD;
Notice that there are multiple parameters here separated by commas. The first one&#xD;
is a date and the second one is a URL and so on. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
To access that init parameter in the startup you need to open the App class found&#xD;
in App.xaml.cs and in any method use the Host object’s InitParams list. &#xD;
&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;fieldValue = &lt;span style="color: blue"&gt;this&lt;/span&gt;.Host.InitParams[key];&lt;/pre&gt;&lt;p&gt;&#xD;
For a lot of reasons, I wrap that up in a method as follows:&#xD;
&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private string &lt;/span&gt;GetInitParam(&lt;span style="color: blue"&gt;string &lt;/span&gt;key)&#xD;
{ &lt;span style="color: blue"&gt;string &lt;/span&gt;fieldValue = &lt;span style="color: #a31515"&gt;""&lt;/span&gt;; &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;.Host.InitParams.ContainsKey(key))&#xD;
{ fieldValue = &lt;span style="color: blue"&gt;this&lt;/span&gt;.Host.InitParams[key]; } &lt;span style="color: blue"&gt;return &lt;/span&gt;fieldValue;&#xD;
}&lt;/pre&gt;&lt;p&gt;&#xD;
This allows me to quickly add a lot of new parameters and write the OnStartup method&#xD;
as follows:&#xD;
&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;OnStartup(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;StartupEventArgs &lt;/span&gt;e)&#xD;
{ &lt;span style="color: blue"&gt;string &lt;/span&gt;DateTimeString = GetInitParam(&lt;span style="color: #a31515"&gt;"eventDate"&lt;/span&gt;); &lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;eventDate&#xD;
= &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.MinValue; &lt;span style="color: blue"&gt;if &lt;/span&gt;(DateTimeString.Length&#xD;
&amp;gt; 0) { &lt;span style="color: blue"&gt;try &lt;/span&gt;{ eventDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Parse(DateTimeString);&#xD;
} &lt;span style="color: blue"&gt;catch &lt;/span&gt;{ } } &lt;span style="color: blue"&gt;string &lt;/span&gt;backGroundUrl&#xD;
= GetInitParam(&lt;span style="color: #a31515"&gt;"background"&lt;/span&gt;); &lt;span style="color: blue"&gt;string &lt;/span&gt;startImageUrl&#xD;
= GetInitParam(&lt;span style="color: #a31515"&gt;"startImageUrl"&lt;/span&gt;); &lt;span style="color: blue"&gt;string &lt;/span&gt;endImageUrl&#xD;
= GetInitParam(&lt;span style="color: #a31515"&gt;"endImageUrl"&lt;/span&gt;); &lt;span style="color: blue"&gt;string &lt;/span&gt;registrationUrl&#xD;
= GetInitParam(&lt;span style="color: #a31515"&gt;"registrationUrl"&lt;/span&gt;); &lt;span style="color: blue"&gt;string &lt;/span&gt;registerText&#xD;
= GetInitParam(&lt;span style="color: #a31515"&gt;"registerText"&lt;/span&gt;); &lt;span style="color: green"&gt;//&#xD;
Load the main control here &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.RootVisual&#xD;
= &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Page&lt;/span&gt;( eventDate,&#xD;
backGroundUrl, startImageUrl, endImageUrl, registrationUrl, registerText); }&lt;/pre&gt;&lt;p&gt;&#xD;
Notice that I’m calling a custom constructor on the Page class. That looks as follows:&#xD;
&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;Timer &lt;/span&gt;_timer = &lt;span style="color: blue"&gt;null&lt;/span&gt;; &lt;span style="color: blue"&gt;public &lt;/span&gt;Page()&#xD;
: &lt;span style="color: blue"&gt;this&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;, &lt;span style="color: #a31515"&gt;""&lt;/span&gt;)&#xD;
{} &lt;span style="color: blue"&gt;public &lt;/span&gt;Page(&lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;eventDate, &lt;span style="color: blue"&gt;string &lt;/span&gt;backGroundImageUrl, &#xD;
&lt;br&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;imageStartUrl, &lt;span style="color: blue"&gt;string &lt;/span&gt;imageEndUrl, &#xD;
&lt;br&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;registrationUrl, &lt;span style="color: blue"&gt;string &lt;/span&gt;registrationText)&#xD;
{ EventDateTime = eventDate; &lt;span style="color: green"&gt;// Required to initialize&#xD;
variables &lt;/span&gt;InitializeComponent(); &lt;span style="color: blue"&gt;if &lt;/span&gt;(backGroundImageUrl.Length&#xD;
&amp;gt; 0) { backGroundImage.Source = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BitmapImage&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(backGroundImageUrl, &lt;span style="color: #2b91af"&gt;UriKind&lt;/span&gt;.Relative));&#xD;
} &lt;span style="color: blue"&gt;if &lt;/span&gt;(imageStartUrl.Length &amp;gt; 0) { image.Source&#xD;
= &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BitmapImage&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(imageStartUrl, &lt;span style="color: #2b91af"&gt;UriKind&lt;/span&gt;.Relative));&#xD;
} &lt;span style="color: blue"&gt;if &lt;/span&gt;(imageEndUrl.Length &amp;gt; 0) { image1.Source&#xD;
= &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BitmapImage&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(imageEndUrl, &lt;span style="color: #2b91af"&gt;UriKind&lt;/span&gt;.Relative));&#xD;
} &lt;span style="color: blue"&gt;if &lt;/span&gt;(registrationUrl.Length &amp;gt; 0) { linkRegistrationButton.NavigateUri&#xD;
= &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"http://" &lt;/span&gt;+&#xD;
registrationUrl); } &lt;span style="color: blue"&gt;if &lt;/span&gt;(registrationText.Length &amp;gt;&#xD;
0) { linkRegistrationButton.Content = registrationText; } _timer = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Timer&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TimerCallback&lt;/span&gt;(Timer_Tick), &lt;span style="color: blue"&gt;null&lt;/span&gt;,&#xD;
0, 1000); AnimateLogos.AutoReverse = &lt;span style="color: blue"&gt;true&lt;/span&gt;; AnimateLogos.RepeatBehavior&#xD;
= &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RepeatBehavior&lt;/span&gt;(1000);&#xD;
AnimateLogos.Begin(); }&lt;/pre&gt;&lt;p&gt;&#xD;
That’s all that was required for making it parameterized so that I can update it quickly. &#xD;
&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=78f7e0f4-14b1-4f63-98e0-b0ddc7a63288"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=Xd6BrbP-YEA:c5SxPKnhPwQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=Xd6BrbP-YEA:c5SxPKnhPwQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=Xd6BrbP-YEA:c5SxPKnhPwQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=Xd6BrbP-YEA:c5SxPKnhPwQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=Xd6BrbP-YEA:c5SxPKnhPwQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=Xd6BrbP-YEA:c5SxPKnhPwQ:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=Xd6BrbP-YEA:c5SxPKnhPwQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=Xd6BrbP-YEA:c5SxPKnhPwQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/Xd6BrbP-YEA" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,78f7e0f4-14b1-4f63-98e0-b0ddc7a63288.aspx</comments><category>Silverlight</category><feedburner:origLink>http://www.joshholmes.com/blog/2009/10/28/UpdatingTheSimpleSilverlightCountdownBlogBadge.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=60aee1ac-72ce-4afa-9908-81b865f6f8ba</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,60aee1ac-72ce-4afa-9908-81b865f6f8ba.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,60aee1ac-72ce-4afa-9908-81b865f6f8ba.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=60aee1ac-72ce-4afa-9908-81b865f6f8ba</wfw:commentRss><title>Above the Fold and how It Really Should be Used</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,60aee1ac-72ce-4afa-9908-81b865f6f8ba.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/4YHwXnGmqiQ/AboveTheFoldAndHowItReallyShouldBeUsed.aspx</link><pubDate>Fri, 09 Oct 2009 18:01:24 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;a title="Chicago 080" href="http://www.flickr.com/photos/87487802@N00/305909364/"&gt;&lt;img style="margin: 5px; display: inline" class="flickr" border="0" hspace="5" alt="Chicago 080" vspace="5" align="left" src="http://static.flickr.com/121/305909364_ef7b862b55_m.jpg"&gt;&lt;/img&gt;&lt;/a&gt;I’ve&#xD;
come to realize that many web designers don’t understand what “Above the Fold” and&#xD;
how it really should be used. Above the Fold is an old print newspaper layout term&#xD;
for what’s on the top part of the page, the part that is displayed in the window at&#xD;
the newspaper stand. In web design, the term is used for the bits that the user can&#xD;
see without having to scroll. I’ve talked and ranted about this before as It’s point&#xD;
number 23 in &lt;a href="http://www.slideshare.net/joshholmes/32-ways-to-keep-your-blog-from-sucking"&gt;32&#xD;
ways to keep your blog from sucking&lt;/a&gt;…&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&amp;lt;update&amp;gt;It was &lt;a href="http://twitter.com/richie_p/statuses/4742012403"&gt;brought&#xD;
to my attention&lt;/a&gt; that it’s often not a web designer but rather an Information Architect&#xD;
or a Developer who is updating the layout on the page. Completely agreed and this&#xD;
is yet another reason that you should look for competent web designers for the layout&#xD;
and design of your page.&amp;lt;/update&amp;gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
What’s bringing it up now is that &lt;a href="http://www.cxpartners.co.uk"&gt;CX Partners&lt;/a&gt; recently&#xD;
blogged about &lt;a href="http://www.cxpartners.co.uk/thoughts/the_myth_of_the_page_fold_evidence_from_user_testing.htm"&gt;The&#xD;
myth of the page fold: evidence from user testing | cxpartners&lt;/a&gt; and it concerned&#xD;
me a little. &lt;a href="http://www.cxpartners.co.uk"&gt;CX Partners&lt;/a&gt; does a lot of user&#xD;
testing and one of the things that they have tested for is whether or not the “Fold”&#xD;
mattered to users and out of 800 users, only 3 were unable to find content because&#xD;
they would have to scroll to find it. They are right, users are used to scrolling&#xD;
and are willing to do so if they know that there’s more content below. We just need&#xD;
to give them visual hints that there is more content that they will have to scroll&#xD;
to see. What they are trying to fight is the urge to put all of the content or at&#xD;
least all of the &lt;strong&gt;*important*&lt;/strong&gt; content Above the Fold and design pages&#xD;
so that users do have to scroll. I’m on board with that fight. Cramming all of the&#xD;
content into cramped margins and smashing things together just so that it can be seen&#xD;
without scrolling is horrible design. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Here’s the part that concerns me as an old school print layout guy. There’s a fundamental&#xD;
miss on what the “Above the Fold” content is supposed to be used for in your layout&#xD;
whether it’s print or web design. &#xD;
&lt;/p&gt;&lt;h3&gt;How does print layout treat above the fold?&#xD;
&lt;/h3&gt;&lt;p&gt;&#xD;
The above the fold content is not meant to be the meat of the content or really even&#xD;
the most important content. It’s meant to be eye catching. It’s the lure for people&#xD;
to pick up the paper or magazine. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;a title="100th Anniversary of the Seattle P-I Newspaper" href="http://www.flickr.com/photos/49233110@N00/3511599262/"&gt;&lt;img style="margin: 5px" class="flickr" border="0" hspace="5" alt="100th Anniversary of the Seattle P-I Newspaper" vspace="5" align="right" src="http://static.flickr.com/3382/3511599262_b040b36422_m.jpg"&gt;&lt;/img&gt;&lt;/a&gt;When&#xD;
thinking about the fold in a newspaper, think about the old school newspaper dispenser&#xD;
with the top half of the top page displayed in the little window. There is a deliberate&#xD;
attempt to put a catchy photo and headline in that window so people buy the paper.&#xD;
Is that the best thing in the paper, not even close. That’s the picture that’s going&#xD;
to look good on someone’s coffee table when they toss down the newspaper. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;a title="New York 1st day. magazine stands" href="http://www.flickr.com/photos/24672979@N00/365878605/"&gt;&lt;img style="margin: 5px; display: inline" class="flickr" border="0" hspace="5" alt="New York 1st day. magazine stands" vspace="5" align="left" src="http://static.flickr.com/170/365878605_c707017c5d_m.jpg"&gt;&lt;/img&gt;&lt;/a&gt;Or&#xD;
better, think about the magazine stand and how there are potentially hundreds of magazines&#xD;
there and you need for yours to stand out enough that people will buy it. Think this&#xD;
through – what can they see in the magazine stand? Typically they can see the top&#xD;
edge of the magazine and part of the picture. I was amazed once when I was talking&#xD;
to a freelance sports photographer who told me that he’d net $40k-$60k for one photo&#xD;
if he could land the cover picture on Sports Illustrated. But it makes a ton of sense.&#xD;
This concept of trying to stand out on just a headline and a photo is not lost on&#xD;
the smart people at Sports Illustrated. The right picture could make far more than&#xD;
$40k worth of a difference on the stand. &#xD;
&lt;/p&gt;&lt;h3&gt;How does this apply to web design?&#xD;
&lt;/h3&gt;&lt;p&gt;&#xD;
Honestly, it’s the same exact concept. The fold or scroll line is the area of the&#xD;
page that people can see without having to scroll down the page. This area needs to&#xD;
catch people’s attention correctly because they may only be on your page for a few&#xD;
seconds. If you look at the statistics on any site that gets a decent amount of traffic&#xD;
and the average page view length is measured in seconds, not minutes. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
When people are browsing through and they get a link from another site or from a search&#xD;
engine, what’s the first thing that they see? Imagine that as if they are glancing&#xD;
past your page among the potentially hundreds of others that they are looking past&#xD;
which is really not that much of a stretch because they are looking to see which pages&#xD;
are more likely to fit their needs than others. They may not be paying for your content&#xD;
but they are investing their time.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
The problems come in two sizes. First, there are designs that try to shove as much&#xD;
content as they can into that above the fold area because there’s an assumption that&#xD;
if it’s not there, their users won’t see it. Second, there are other designs that&#xD;
completely shun the idea of scrolling and end up with these horrid wizard style pages&#xD;
where the user has to click through to see the next page and the next page and so&#xD;
on. Either of these are poor choices. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Back to the article for a moment - I really liked &lt;a href="http://www.cxpartners.co.uk"&gt;CX&#xD;
Partners&lt;/a&gt;’s &lt;a href="http://www.cxpartners.co.uk/thoughts/the_myth_of_the_page_fold_evidence_from_user_testing.htm"&gt;“Design&#xD;
tips to encourage scrolling”&lt;/a&gt;. What was missing is the “How to hook them and keep&#xD;
them” bit. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Let’s look at &lt;a href="http://jeffblankenburg.com"&gt;Jeff Blankenburg&lt;/a&gt;’s blog for&#xD;
a good reference here. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://jeffblankenburg.com"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/AbovetheFoldandwhatitreallyMeans_815C/image_3.png" width="551" height="364"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&#xD;
You know exactly what you are going to get on his page. The disk in the middle, which&#xD;
is what most people see first cycles through all of the social networks that he frequents.&#xD;
The tweets across the top express his last several publically blasted thoughts while&#xD;
the little bird that flies around them draws eyeballs to them. The menu shows you&#xD;
that he’s delivering Code and Slides through this blog in addition to other posts.&#xD;
The RSS tag that hangs down and swings a little definitely captures the attention&#xD;
and draws people to subscribe. Finally, the title of the blog and the first blog post&#xD;
start drawing eyes down the page to see the meat of the content. But what real content&#xD;
is above the fold on Jeff’s blog? Honestly, there’s none. All of the real content&#xD;
is below the fold so the user has to scroll for it. Going back to the &lt;a href="http://www.cxpartners.co.uk"&gt;CX&#xD;
Partners&lt;/a&gt; post, that’s fine. Users know how to and are willing to scroll for content&#xD;
if they find the page interesting. The &lt;strong&gt;*only*&lt;/strong&gt; thing that I dislike&#xD;
about his header is that it’s a fairly large chunk that takes 3-5 seconds to load&#xD;
the first time. This is a killer if the user is only on the page for 3 seconds.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Another great example is any Amazon product page. They have the picture of the product,&#xD;
average user rating and price right at the top. The product detail, related products,&#xD;
the actual reviews and all of the rest of the content is below the scroll line. Obviously,&#xD;
it’s successful for them. &#xD;
&lt;/p&gt;&lt;h3&gt;Wrapping up…&#xD;
&lt;/h3&gt;&lt;p&gt;&#xD;
Above the Fold is widely miss-understood. You need to realize that this critical section&#xD;
of the page is not about shoving as much content as you can the user. It’s about effectively&#xD;
giving the “Elevator” pitch on your site and getting that longer look that will likely&#xD;
involve scrolling down to see the real content. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Guard the above the fold content and keep it to the essential bits that will tell&#xD;
the user what your site is about rather than trying to give them everything in one&#xD;
big drink from the fire hose. Whenever anyone talks to you about moving a certain&#xD;
section of content above the fold, turn the question on them by asking them how that&#xD;
keeps people on the site over all. &#xD;
&lt;/p&gt;&lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=60aee1ac-72ce-4afa-9908-81b865f6f8ba"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4YHwXnGmqiQ:Cy2E2GMlpMs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4YHwXnGmqiQ:Cy2E2GMlpMs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=4YHwXnGmqiQ:Cy2E2GMlpMs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4YHwXnGmqiQ:Cy2E2GMlpMs:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=4YHwXnGmqiQ:Cy2E2GMlpMs:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4YHwXnGmqiQ:Cy2E2GMlpMs:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=4YHwXnGmqiQ:Cy2E2GMlpMs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=4YHwXnGmqiQ:Cy2E2GMlpMs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/4YHwXnGmqiQ" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,60aee1ac-72ce-4afa-9908-81b865f6f8ba.aspx</comments><category>UX</category><category>Web Dev</category><feedburner:origLink>http://www.joshholmes.com/blog/2009/10/09/AboveTheFoldAndHowItReallyShouldBeUsed.aspx</feedburner:origLink></item><item><trackback:ping>http://www.joshholmes.com/blog/Trackback.aspx?guid=d64fbc8e-0926-4dc5-b16d-d2fdf113c84b</trackback:ping><pingback:server>http://www.joshholmes.com/blog/pingback.aspx</pingback:server><pingback:target>http://www.joshholmes.com/blog/PermaLink,guid,d64fbc8e-0926-4dc5-b16d-d2fdf113c84b.aspx</pingback:target><dc:creator>Josh Holmes</dc:creator><wfw:comment>http://www.joshholmes.com/blog/CommentView,guid,d64fbc8e-0926-4dc5-b16d-d2fdf113c84b.aspx</wfw:comment><wfw:commentRss>http://www.joshholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d64fbc8e-0926-4dc5-b16d-d2fdf113c84b</wfw:commentRss><title>Announcing the WebsiteSpark Program</title><guid isPermaLink="false">http://www.joshholmes.com/blog/PermaLink,guid,d64fbc8e-0926-4dc5-b16d-d2fdf113c84b.aspx</guid><link>http://rss.joshholmes.com/~r/JoshHolmes/~3/nZc1fWmNUZQ/AnnouncingTheWebsiteSparkProgram.aspx</link><pubDate>Thu, 24 Sep 2009 16:11:55 GMT</pubDate><description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;a href="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/AnnouncingtheWebsiteSparkProgram_82C9/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 5px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" align="left" src="http://www.joshholmes.com/blog/content/binary/WindowsLiveWriter/AnnouncingtheWebsiteSparkProgram_82C9/image_thumb.png" width="161" height="96"&gt;&lt;/img&gt;&lt;/a&gt; Building&#xD;
on the success of the &lt;a href="https://www.dreamspark.com/default.aspx"&gt;DreamSpark&lt;/a&gt; and &lt;a href="http://www.joshholmes.com/blog/2008/11/10/MicrosoftBizSpark.aspx"&gt;BizSpark&lt;/a&gt; program&#xD;
that we launched about 11 months ago Microsoft is now launching the &lt;a href="http://www.microsoft.com/web/websitespark"&gt;WebsiteSpark&lt;/a&gt; program. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebsiteSpark&lt;/a&gt; is designed&#xD;
for small web consultancies ranging in size from 1 to 10 people. With &lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebsiteSpark&lt;/a&gt;,&#xD;
you get a package of software specifically selected for a web consultancy to serve&#xD;
their customers better. &#xD;
&lt;/p&gt;&lt;h5&gt;What does the program provide?&#xD;
&lt;/h5&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebSiteSpark&lt;/a&gt; provides software&#xD;
licenses that you can use for three years at no cost.  Once enrolled, you can&#xD;
download and immediately use the following software from Microsoft: &#xD;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&#xD;
3 licenses of Visual Studio 2008 Professional Edition &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
1 license of Expression Studio 3 (which includes Expression Blend, Sketchflow, and&#xD;
Web) &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
2 licenses of Expression Web 3 &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
4 processor licenses of Windows Web Server 2008 R2 &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
4 processor licenses of SQL Server 2008 Web Edition &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
DotNetPanel control panel (enabling easy remote/hosted management of your servers) &#xD;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&#xD;
The Windows Server and SQL Server licenses are for you to do both development and&#xD;
production work. Also, the production licenses can be leveraged in a couple of different&#xD;
ways. You can do 1 production server with 4 processors or 4 servers with 1 processor&#xD;
each. These servers can also be either dedicated hardware or virtualized offerings.&#xD;
If you want, you can throw the licenses on your own server with the “self-hosted”&#xD;
model or you can enroll with one of the hosters that have signed up as a Network Partner.&#xD;
As a Network Partner, they will pass the savings of the licenses on to you and only&#xD;
charge you for the infrastructure work. You can find all of the hosting network partners&#xD;
on the &lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebsiteSpark&lt;/a&gt; page. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
But this program is not just about software. As part of the &lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebsiteSpark&lt;/a&gt;,&#xD;
the people that enroll are entered into the &lt;a href="https://partner.microsoft.com/US/30000104?ID=90894078"&gt;Microsoft&#xD;
Partner Program&lt;/a&gt; and into &lt;a href="http://pinpoint.microsoft.com/en-US/"&gt;Microsoft&#xD;
Pinpoint&lt;/a&gt;. This will help result in customer referrals and more. There’s also 2&#xD;
Microsoft professional support incidents per year and some free online training that&#xD;
will be provided.  &#xD;
&lt;/p&gt;&lt;h5&gt;Who’s eligible for BizSpark?&#xD;
&lt;/h5&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebSiteSpark&lt;/a&gt; is available&#xD;
to independent web developers and small web development companies.  The only&#xD;
two requirements to join the program are: &#xD;
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&#xD;
Your company builds web sites and web application on behalf of others. &#xD;
&lt;/li&gt;&lt;li&gt;&#xD;
Your company currently has less than 10 employees. &#xD;
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&#xD;
If you qualify and want to get signed up today, there are a couple of different paths. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
You can always visit &lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebsiteSpark&lt;/a&gt; and&#xD;
sign up directly. During the enrollment, you can pick a network partner or you can&#xD;
pick one of your friends at Microsoft such as me as your contact to enroll and sign&#xD;
you up. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Or you can send mail to &lt;a href="mailto:webspark@microsoft.com"&gt;webspark@microsoft.com&lt;/a&gt; you&#xD;
can get a referral code quickly.  You can then use that code to enroll in the&#xD;
program on the &lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebsiteSpark website&lt;/a&gt;. &#xD;
Once enrolled you can immediately download and use the software, as well as begin&#xD;
to participate in the network/partner opportunities. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
If you run into any issues at all, email me at &lt;a href="mailto:josh.holmes@microsoft.com"&gt;josh.holmes@microsoft.com&lt;/a&gt; and&#xD;
I’ll help you out. &#xD;
&lt;/p&gt;&lt;h5&gt;Some quick Q&amp;amp;A&#xD;
&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;&lt;h5&gt;What happens after the 3 years?&#xD;
&lt;/h5&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&#xD;
There is a $100 exit fee when you leave the program whether you leave at the end of&#xD;
1 year or you leverage all three years. However, there’s no obligation to continue&#xD;
using any/all of the software once you exit the program. If you so wish, you can pay&#xD;
the $100 exit fee and wash your hands of the whole deal. Obviously, the play here&#xD;
is that at the end of the three years you will find our platform and tools valuable&#xD;
enough to purchase. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
That said, there are some interesting incentives that are being put in place right&#xD;
now to help you with that decision. WebsiteSpark participants can optionally choose&#xD;
to purchase all of the software in the WebsiteSpark program via a $999/year package.&#xD;
And yes, that includes all of the software involved from the tools to the production&#xD;
licenses.   &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Or you can just leverage the production licenses through a stellar $199 a year offer&#xD;
that includes both 1 Windows Web Server processor license and 1 SQL Server Web edition&#xD;
processor license.  You can buy the quantity you need of this package at $199/year&#xD;
each.  &#xD;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;h5&gt;What’s the role of the Network Partner?&#xD;
&lt;/h5&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;h5&gt;&lt;/h5&gt;&lt;/ul&gt;&lt;p&gt;&#xD;
Similar to the BizSpark program, the Network Partners are selected because they are&#xD;
active in supporting the ecosystem that the program is intended for. In the case of&#xD;
hosters it’s obvious. They host the websites that WebsiteSpark participants are building.&#xD;
There are others who work with the community in advisory roles and want to help out&#xD;
as mentors and coaches. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
Couple of examples:&#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.calevans.com"&gt;Cal Evans&lt;/a&gt; is another example of a great network&#xD;
partner as he’s working with PHP shops all over the world and helping them to be successful&#xD;
again as a mentor and as a coach. As a network partner, he is adding one more offering&#xD;
into the portfolio to help his mentees be successful. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://stevesmithblog.com/"&gt;Steve Smith&lt;/a&gt; from &lt;a href="http://NimblePros.com"&gt;Nimble&#xD;
Pros&lt;/a&gt; who wanted to be involved as a network partner because he’s active in working&#xD;
with other consults to help them be successful through support, advice, mentoring&#xD;
and sometimes sub-contracting. He’s proven this by being a Microsoft Regional Director&#xD;
and an MVP for many years. His role as a network partner in the program only furthers&#xD;
that goal of helping the ecosystem. &#xD;
&lt;/p&gt;&lt;p&gt;&lt;a href="http://twitter.com/ben_henderson"&gt;Ben Henderson&lt;/a&gt; from &lt;a href="http://www.fireflylogic.com"&gt;Firefly&#xD;
Logic&lt;/a&gt;, &lt;a href="http://www.harperreed.org/"&gt;Harper Reed&lt;/a&gt; from &lt;a href="http://www.threadless.com/"&gt;Threadless&lt;/a&gt; and &lt;a href="http://geekswithblogs.net/jalexander/"&gt;John&#xD;
Alexander&lt;/a&gt; and &lt;a href="http://geekswithblogs.net/jjulian/"&gt;Jeff Julian&lt;/a&gt; from &lt;a href="http://www.geekswithblogs.net/"&gt;Geeks&#xD;
With Blogs&lt;/a&gt; hold similar positions in the community as influential bloggers, coaches,&#xD;
mentors and advisors to many companies. &#xD;
&lt;/p&gt;&lt;h5&gt;Summary&#xD;
&lt;/h5&gt;&lt;p&gt;&#xD;
I’m really excited about &lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebsiteSpark&lt;/a&gt; because&#xD;
I remember when I was an independent consultant and then a partner at &lt;a href="http://www.srtsolutions.com"&gt;SRT&#xD;
Solutions&lt;/a&gt; getting our first dedicated server. It was a great feeling to have the&#xD;
freedom to do whatever we needed to do with the server from installing different types&#xD;
of software to configuring the redirects the way we wanted. &#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
For more details – read Scott Guthrie's blog post at &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/09/24/announcing-the-websitespark-program.aspx"&gt;Announcing&#xD;
the WebsiteSpark Program - ScottGu's Blog&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&#xD;
Again, if you want to get involved, feel free to contact me at &lt;a href="mailto:josh.holmes@microsoft.com"&gt;josh.holmes@microsoft.com&lt;/a&gt;.&#xD;
Either I can sign you up directly or get you in touch with the right network partner&#xD;
to help you in your situation. &lt;img width="0" height="0" src="http://www.joshholmes.com/blog/aggbug.ashx?id=d64fbc8e-0926-4dc5-b16d-d2fdf113c84b"&gt;&lt;/img&gt;&lt;br&gt;&lt;hr&gt;&lt;/hr&gt;&#xD;
This weblog is sponsored by &amp;lt;a href="http://www.joshholmes.com"&amp;gt;Josh Holmes&amp;lt;/a&amp;gt;. &#xD;
&lt;/p&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=nZc1fWmNUZQ:O877Xk8HrC0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=nZc1fWmNUZQ:O877Xk8HrC0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=nZc1fWmNUZQ:O877Xk8HrC0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=nZc1fWmNUZQ:O877Xk8HrC0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=nZc1fWmNUZQ:O877Xk8HrC0:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=nZc1fWmNUZQ:O877Xk8HrC0:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://rss.joshholmes.com/~ff/JoshHolmes?a=nZc1fWmNUZQ:O877Xk8HrC0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JoshHolmes?i=nZc1fWmNUZQ:O877Xk8HrC0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoshHolmes/~4/nZc1fWmNUZQ" height="1" width="1"/&gt;</description><comments>http://www.joshholmes.com/blog/CommentView,guid,d64fbc8e-0926-4dc5-b16d-d2fdf113c84b.aspx</comments><feedburner:origLink>http://www.joshholmes.com/blog/2009/09/24/AnnouncingTheWebsiteSparkProgram.aspx</feedburner:origLink></item></channel></rss>
