<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Richard Parker&#039;s blog &#187; Software Development</title>
	<atom:link href="http://blog.richard.parker.name/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.richard.parker.name</link>
	<description>C#, Cloud Computing and Tech-miscellany</description>
	<lastBuildDate>Tue, 17 Jan 2012 22:20:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.richard.parker.name' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Richard Parker&#039;s blog &#187; Software Development</title>
		<link>http://blog.richard.parker.name</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.richard.parker.name/osd.xml" title="Richard Parker&#039;s blog" />
	<atom:link rel='hub' href='http://blog.richard.parker.name/?pushpress=hub'/>
		<item>
		<title>Unattended installation of SQL Server 2008 R2 Express on an Azure role</title>
		<link>http://blog.richard.parker.name/2012/01/02/unattended-sql-2008-installation-on-windows-azure/</link>
		<comments>http://blog.richard.parker.name/2012/01/02/unattended-sql-2008-installation-on-windows-azure/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 22:19:41 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[Windows Azure Platform]]></category>
		<category><![CDATA[SQL Server 2008]]></category>

		<guid isPermaLink="false">http://blog.richard.parker.name/?p=708</guid>
		<description><![CDATA[In certain circumstances, you might find yourself with a need to install SQL Server Express on one of your Windows Azure worker roles. Exercise caution here though folks: this is not a supported design pattern (remember, a restart of your role instance will cause all data to be lost). It was however exactly what I &#8230;<p><a href="http://blog.richard.parker.name/2012/01/02/unattended-sql-2008-installation-on-windows-azure/" class="more-link">Read More</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=708&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://brainthings.files.wordpress.com/2012/01/azureunlimited.png"><img class="alignleft size-medium wp-image-716" title="azureunlimited" src="http://brainthings.files.wordpress.com/2012/01/azureunlimited.png?w=300&#038;h=86" alt="" width="300" height="86" /></a></p>
<p>In certain circumstances, you might find yourself with a need to install SQL Server Express on one of your Windows Azure worker roles. Exercise caution here though folks: this is not a supported design pattern (remember, a restart of your role instance will cause all data to be lost).</p>
<p>It was however exactly what I needed for my scenario and I thought I&#8217;d share it in case it serves a purpose for you.</p>
<p>There are a couple of approaches you can take, of course, one of which is &#8216;startup tasks&#8217; specified in the service definition files. However, these offered me limited configuration options because I needed to customise some of the command line arguments being passed to the installer based on values from the Role Environment itself.</p>
<p>The trickiest part was actually figuring out the correct command line parameters for SQL Server 2008 R2 Express, which to be honest wasn&#8217;t that fiddly at all. Here are the parameters you&#8217;ll need:</p>
<p><span style="color:#008000;"><em>/Q/ACTION=Install/FEATURES=SQLEngine,Tools /INSTANCENAME=YourInstanceName<br />
/HIDECONSOLE /NPENABLED=1 /TCPENABLED=1 /SQLSVCACCOUNT=&#8221;.\YourServiceAccount\&#8221; /SQLSVCPASSWORD=&#8221;YourServicePassword&#8221; /SQLSYSADMINACCOUNTS=&#8221;\.\ADMINACCOUNT&#8221; /IACCEPTSQLSERVERLICENSETERM S/INSTALLSQLDATADIR=&#8221;FullyQualifiedPathToFolder&#8221;</em></span></p>
<p>In the parameters above, we&#8217;re specifying a <em>silent</em>install with the <em>/Q</em>parameter, installing the SQL Database Engine and Management Tools (basic) with the <em>/FEATURES</em>parameter, setting the instance name, enabling named pipes and TCP, while setting service accounts and specifying the SQL data directory.</p>
<p>The next part then, is to actually build this as a command line and execute it in the cloud environment. How do we do this? Simples: we use System.Diagnostics to create a new <em>Process()</em>object and pass in a <em>ProcessStartInfo</em>object as a parameter:</p>
<p><pre class="brush: csharp;">
var taskInfo=new ProcessStartInfo
{
FileName=file,
Arguments=args,
Verb=&quot;runas&quot;,
UseShellExecute=false,
RedirectStandardOutput=true,
RedirectStandardError=true,
CreateNoWindow=false
};
//Starttheprocess
_process=new Process(){StartInfo=taskInfo,EnableRaisingEvents=true};
</pre></p>
<p>For good measure, we&#8217;ll also redirect the standard and error output streams from the process so that we can capture those out to our log files:</p>
<p><pre class="brush: csharp;">
//Logoutput
DataReceivedEventHandler outputHandler=(s,e)=&gt;Trace.TraceInformation(e.Data);
DataReceivedEventHandler errorHandler=(s,e)=&gt;Trace.TraceInformation(e.Data);

//Attachhandlers
_process.ErrorDataReceived+=errorHandler;
_process.OutputDataReceived+=outputHandler;
</pre></p>
<p>Then, we&#8217;ll execute our task and ask the role to wait for it to complete before continuing with startup:</p>
<p><pre class="brush: csharp;">
//Startprocess
_process.Start();
_process.BeginErrorReadLine();
_process.BeginOutputReadLine();

// Wait for the task to complete before continuing...
_process.WaitForExit();
</pre></p>
<p>Stick all of that into a method that you can re-use, and don&#8217;t forget to add parameters called <em>file</em>and <em>args</em>(strings) that contain the path to the SQL Server Express installation executable and the command line arguments you want to pass in.</p>
<p><strong>How to build your command line argument</strong></p>
<p>If you&#8217;re wondering why I didn&#8217;t hardcode my command line options, it&#8217;s because up in Azure, the standard builds for web and worker roles don&#8217;t come preloaded with any administrative accounts &#8211; you have to specify those during design time. I actually &#8216;borrow&#8217; the username of the Remote Desktop user (which is provisioned as an administrator for you when you ask to enable Remote Desktop).</p>
<p>I actually end-up with this quick-and-dirty snippet:</p>
<p><pre class="brush: csharp;">
stringfile=Path.Combine(UnpackPath,&quot;SQLEXPRWT_x64_ENU.exe&quot;);
stringargs=string.Format(&quot;/Q/ACTION=Install/FEATURES=SQLEngine,TOOLS/INSTANCENAME={2}/HIDECONSOLE/NPENABLED=1/TCPENABLED=1/SQLSVCACCOUNT=\&quot;.\\{0}\&quot;/SQLSVCPASSWORD=\&quot;{1}\&quot;/SQLSYSADMINACCOUNTS=\&quot;.\\{0}\&quot;/IACCEPTSQLSERVERLICENSETERMS/INSTALLSQLDATADIR=\&quot;{3}\&quot;&quot;, username,password,instanceName,dataDir);
</pre></p>
<p>So, ultimately, you&#8217;ll then want to wrap all of this up in to your role&#8217;s OnStart() method. Include a check to see whether SQL Express is already installed, too.</p>
<p>And, if you&#8217;re stuck trying to debug what&#8217;s going on with your otherwise silent installation, SQL Server Setup Logs are your friend. You&#8217;ll find them by connecting to your role via Remote Desktop and opening the following path:</p>
<blockquote><p>%programfiles%\Microsoft SQL Server\100\Setup Bootstrap\Log\</p></blockquote>
<p>Enjoy!</p>
<br />Filed under: <a href='http://blog.richard.parker.name/category/software-development/windows-azure-platform/'>Windows Azure Platform</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/brainthings.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/brainthings.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/brainthings.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/brainthings.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/brainthings.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/brainthings.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/brainthings.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/brainthings.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/brainthings.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/brainthings.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/brainthings.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/brainthings.wordpress.com/708/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/brainthings.wordpress.com/708/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/brainthings.wordpress.com/708/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=708&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.richard.parker.name/2012/01/02/unattended-sql-2008-installation-on-windows-azure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/eee6647666eed1d5751be36d79b0b341?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=PG" medium="image">
			<media:title type="html">Richard</media:title>
		</media:content>

		<media:content url="http://brainthings.files.wordpress.com/2012/01/azureunlimited.png?w=300" medium="image">
			<media:title type="html">azureunlimited</media:title>
		</media:content>
	</item>
		<item>
		<title>DDD Southwest 3 &#8211; Review of my presentation</title>
		<link>http://blog.richard.parker.name/2011/07/14/ddd-southwest-3-review-of-my-presentation/</link>
		<comments>http://blog.richard.parker.name/2011/07/14/ddd-southwest-3-review-of-my-presentation/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 21:00:10 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[Community Events]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[DDD]]></category>

		<guid isPermaLink="false">http://blog.richard.parker.name/?p=679</guid>
		<description><![CDATA[Way back on 11th June 2011, I was lucky enough to be invited to present my session &#8211; &#8220;Getting Started in .NET&#8221; &#8211; at the DDD Southwest 3 conference. I remember thinking, &#8220;gosh, I&#8217;d really love to speak at one of these events but I missed the deadline for submitting sessions&#8221;. So, I pinged an &#8230;<p><a href="http://blog.richard.parker.name/2011/07/14/ddd-southwest-3-review-of-my-presentation/" class="more-link">Read More</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=679&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div id="attachment_691" class="wp-caption alignleft" style="width: 310px"><a href="http://brainthings.files.wordpress.com/2011/07/slides.png"><img class="size-medium wp-image-691" title="Slides" src="http://brainthings.files.wordpress.com/2011/07/slides.png?w=300&#038;h=180" alt="" width="300" height="180" /></a><p class="wp-caption-text">Slides everywhere, but not a coherent flow in sight! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></div>
<p>Way back on 11th June 2011, I was lucky enough to be invited to present my session &#8211; &#8220;Getting Started in .NET&#8221; &#8211; at the <a href="http://www.dddsouthwest.com">DDD Southwest 3</a> conference. I remember thinking, &#8220;gosh, I&#8217;d really love to speak at one of these events but I missed the deadline for submitting sessions&#8221;. So, I pinged an email over to Guy Smith-Ferrier and asked him if they needed any help, thinking maybe they&#8217;d want <em>room monitors</em> or other volunteers to ferry folks around. As it turned-out, Guy actually still had two slots to be filled on the &#8216;Getting Started&#8217; track. And this is how my presentation was born&#8230;</p>
<h2>Nervous? Me?</h2>
<p>It was to be the first training session I&#8217;d ever given on a topic such as this, so I was both very excited and a little nervous (geeks can be so nit-picky!).</p>
<p>Fortunately though, the bunch of folks that attended my session (some 30-odd I think) were all very friendly and eager to listen &#8211; I couldn&#8217;t have asked for a better group!</p>
<h2>In the top 3? No way!</h2>
<p>In fact, I think they were so nice they voted me in to the Top 3 &#8220;Speakers by Knowledge of Subject&#8221; and &#8220;Speakers by Presentation Skills&#8221; &#8211; accolades that I will soon be transferring onto a tattoo on my forehead, such is the level of my humility (and astonishment!) at appearing here with these two other fantastic speakers. Maybe it had something to do with the fact I was lobbing &#8216;Telerik Ninjas&#8217; &#8211; stress toys &#8211; at anyone who asked a question (as a <em>reward</em>, folks &#8211; not as punishment)&#8230;</p>
<p><strong>By Knowledge of Subject</strong></p>
<ol>
<li>Steve Sanderson and <em>Getting Started in ASP.NET MVC</em> - 8.88 out of 10</li>
<li>Richard Campbell and <em>Why Web Performance Matters </em>- 8.85 out of 10</li>
<li>Richard Parker (that&#8217;s me!) and <em>Getting Started in The .NET Framework</em> - 8.56 out of 10</li>
</ol>
<div><strong>By Presentation Skills</strong></div>
<div>
<ol>
<li>Richard Campbell &#8211; 8.73 out of 10</li>
<li>Richard Parker &#8211; 8.33 out of 10</li>
<li>Steve Sanderson &#8211; 8.30 out of 10</li>
</ol>
<h2>Looking for the slides?</h2>
<p>If you attended and are looking for a copy of the presentation, you can download it below. Well, it&#8217;s actually a PDF &#8211; handier if you want to stick it on your Kindle, for example.</p>
<p><a href="http://brainthings.files.wordpress.com/2011/07/getting-started-with-net-sharing-version1.pdf">Getting started with .NET</a> (PDF, 2.4MB)</p>
<h2>Find out when your next DDD event is</h2>
</div>
<p>If you&#8217;ve never been to a <a href="http://developerdeveloperdeveloper.com/home/">DDD event</a>, then stop whatever it is you&#8217;re doing right now (well, after you&#8217;ve finished reading this post, of course) and go figure out when the next one is. They&#8217;re all over the place now &#8211; even Australia! It won&#8217;t cost you a penny to go as the events are all supported by sponsorship, so you&#8217;ve really got no excuse to go. The speakers are excellent (yes, <em>even </em>at the events I don&#8217;t speak at) and you&#8217;ll get a chance to mingle with some very friendly and amazing folks.</p>
<p>I&#8217;ve attended these events in the past as a delegate and have always had an absolutely brilliant time. And, this time around I was fortunate enough to be able to attend as a speaker; an experience I enjoyed thoroughly and would love to repeat again (if they, and you, Dear Reader) will have me again &#8230;</p>
<p>The .NET community, put simply, rocks. You guys are awesome!</p>
<br />Filed under: <a href='http://blog.richard.parker.name/category/software-development/community-events/'>Community Events</a>, <a href='http://blog.richard.parker.name/category/software-development/'>Software Development</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/brainthings.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/brainthings.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/brainthings.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/brainthings.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/brainthings.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/brainthings.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/brainthings.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/brainthings.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/brainthings.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/brainthings.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/brainthings.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/brainthings.wordpress.com/679/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/brainthings.wordpress.com/679/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/brainthings.wordpress.com/679/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=679&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.richard.parker.name/2011/07/14/ddd-southwest-3-review-of-my-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/eee6647666eed1d5751be36d79b0b341?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=PG" medium="image">
			<media:title type="html">Richard</media:title>
		</media:content>

		<media:content url="http://brainthings.files.wordpress.com/2011/07/slides.png?w=300" medium="image">
			<media:title type="html">Slides</media:title>
		</media:content>
	</item>
		<item>
		<title>Screencast: &#8220;To the cloud!&#8221; (In 90 seconds, or less)</title>
		<link>http://blog.richard.parker.name/2011/03/29/cloud-in-90-seconds/</link>
		<comments>http://blog.richard.parker.name/2011/03/29/cloud-in-90-seconds/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 16:30:20 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Windows Azure Platform]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[Windows Azure]]></category>

		<guid isPermaLink="false">http://blog.richard.parker.name/?p=577</guid>
		<description><![CDATA[I&#8217;ve spoken with a lot of developers recently who haven&#8217;t yet adopted the Windows Azure platform, often because they think the process is difficult, time-consuming or requires some kind of advanced ninja training to get up and running. This video will show you that it can be done in 90 seconds or less, without writing &#8230;<p><a href="http://blog.richard.parker.name/2011/03/29/cloud-in-90-seconds/" class="more-link">Read More</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=577&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve spoken with a lot of developers recently who haven&#8217;t yet adopted the Windows Azure platform, often because they think the process is difficult, time-consuming or requires some kind of advanced ninja training to get up and running.</p>
<blockquote><p>This video will show you that it can be done in 90 seconds or less, without writing a single line of code!</p></blockquote>
<p>In the screen cast, I&#8217;ll show you how to create a new Azure project in Visual Studio 2010, add a web role to the project, create a deployment package, upload it to the cloud, and then view it running in the cloud.</p>
<p>Before you begin though, head over to the Windows Azure site, and make sure you&#8217;ve activated a Windows Azure subscription. If you&#8217;re an MSDN or BizSpark subscriber, you get a free basic subscription anyway which is great for this demo. If you&#8217;re not, don&#8217;t worry, because until June 30th, Microsoft are giving you a free trial, too. Just get started at <a href="http://www.microsoft.com/windowsazure/free-trial/">http://www.microsoft.com/windowsazure/free-trial/</a>.</p>
<p>It&#8217;s seriously easy to do, so what are you waiting for &#8211; get going! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class='embed-vimeo' style='text-align:center;'><iframe src='http://player.vimeo.com/video/21636092' width='400' height='300' frameborder='0'></iframe></div>
<p><span style="color:#ff0000;"><br />
EDIT 30/03/2011:</span> In this video, I&#8217;ve shortened the &#8220;deployment&#8221; sequence to fit within the timeframe, but it should be noted it is normal for this part of the process to take anywhere between 15-30 minutes (while the Azure platform does what it does to spin up the resources it needs to run your solution). Thanks to all the watchers who pointed out that this fact was probably worth mentioning! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>As always, feedback is appreciated and welcome.</p>
<br />Filed under: <a href='http://blog.richard.parker.name/category/software-development/'>Software Development</a>, <a href='http://blog.richard.parker.name/category/software-development/windows-azure-platform/'>Windows Azure Platform</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/brainthings.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/brainthings.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/brainthings.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/brainthings.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/brainthings.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/brainthings.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/brainthings.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/brainthings.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/brainthings.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/brainthings.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/brainthings.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/brainthings.wordpress.com/577/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/brainthings.wordpress.com/577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/brainthings.wordpress.com/577/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=577&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.richard.parker.name/2011/03/29/cloud-in-90-seconds/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/eee6647666eed1d5751be36d79b0b341?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=PG" medium="image">
			<media:title type="html">Richard</media:title>
		</media:content>
	</item>
		<item>
		<title>The Lure of Azure</title>
		<link>http://blog.richard.parker.name/2011/03/26/the-lure-of-azure/</link>
		<comments>http://blog.richard.parker.name/2011/03/26/the-lure-of-azure/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 11:33:09 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Windows Azure Platform]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Lure of Azure]]></category>

		<guid isPermaLink="false">https://brainthings.wordpress.com/2011/03/26/the-lure-of-azure/</guid>
		<description><![CDATA[I gave a talk at Microsoft BizSparkCamp in London on March 25th, and I thought I’d follow that up with a blog post summarising some of the main benefits of deploying your next solution on Windows Azure. These reasons all form part of what I call the “Lure of Azure”. So here’s a taste of &#8230;<p><a href="http://blog.richard.parker.name/2011/03/26/the-lure-of-azure/" class="more-link">Read More</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=569&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I gave a talk at Microsoft BizSparkCamp in London on March 25th, and I thought I’d follow that up with a blog post summarising some of the main benefits of deploying your next solution on Windows Azure. These reasons all form part of what I call the “Lure of Azure”.</p>
<p>So here’s a taste of eight of the reasons I broadly covered in the talk:</p>
<p><strong>Reason #1: Financial<br /></strong>Building, deploying and maintaining a Windows Azure solution is likely to cost you far less than acquiring and maintaining your own physical infrastructure. If high availability and redundancy are important to you, I can pretty much guarantee you can’t do it cheaper or quicker than with the Azure platform.</p>
<p><strong>Reason #2: Forget hardware<br /></strong>Very few applications actually need to be run on dedicated physical hardware (“Co-location” etc). Windows Azure abstracts away all the hardware and gives you a platform upon which you deploy code only, and through configuration files, you can determine how much or how little of the resources will be available to your application. Let Windows Azure take away the strain of worrying about load-balancing and redundancy, as all that’s taken care of for you.</p>
<p><strong>Reason #3: Consolidation<br /></strong>The Windows Azure platform allows you to consolidate all your logical services under one account, with one control panel. That means you can instantly provision SQL Azure databases, and make use of infinitely scalable storage resources <em>on-demand </em>from a single point of administration, quickly and easily. Managing Windows Azure applications that utilise SQL Azure, Windows Azure storage and Compute is orders of magnitude easier than maintaining the equivalent physical infrastructure yourself.</p>
<p><strong>Reason #4: Scale up (and down)<br /></strong>If you’re going to buy a physical infrastructure, chances are you’ll over-specify and end up with a lot of spare capacity because you build-in a lot of what you don’t need <em>all the time</em>… I.E. you build to accommodate ‘peak’. That means you’d be paying for what you don’t need (or <em>use</em>) most of the time with any physical infrastructure. Windows Azure solutions can be scaled-up and down on demand, meaning you only ever pay for capacity when you need it.</p>
<p><strong>Reason #5: Build flexibility<br /></strong>If you build on physical infrastructure, when you need more of something (or less, for that matter), you end up messing about with hardware. If you lease (as many of us do), then that means contract variations, change requests, maintenance periods and perhaps even down-time but generally always <em>cost</em>. The Windows Azure platform lets you do all this stuff on-demand, with ease.</p>
<p><strong>Reason #6: Better global reach<br /></strong>Locating a physical data centre in one territory is one thing, but if you want truly global scale it pays to geographically distribute your resources to other territories as well. Co-location is an expensive way to do this, and then you have to think about how you’re going to replicate your data between all your data centres yourselves and the bottom line is: that’s tricky to say the least. Locating resources globally in Windows Azure is as easy as point-and-click.</p>
<p><strong>Reason #7: If you’re a .NET house already, it’s even easier<br /></strong>Using Visual Studio 2010? Know C#? Most of your existing code can run in the cloud immediately with just a few minor tweaks. <a href="http://www.microsoft.com/en-gb/cloud/developer/default.aspx">Go download the SDK</a> and start today.</p>
<p><strong>Reason #8: Flexibility to utilise all, or a part of the platform<br /></strong>Fed-up maintaining your own SQL database cluster? Running out of resources locally? Hosting company charging you too much for a SQL server database? Bung your database on SQL Azure and leave your app where it is. You can use the SQL Azure Migration Wizard to move your databases over to the cloud, then it’s just a simple matter of changing your connection strings in your code. Show me a simpler way of creating a triple-redundant SQL server instance!</p>
<p>There are many other reasons, of course, and I could expand on any of these along the way but the point of this post was to just get you thinking about some of the key advantages by summarising some of the points I discussed in my talk. Feel free to post comments!</p>
<br />Filed under: <a href='http://blog.richard.parker.name/category/software-development/'>Software Development</a>, <a href='http://blog.richard.parker.name/category/software-development/windows-azure-platform/'>Windows Azure Platform</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/brainthings.wordpress.com/569/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/brainthings.wordpress.com/569/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/brainthings.wordpress.com/569/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/brainthings.wordpress.com/569/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/brainthings.wordpress.com/569/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/brainthings.wordpress.com/569/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/brainthings.wordpress.com/569/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/brainthings.wordpress.com/569/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/brainthings.wordpress.com/569/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/brainthings.wordpress.com/569/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/brainthings.wordpress.com/569/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/brainthings.wordpress.com/569/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/brainthings.wordpress.com/569/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/brainthings.wordpress.com/569/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=569&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.richard.parker.name/2011/03/26/the-lure-of-azure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/eee6647666eed1d5751be36d79b0b341?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=PG" medium="image">
			<media:title type="html">Richard</media:title>
		</media:content>
	</item>
		<item>
		<title>Open-source FTP-to-Azure blob storage: multiple users, one blob storage account</title>
		<link>http://blog.richard.parker.name/2010/08/02/azure-ftp-server/</link>
		<comments>http://blog.richard.parker.name/2010/08/02/azure-ftp-server/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 06:45:59 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[Microsoft.NET]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Windows Azure Platform]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[ftp]]></category>

		<guid isPermaLink="false">http://blog.richard.parker.name/?p=463</guid>
		<description><![CDATA[A little while ago, I came across an excellent article by Maarten Balliauw in which he described a project he was working on to support FTP directly to Azure&#8217;s blob storage. I discovered it while doing some research on a similar concept I was working on. At the time of writing this post though, Maarten wasn&#8217;t  sharing &#8230;<p><a href="http://blog.richard.parker.name/2010/08/02/azure-ftp-server/" class="more-link">Read More</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=463&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A little while ago, I came across an excellent <a href="http://blog.maartenballiauw.be/post/2010/03/15/Using-FTP-to-access-Windows-Azure-Blob-Storage.aspx">article</a> by Maarten Balliauw in which he described a project he was working on to support FTP directly to Azure&#8217;s blob storage. I discovered it while doing some research on a similar concept I was working on. At the time of writing this post though, Maarten wasn&#8217;t  sharing his source code and even if he did decide to at some point soon, his project appears to focus on permitting access to the <em>entire</em> blob storage account. This wasn&#8217;t really what I was looking for but it was very similar&#8230;</p>
<h3>My goal: FTP to Azure blobs, many users: one blob storage account with &#8216;home directories&#8217;</h3>
<p>I wanted a solution to enable multiple users to access the <em>same </em>storage account, but to have their own unique portion of it &#8211; thereby mimicking an actual FTP server. A bit like giving authenticated user&#8217;s their own &#8216;home folder&#8217; on your Azure Blob storage account.</p>
<p>This would ultimately give your Azure application the ability to accept incoming FTP connections and store files directly into blob storage via any popular FTP client &#8211; mimicking a file and folder structure and permitting access only to regions of the blob storage account you determine. There are many potential uses for this kind of implementation, especially when you consider that blob storage can feed into the Microsoft CDN&#8230;</p>
<h3>Features</h3>
<ul>
<li>Deploy within a worker-role</li>
<li>Support for most common FTP commands</li>
<li>Custom authentication API: because you determine the authentication and authorisation APIs, you control who has access to what, quickly and easily</li>
<li>Written in C#</li>
</ul>
<h3>How it works</h3>
<p>In my implementation, I wanted the ability to literally &#8216;fake&#8217; a proper FTP server to any popular FTP client: the server component to be running on Windows Azure. I wanted to have some external web service do my authentication (you could host <em>yours</em> on Windows Azure, too) and then only allow each user access to their own tiny portion of my Azure Blob Storage account.</p>
<p>It turns out, Azure&#8217;s containers did exactly what I wanted, more or less. All I had to do was to come up with a way of authenticating clients via FTP and returning which container they have access to (the easy bit), and write an FTP to Azure &#8216;bridge&#8217; (adapting and extending <a href="http://www.codeguru.com/csharp/csharp/cs_internet/desktopapplications/article.php/c13163">a project by Mohammed Habeeb</a> to run in Azure as a worker role).</p>
<p>Here&#8217;s how my first implementation works:</p>
<p><img class="size-full wp-image-471 alignnone" title="FTP to Azure Bridge - How it Works" src="http://brainthings.files.wordpress.com/2010/07/azureftp.jpg?w=720" alt=""   /></p>
<h3>A quick note on authentication</h3>
<p>When an FTP client authenticates, I grab the username and password sent by the client, pass that into my web service for authentication, and if successful, I return a container name specific to that customer. In this way, the remote user can only work with blobs within that container. In essence, it is their own &#8216;home directory&#8217; on my master Azure Blob Storage account.</p>
<p>The FTP server code will deny authentication for any user who does not have a container name associated with them, so just return null to the login procedure if you&#8217;re not going to give them access (I&#8217;m assuming you don&#8217;t want to return a different error code for &#8216;bad password&#8217; vs. &#8216;bad username&#8217; &#8211; which is a good thing).</p>
<p>Your authentication API could easily be adapted to permit access to the same container by multiple users, too.</p>
<h3>Simulating a regular file system from blob storage</h3>
<p>Azure Blob Storage doesn&#8217;t work like a traditional disk-based system in that it doesn&#8217;t actually have a hierarchical <em>directory </em>structure &#8211; but the FTP service simulates one so that FTP clients can work in the traditional way. Mohammed&#8217;s initial C# FTP server code was superb: he wrote it so that the file system could be replaced back in 2007 &#8211; to my knowledge, before Azure existed, but it&#8217;s like he <em>meant</em> for it to be used this way (that is to say, it was so painless to adapt it one could be forgiven for thinking this. Mohammed, thanks!).</p>
<p>Now I have my FTP server, modified and adapted to work for Azure, there are many ways in which this project can be expanded&#8230;</p>
<h3>Over to you (and the rest of the open source community)</h3>
<p>It&#8217;s my first open source project and I actively encourage you to help me improve it. When I started out, most of this was &#8216;proof of concept&#8217; for a similar idea I was working on. As I look back over the past few weekends of work, there are many things I&#8217;d change but I figured there&#8217;s enough here to make a start.</p>
<p>If you decide to use it &#8220;as is&#8221; (something I don&#8217;t advise at this stage), do remember that it&#8217;s not going to be perfect and you&#8217;ll need to do a little leg work &#8211; it&#8217;s a work in progress and it wasn&#8217;t written (at least initially) to be an open-source project. Drop me a note to let me know how you&#8217;re using it though, it&#8217;s always fun to see where these things end up once you&#8217;ve released them into the wild.</p>
<h3>Where to get it</h3>
<p>Head on over to the <a href="http://ftp2azure.codeplex.com/">FTP to Azure Blob Storage Bridge</a> project on <a href="http://ftp2azure.codeplex.com/">CodePlex</a>.</p>
<p>It&#8217;s free for you to use however you want. It carries all the usual caveats and warnings as other &#8216;free open-source&#8217; software: use it at your own risk.</p>
<p>If you do use it and it works well for you, drop me an email and it&#8217;ll make me happy. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />Filed under: <a href='http://blog.richard.parker.name/category/software-development/microsoftnet/'>Microsoft.NET</a>, <a href='http://blog.richard.parker.name/category/projects/open-source/'>Open Source</a>, <a href='http://blog.richard.parker.name/category/projects/'>Projects</a>, <a href='http://blog.richard.parker.name/category/software-development/'>Software Development</a>, <a href='http://blog.richard.parker.name/category/technology/'>Technology</a>, <a href='http://blog.richard.parker.name/category/software-development/windows-azure-platform/'>Windows Azure Platform</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/brainthings.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/brainthings.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/brainthings.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/brainthings.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/brainthings.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/brainthings.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/brainthings.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/brainthings.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/brainthings.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/brainthings.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/brainthings.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/brainthings.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/brainthings.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/brainthings.wordpress.com/463/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=463&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.richard.parker.name/2010/08/02/azure-ftp-server/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/eee6647666eed1d5751be36d79b0b341?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=PG" medium="image">
			<media:title type="html">Richard</media:title>
		</media:content>

		<media:content url="http://brainthings.files.wordpress.com/2010/07/azureftp.jpg" medium="image">
			<media:title type="html">FTP to Azure Bridge - How it Works</media:title>
		</media:content>
	</item>
		<item>
		<title>An introduction to Windows Azure (for Busy People)</title>
		<link>http://blog.richard.parker.name/2010/06/30/an-introduction-to-windows-azure-for-busy-people/</link>
		<comments>http://blog.richard.parker.name/2010/06/30/an-introduction-to-windows-azure-for-busy-people/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 04:52:30 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Windows Azure Platform]]></category>
		<category><![CDATA[Azure]]></category>

		<guid isPermaLink="false">https://brainthings.wordpress.com/?p=450</guid>
		<description><![CDATA[I decided to write this post to provide a little technical information aimed at non-programmers (Project Managers, Department Heads and other Busy People) who want to know more about the platform; how it works and what it offers. My goal is that, after reading this article, you’ll have a basic – yet thorough – understanding &#8230;<p><a href="http://blog.richard.parker.name/2010/06/30/an-introduction-to-windows-azure-for-busy-people/" class="more-link">Read More</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=450&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>
<p>I decided to write this post to provide a little technical information aimed at non-programmers (Project Managers, Department Heads and other <em>Busy People</em>) who want to know more about the platform; how it works and what it offers. My goal is that, after reading this article, you’ll have a basic – yet thorough – understanding of how Azure is structured so that you can make informed contributions to discussions regarding the platform. This is a work in progress.</p>
<p></p>
<p>Some of the analogies used in the following article are designed to facilitate understanding on a functional level, and may therefore be technically &#8216;inaccurate&#8217;. If you&#8217;ve picked that up, you&#8217;re probably more technical than this author had in mind as the intended audience!</p>
<p></p>
<p>As always, we&#8217;re all learning &#8211; if you have ideas or suggestions for improving this article, please feel free to leave a comment. Thanks!</p>
<h3>Table of Contents</h3>
<ol>
<li><a href="#Intro">Introduction</a></li>
<li><a href="#Roles">Web Roles and Worker Roles</a></li>
<li><a href="#Resources">Resources</a></li>
<li><a href="#Storage">Storage</a>
<ul>
<li><a href="#BlocksAndPages">Blocks and Pages</a></li>
</ul>
<ul>
<li><a href="#Addressing">Addressing blobs</a></li>
</ul>
</li>
<li><a href="#Databases">Databases</a></li>
</ol>
<hr />
<h2><strong> <a name="Intro"></a>An introduction to Windows Azure (for Busy People)</strong></h2>
<p>In the Azure world, you can have databases and applications all running in the cloud environment. By now, most of us know that a ‘cloud environment’ in its most basic form describes an environment in which you don’t ever see or touch the physical hardware or infrastructure as these are determined, managed and provided for you by the cloud service provider.</p>
<p></p>
<p>Developing and deploying applications onto the Azure platform requires a different approach to traditional application development, but developers can still continue to use all their existing tools (such as Visual Studio 2010) and don’t require any new software to get started. In fact, it&#8217;s actually possible to write applications for the Azure platform using the free Expression edition products provided by Microsoft.</p>
<p></p>
<p>Physically coding your applications, however, does require developers to change the way in which they build their applications, if only a little. That&#8217;s really a topic best left for someone else, or another post, to address.</p>
<p></p>
<p>On Azure, applications are referred to as ‘roles’, and there are two types of role: a “web role” or a “worker role”.</p>
<p></p>
<p>Think of a web role as a web <em>site</em><sup><em><a href="#1">1</a></em></sup>, and a worker role as some repetitive computational task that takes place behind-the-scenes without any user interface at all (a good example would be processing statistical data, or – to use examples from other blogs – a thumbnail generator for images).</p>
<h3>Roles<span style="font-weight:normal;font-size:13px;"><a name="Roles"></a></span></h3>
<p>Web Roles are similar to web servers, in that they allow public computers to connect to your application over standard HTTP and HTTPS ports. Typical Azure deployments consist of one – maybe two – web roles, and a number of worker roles. Worker roles are also publically accessible; that is they can talk to each other and the outside world, and other Azure services.</p>
<p></p>
<p>
<blockquote>It is important to note, however, that one web role is not <em>actually</em> a web server in and of itself. It is simply an instance of your software running on a web server that is publically accessible.</p></blockquote>
<p>Azure would not be complete without two other key service offerings: storage (some place to store all your data) and SQL Azure (a variation of SQL Server, which provides relational database capabilities to your cloud applications deployed on the Azure platform).</p>
<p></p>
<p>To recap then, Azure is a platform that provides:</p>
<ul>
<li>Some place to run your applications from (via web and worker roles)</li>
<li>Some place to store all your application files</li>
<li>SQL Azure – a relational database like SQL Server</li>
</ul>
<p>Each of these functional areas are referred to as ‘hosted services’, and as you might expect there are limitations imposed by Microsoft as to the amount of resources available to each service.</p>
<h3>Resources <span style="font-weight:normal;font-size:13px;"><a name="Resources"></a></span></h3>
<p>Though theoretically unlimited, in order to ensure all customers have resources available when required, Azure packages and limits what resources are available to specific deployments. Databases, storage and application instances are artificially capped according to the current limits (published online <sup><em><a href="#2">2</a></em></sup>, updated regularly and these are commonly expected to grow over time).</p>
<p></p>
<p>Web and worker roles come in four varieties: small, medium, large and extra-large. That’s because they are actually <a href="http://en.wikipedia.org/wiki/Virtual_machine">virtual machines</a> (VM’s – software &#8216;simulations’ of physical servers, many copies of which can run on a single physical server). Each represents an increase in pricing and has a different set of specifications that govern how much RAM, local storage space and CPU cores are available to the role as described below:</p>
<table border="1" cellspacing="0" cellpadding="5" width="703">
<tbody>
<tr>
<td width="191">Size</td>
<td width="106">CPU Cores</td>
<td width="122">Memory</td>
<td width="282">Disk Space for Local Storage Resources</td>
</tr>
<tr>
<td width="191" valign="top"><strong>Small</strong></td>
<td width="106" valign="top">1</td>
<td width="122" valign="top">1.7 GB</td>
<td width="282" valign="top">250 GB</td>
</tr>
<tr>
<td width="191"><strong>Medium</strong></td>
<td width="106">2</td>
<td width="122">3.5 GB</td>
<td width="282" valign="top">500 GB</td>
</tr>
<tr>
<td width="191" valign="top"><strong>Large</strong></td>
<td width="106" valign="top">4</td>
<td width="122" valign="top">7 GB</td>
<td width="282" valign="top">1000 GB</td>
</tr>
<tr>
<td width="191" valign="top"><strong>Extra-large</strong></td>
<td width="106" valign="top">8</td>
<td width="122" valign="top">14 GB</td>
<td width="282" valign="top">2000 GB</td>
</tr>
</tbody>
</table>
<p>Each VM is provisioned when required. The ‘magic’ of Windows Azure is that when you provision a VM, the Azure platform actually provisions a further two identically configured VMs. One acts as a recovery image, the other as a failover. If Azure detects a fault condition, it takes appropriate steps to automatically recover the damaged VM.</p>
<p></p>
<p>This is one of the most useful features of Azure, and you get it for ‘free’ – i.e., you don’t need to do anything particularly special to get this to happen, it’s simply a by-product of deploying your applications on to Azure.</p>
<h4>Getting to Azure</h4>
<p>To utilise Azure, you need an Azure services account (one per customer). Each account has the following overall limitations<a name="_ftnref1_5131"></a>:</p>
<ul>
<li>Maximum 20 hosted service projects (projects contain instances)</li>
<li>Maximum 5 storage accounts</li>
<li>Limitation of 5 roles per hosted service project (i.e. 3 different web roles and two different worker roles, or any such combination)</li>
<li>20 CPU cores across <em>all</em> of the hosted service projects</li>
</ul>
<p>Configurations of the Azure platform represent significant architectural decisions as deployments not only require the correct determination of ‘size’ but also the appropriate number of ‘instances’ of that deployment which will concurrently run. It is possible, therefore, to have two instances of a ‘small’ worker role running the same application. This would consume two of your maximum 20 cores. It is worth mentioning at this point that one can, at any time, reconfigure a deployed instance to utilise a larger VM or have a higher instance count, but that some (relatively minor) downtime would be incurred.</p>
<h3>Storage<span style="font-weight:normal;font-size:13px;"><a name="Storage"></a></span></h3>
<p>Storage in the cloud doesn’t work like any traditional disk-based system. That is, you’ll never have a “C:\” drive or a “D:\” drive<sup><em><a href="#3">3</a></em></sup> (local storage is a topic I&#8217;m not going to cover here). The Azure platform makes disk space available as three distinct entities: <em>Blobs (block and page)</em>, <em>Tables</em> and <em>Queues</em>. These three entities essentially abstract space on physical disks away into different logical units, within which programmers will never be able to ‘see’ the underlying disks or access them directly. This looks a little something like this:</p>
<p></p>
<p>﻿<a href="http://brainthings.files.wordpress.com/2010/06/azurestorage.jpg"><img class="size-largewp-image-460 alignnone" style="border:1px solid black;margin:5px 0;" title="Azure Storage Logical Layout" src="http://brainthings.files.wordpress.com/2010/06/azurestorage.jpg?w=300&#038;h=78" alt="" width="300" height="78" /></a></p>
<p></p>
<p>Blobs are stored within containers and you can have as many containers as you can fit within your storage account quota. They&#8217;re a bit like folders, but only if you consider that you get to name them once they are created, and they cannot contain subfolders (or sub-containers, for that matter). Azure <em>tables</em> aren’t like tables in relational databases such as SQL Server or Microsoft Access, while <em>queues</em> provide a mechanism through which web and worker roles can talk to each other (instance A sends a message to instance B, which might – but doesn’t have to – process the message right away, hence why it is called a <em>queue</em>).</p>
<h4>Block blobs and Page blobs<span style="font-weight:normal;font-size:13px;"><a name="BlocksAndPages"></a></span></h4>
<p>Block blobs are optimised for streaming, while Page blobs are optimised for random read/write operations. Block blobs are targeted towards streaming operations specifically because writing them is a two step process: first, you upload all of the individual blocks that will comprise the blob. Next, you must <em>commit</em> the blocks via a <em>block list</em>. During the commit phase, you can add/change or remove blocks from the blob. Page blobs, on the other hand, are updated immediately &#8211; no commit phase is required.Page blobs consist of an array of pages, where each page is 512 bytes and the blob size must be a multiple of 512 bytes.</p>
<p></p>
<p>Both block and Page blobs can be read from any byte offset in the blob, meaning it&#8217;s possible to read only a specific &#8216;chunk&#8217; of either blob when it is on Azure Storage.</p>
<h4>Page blobs: primary characteristics</h4>
<p>Page blobs are fast and range-based, which means you can read from and write to specific ranges of a blob at a time. Page blobs are initialised with a Maximum Size, but if only half the blob contains data, you&#8217;re only charged for what you actually store in the blob. Page blobs also support leasing, which means it is possible for your application to &#8216;lock&#8217; a specific range of the page blob while it is updating it, then release the lock.</p>
<p></p>
<p>The <a href="http://blogs.msdn.com/b/windowsazurestorage/archive/2010/04/11/using-windows-azure-page-blobs-and-how-to-efficiently-upload-and-download-page-blobs.aspx?wa=wsignin1.0">Windows Azure Storage</a> blog has this to say about Page Blobs:</p>
<blockquote><p>Another use of Page Blobs is to use them for custom logging for their applications.  For example, for a given role instance, when the role starts up a Page Blob can be created for some MaxSize, which is the max amount of log space the role wants to use for a day.   The given role instance can then write its logs using up to 4MB range-based writes, where a header provides metadata for the size of the log entry, timestamp, etc.   When the Page Blob is filled up, then treat the Page Blob as a circular buffer and start writing from the beginning of the Page Blob, or create a new page blob, depending upon how the application wants to manage the log files (blobs).   With this type of approach you can have a different Page Blob for each role instance so that there is just a single writer to each page blob for logging.  Then to know where to start writing the logs on role failover the application can just create a new Page Blob if a role restarts, and GC the older Page Blobs after a given number of hours or days.  Since you are not charged for pages that are empty, it doesn’t matter if you don’t fill the page blob up.</p></blockquote>
<h4>Block blobs: characteristics</h4>
<p>Block blobs consist of, well, blocks! I&#8217;d say, in my experience, most people would want to be using block blobs over page blobs because they&#8217;re a little more flexible in terms of their sizing. For instance, a block blob does not have to declare its size when you create it: you just keep adding blocks to the blob until you&#8217;re done. There&#8217;s another benefit, too. With block blobs, you can send blocks in any sequence, then arrange them later on when you call your commit function. This makes them ideally suited to transferring large files, where your client is able to use a few threads to send the file in chunks.</p>
<h4>Understanding the limitations of block and page blobs</h4>
<p>Storage, like the other Azure services, is also subject to some limitations (and its own pricing structure), and the current limits are described in Table 3 below:</p>
<table border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td width="217" valign="top">Characteristic</td>
<td width="387" valign="top">Limit</td>
</tr>
<tr>
<td width="217" valign="top"><strong>Blob </strong>(block and page blob)</td>
<td width="387" valign="top">Maximum 200 GB</td>
</tr>
<tr>
<td width="217" valign="top"><strong>Block</strong></td>
<td width="387" valign="top">4MB maximum size, 64KB minimum size</td>
</tr>
<tr>
<td width="217" valign="top"><strong>Overall storage limit</strong></td>
<td width="387" valign="top">100 TB</td>
</tr>
</tbody>
</table>
<p><span style="font-weight:normal;">You can mix and match block and page blobs within your account, but a block blob cannot suddenly &#8216;become&#8217; a page blob, or vice versa. Once a blob is created as one particular type, it will always remain that type. A block blob cannot contain pages, and a page blob cannot contain blocks for instance.</span></p>
<h4>Addressing blobs<span style="font-weight:normal;"><a name="Addressing"></a></span></h4>
<p>Blobs aren’t accessed or written to like traditional file systems, with a nice <em>path-to-folder-and-filename</em> approach (e.g. “C:\My Documents\My File.jpg”). Blobs use <em>URIs</em> to organise their data, e.g.:</p>
<p><em></p>
<p>http://myservice.blob.core.windows.net/accountname/containername/</p>
<p>blobname/which/can/have/slashes/but/dont/represent/folders/file.jpg</em>.</p>
<p></p>
<p>It is precisely because this system is URI-based that it can be so vast and resilient to failure, as there are many copies of each individual physical drive. Therefore, it’s safe to say that when you upload a file to Azure and store it in blob storage, it’s pretty safe!</p>
<p></p>
<p>Earlier, I explained that a blob should be thought of as a container for files. This is not strictly true, but the analogy is very similar. In actuality, blobs are containers for <em>blocks </em>(chunks of a single file) and <em>pages</em> (more on those below)<em>, </em>and blobs are actually organised into containers themselves. One file may be one block (if it is under 4MB in size; the maximum size limit for a block), or it may be several thousand. If the file is over 64MB in size, it <em>must</em> be split into blocks. Azure, perhaps confusingly has two varieties of blob storage: <em>block </em>and <em>page.</em></p>
<p></p>
<p>Let it suffice to say that <em>block<strong> </strong></em>blobs can be no larger than 200GB, and <em>page</em> blobs can be no larger than 1TB. Any combination of the latter must not exceed 1 TB. You can therefore see that the storage system in Azure is much more complex than the traditional system we are used to, but that it offers significant advantages over the former.</p>
<h3>Databases: SQL Azure<span style="font-weight:normal;font-size:13px;"><a name="Databases"></a></span></h3>
<p>Microsoft has redesigned some of their core applications (such as SQL Server) to work specifically on the Azure platform, and as such, they have some very appealing advantages over the versions of the products that you can buy commercially.<sup><em><a href="#4">4</a></em></sup></p>
<p></p>
<p>In typical server-based implementations of SQL Server, it is common to find one server acting as the master while the other one monitors it to take over should it fail (the slave). This means the database is subject to the limitations of that server (storage space, processing power and bandwidth). It also means that although you have two servers powered on and dedicated to the task of serving a database, only <strong>one</strong> is ever actually working at any one time, which represents half the total available computing power and is a good example of why paying for hardware through a traditional hosting company is actually a less appealing concept.</p>
<p></p>
<p>On Azure, SQL Server has become <em>SQL Azure</em> – and now, the concept of master/slaves has gone and you have multiple servers all serving the same database, resulting in massively higher processing power and greater throughput capacity. What this ultimately means is that one can work with that database much more quickly than one can with SQL Server.</p>
<p></p>
<p>Now, there are some fundamental differences between SQL Azure and SQL Server. For example, one cannot do everything one can with SQL Server within SQL Azure. Bear that in mind when your developers explain this to you, as the two products are not <em>exactly</em> the same.</p>
<p></p>
<p>Databases require somewhere to store their data. SQL Azure has the following database packages available:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="217" valign="top">Maximum database size</td>
<td width="387" valign="top">Monthly standing charge (USD)</td>
</tr>
<tr>
<td width="217" valign="top"><strong>5 GB</strong></td>
<td width="387" valign="top">$49.95</td>
</tr>
<tr>
<td width="217" valign="top"><strong>10 GB</strong></td>
<td width="387" valign="top">$99.99</td>
</tr>
<tr>
<td width="217" valign="top"><strong>20 GB</strong></td>
<td width="387" valign="top">$199.98</td>
</tr>
<tr>
<td width="217" valign="top"><strong>30 GB</strong></td>
<td width="387" valign="top">$299.97</td>
</tr>
<tr>
<td width="217" valign="top"><strong>40 GB</strong></td>
<td width="387" valign="top">$399.96</td>
</tr>
<tr>
<td width="217" valign="top"><strong>50 GB</strong></td>
<td width="387" valign="top">$499.95</td>
</tr>
</tbody>
</table>
<p>In addition, data transfer charges apply to the standing monthly charge:</p>
<table border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td width="143" valign="top">Region</td>
<td width="247" valign="top">Direction</td>
<td width="216" valign="top">Charge / GB (USD)</td>
</tr>
<tr>
<td width="143" valign="top"><strong>World (exc. Asia)</strong></td>
<td width="247" valign="top">Inbound</td>
<td width="216" valign="top">$0.10</td>
</tr>
<tr>
<td width="143" valign="top"><strong>World (exc. Asia)</strong></td>
<td width="247" valign="top">Outbound</td>
<td width="216" valign="top">$0.15</td>
</tr>
</tbody>
</table>
<p>SQL Azure offers the opportunity to pay only for what one actually uses. The standing monthly charges are amortised over the month and you only pay for the days on which you actually have the databases in each specific tier. This makes it a very cost-effective way to purchase database space in the cloud.</p>
<p></p>
<p>Also, being based on the Azure platforms means that there are a number of additional advantages<strong>:</strong></p>
<ul>
<li>Data stored in an automatic high-availability environment<strong> </strong></li>
<li>Fault tolerance included<strong> </strong></li>
<li>99.9% “Monthly Availability” SLA <sup><em><a href="#5">5</a></em></sup></li>
</ul>
<p>This concludes our basic high-level introduction to the Windows Azure platform and I hope you have enjoyed reading it. If you have questions, feel free to post them in the comments below and I’ll do my best to answer them.</p>
<p></p>
<hr size="1" />
<p></p>
<p>Foot notes:</p>
<p></p>
<p><a name="1"></a> A web role does not <em>have</em> to be a web <em>site</em> – it could be a web service, such as an API. A web role is publically accessible via the World Wide Web.</p>
<p></p>
<p><a name="2"></a> Available at <a href="http://msdn.microsoft.com/en-us/library/ee814754.aspx">http://msdn.microsoft.com/en-us/library/ee814754.aspx</a></p>
<p></p>
<p><a name="3"></a> Service quotas are expected to grow over time and automatically become available to hosted services.</p>
<p></p>
<p><a name="4"></a> “Local storage” excepted; in this document I am discussing globally available storage.</p>
<p></p>
<p><a name="5"></a> Azure is a proprietary technology and no company can install their own private instance of it. Microsoft software written purely for Azure is not available to any third party to install and host on their own infrastructure.</p>
<p></p>
<p><a name="6"></a> See <a href="http://www.microsoft.com/windowsazure/sla/">http://www.microsoft.com/windowsazure/sla/</a> for all the Azure platform SLAs</p>
<p></p>
<br />Filed under: <a href='http://blog.richard.parker.name/category/software-development/'>Software Development</a>, <a href='http://blog.richard.parker.name/category/software-development/windows-azure-platform/'>Windows Azure Platform</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/brainthings.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/brainthings.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/brainthings.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/brainthings.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/brainthings.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/brainthings.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/brainthings.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/brainthings.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/brainthings.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/brainthings.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/brainthings.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/brainthings.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/brainthings.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/brainthings.wordpress.com/450/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=450&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.richard.parker.name/2010/06/30/an-introduction-to-windows-azure-for-busy-people/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/eee6647666eed1d5751be36d79b0b341?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=PG" medium="image">
			<media:title type="html">Richard</media:title>
		</media:content>

		<media:content url="http://brainthings.files.wordpress.com/2010/06/azurestorage.jpg?w=300" medium="image">
			<media:title type="html">Azure Storage Logical Layout</media:title>
		</media:content>
	</item>
		<item>
		<title>How to speed up your ASP.NET web application</title>
		<link>http://blog.richard.parker.name/2009/08/05/how-to-speed-up-your-asp-net-web-application/</link>
		<comments>http://blog.richard.parker.name/2009/08/05/how-to-speed-up-your-asp-net-web-application/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 21:40:20 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Microsoft.NET]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[CDNs]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://blog.richard.parker.name/?p=339</guid>
		<description><![CDATA[If your web site is slow, it&#8217;s annoying to your customers. It&#8217;s annoying because nobody likes to wait: we wait all day in the physical world: in queues at the shops, at the restaurant and even on the telephone. We&#8217;re always looking for &#8216;faster&#8217;, because in our web consumer minds, &#8220;faster equals better&#8221;. In my personal &#8230;<p><a href="http://blog.richard.parker.name/2009/08/05/how-to-speed-up-your-asp-net-web-application/" class="more-link">Read More</a></p><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=339&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If your web site is slow, it&#8217;s annoying to your customers. It&#8217;s annoying because nobody likes to wait: we wait all day in the physical world: in queues at the shops, at the restaurant and even on the telephone. We&#8217;re always looking for &#8216;faster&#8217;, because in our web consumer minds, &#8220;faster equals better&#8221;. In my personal experience as a software developer, most users share at least one principle:</p>
<blockquote><p><strong>Better responsiveness equals a better product<br />
</strong>- A. Customer</p></blockquote>
<p>If your application is simple and responsive, people will use it. If it is clunky and slow to load, people are forced to wait. Think of your application (it doesn&#8217;t matter if it&#8217;s a web or a desktop application) as a racing car. As the manufacturer of that car, you&#8217;ll want customers to come and test drive it. You&#8217;ll hope that they&#8217;ll fall in love with it after driving it, and want to buy it. If that test drive is a good experience, they&#8217;ll hopefully part with some of their hard earned cash to pay for it &#8211; and bingo, you&#8217;ve done what you needed to do: make the sale. </p>
<p>The same principle applies to software: if you deliver a fast, responsive application with a quick user interface, your users are more likely to think you&#8217;ve built a better product &#8211; (whether that&#8217;s right or technically wrong), because to Mr and Mrs User, a slow application is a bad one.</p>
<blockquote><p><strong>You can optimise your web site in just a few steps</strong></p></blockquote>
<p>As an ASP.NET developer, here&#8217;s a look (or a reminder) at some of the things you can look at doing before deciding it&#8217;s time to dig under the hood and start to make more fundamental changes in your application:</p>
<h2>Disable debugging in your web.config</h2>
<p>When you release an application in debug mode, ASP.NET forces certain files to be sent to the client with each request, instead of allowing the browser to cache them. Most people forget to switch debug mode off when they release. This creates an overhead for your server, and a longer wait for the client. Debug mode also causes other changes in your web application: think of it as a bloaty way to release because it has to include data and various hooks to allow you to debug the application that aren&#8217;t necessary in order to run it:</p>
<p><pre class="brush: xml;">&lt;compilation debug=&quot;false&quot;/&gt;</pre></p>
<p>You&#8217;ll find the above line in your web.config file.</p>
<h2>Enable IIS Request Compression</h2>
<p>Request compression is a feature of Internet Information Services 6 and above that causes content to be compressed before transmission to the client, and then decompressed by the browser. Most modern browsers support this, and enabling it requires no modification to your web site at all. Do bear in mind that request compression will force your web server to work harder because it has to first compress data before sending it. This creates a small spike in CPU usage, for low to medium traffic web sites that really need a performance boost the extra CPU usage will more than likely be absorbed just fine.</p>
<p><strong>In Internet Information Services 6:</strong></p>
<ol>
<li>Launch IIS Manager</li>
<li>Right-click the &#8220;Web Sites&#8221; node</li>
<li>Click &#8220;Properties&#8221;</li>
<li>Select the &#8220;Service&#8221; tab</li>
<li>Tick &#8220;Compress application files&#8221; and &#8220;Compress static files&#8221;. Be sure to specify a temporary directory with sufficient free resources and consider adding a maximum limit to the temporary directory size.</li>
<li>Click &#8220;Apply&#8221;</li>
<li>Click &#8220;OK&#8221;</li>
</ol>
<p>Request compression isn&#8217;t for everybody &#8211; be sure to weigh the pro&#8217;s and con&#8217;s for your particular environment.</p>
<h2>Use page output caching</h2>
<p>By default, IIS thinks that your ASP.NET page is dynamic. In many applications, however, not all the pages actually are. Even if they do rely on a database for content, oftentimes it&#8217;s not necessary to hit the database on each request to the page. Output caching can be enabled on a particular page by adding one line of code to the top of your ASPX file. It is a directive that informs .NET to keep a copy of the rendered page, and serve the copy (rather than the original) from disk each time it is called. This would include, for example, any database generated content from controls on the page itself, or any embedded user controls.</p>
<p><pre class="brush: xml;">&lt;%@ OutputCache Duration=&quot;10&quot; VaryByParam=&quot;none&quot;%&gt;</pre></p>
<p>Page output caching can be an extremely effective way to improve your web site&#8217;s performance and responsiveness. It&#8217;s a lot more flexible than I&#8217;ve explained here, and you should be aware that there are all manner of ways in which you can control the cached version of the page (for instance, you can modify the directive to have different cached versions of the page based on a URL parameter). For more information, see the <a href="http://msdn.microsoft.com/en-us/library/ms972362.aspx">MSDN documentation</a>.</p>
<h2>Next steps</h2>
<p>When you&#8217;ve done these things, if your application could still use a boost, it&#8217;s time to start profiling. You&#8217;ve tried the &#8216;quick fixes&#8217; &#8211; the 10 minute jobs that are more-than-likely going to make things better, but there&#8217;s always a chance the problem isn&#8217;t with your application per sé. The next step is to figure out what&#8217;s causing the problem. First identify the scope: is it limited to one user, or a bunch of users in a particular geographic region, or is it everybody? If it&#8217;s only a small bunch of people, it might be that your ISP is having routing issues and you need do nothing at all. On the other hand, you might find that everyone is affected by the issue.</p>
<p>In that case what you need to do is to investigate <em>where</em> your bottleneck is occurring. Is it your database? Is it your disks? Or is it, yes, hold on a second &#8211; more than likely it&#8217;s the things you&#8217;ve probably overlooked: your images and other media files.</p>
<h3>Optimising your images</h3>
<p>Many people, particularly in smaller teams, overlook image optimisation. Most image editing programs will optimise for you &#8211; and this can often reduce a file&#8217;s size anywhere between 5% and 20%, and sometimes more. With today&#8217;s media rich sites, look at what you can do to ease the burden.</p>
<h3>Using a content delivery network</h3>
<p>As your web site grows ever more popular, sometimes the best way to get a performance boost is to let somebody else handle delivery of your &#8216;resource files&#8217; &#8211; these are your static images, scripts, movies, SWF files, etc. One option is to purchase more bandwidth from your supplier. Another is to enlist the support of a Content Delivery Network &#8211; kind of like a private, global internet with public endpoints close to your customers.</p>
<p>The benefit of a CDN is that you are effectively outsourcing the delivery of your static files onto another &#8211; usually much faster &#8211; network. Often this will result in an ability for your server to handle more connections than before, since it no longer has to worry about serving up the big files over and over again.</p>
<p>Going direct to one of the big networks can cost anywhere from about $1,000 per month upwards, but there are companies who provide full CDN integration for a fraction of the price.</p>
<p> Good luck with your web site optimisation and please feel free to leave comments and tips for others.</p>
<br />Posted in ASP.NET, Microsoft.NET, Software Development  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/brainthings.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/brainthings.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/brainthings.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/brainthings.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/brainthings.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/brainthings.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/brainthings.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/brainthings.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/brainthings.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/brainthings.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/brainthings.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/brainthings.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/brainthings.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/brainthings.wordpress.com/339/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.richard.parker.name&amp;blog=4676700&amp;post=339&amp;subd=brainthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.richard.parker.name/2009/08/05/how-to-speed-up-your-asp-net-web-application/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/eee6647666eed1d5751be36d79b0b341?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=PG" medium="image">
			<media:title type="html">Richard</media:title>
		</media:content>
	</item>
	</channel>
</rss>
