Sunday, September 26, 2010

Combining Roles on Windows Azure

Now why would you want to do that? Azure provides a nice separation of roles in web role and a worker role – why do you want to combine those you’ll ask. Multiple reasons – saving cost being the primary. The most requested feature on the Windows Azure feature voting forum is “Make it less expensive to run my very small service on Windows Azure.” and rightly so. If you wish to host your “small service” on the cloud it makes sense to minimize the cost. Even for large scale services this can help to maximize the use of resources. Let’s crunch some numbers to see this in action.

Assume that your “simple service” consists of a simple website that provides the UI to the users. There is also a background worker for sending registration emails, sending newsletters and does some nightly batch processing of your data. Let’s say you don’t need a full blown SQL server and are happy with the semi structured data storage that Windows Azure table storage provides. These assumptions are not unrealistic for a large number of  simple websites, in fact most startup websites will start with this model and then scale out as the traffic increases and that’s exactly what Windows Azure enables you to do. So with these very realistic scenario let’s examine what will it cost to host such a service on Windows Azure. We will only focus on the compute cost as that’s what you will save on (& is the biggest cost for a small service) when you combine roles so we can safely ignore the storage, bandwidth and other costs of hosting on Azure as they are all usage based.

Here’s what the compute instances cost on Windows Azure.

  • Small instance (default): $0.12 per hour
  • Medium instance: $0.24 per hour
  • Large instance: $0.48 per hour
  • Extra large instance: $0.96 per hour

Let’s say you will use the small instances for both your roles. So your monthly cost comes out to be,

30 (days in a month) * 24 (hours in a day) * 0.12 (cost per hour) * 2 (number of instances)
= $172.80 per month

Now you are wondering the worker role is just sitting there doing nothing for most of those hours. Shouldn’t you only count the “compute hours” in which the role is actually is alive and doing work instead of the full 24 hours for a day. Well, that’s not how Windows Azure billing work. It’s pay as you go alright but not at that granularity so you end up paying as long as your have reserved the VM, even in the suspended state. May be some day Azure will be able to provide that level of billing granularity – may be we should request that feature on the forum :-) But till then the only way to save cost here will be - if we just got rid of one role entirely and still do all the work with just one role. Turns out it’s very easy to do that on Windows Azure.

To understand how to do that we first need to understand how web and worker role differs in Windows Azure. One obvious difference  is the web role will have an IIS installed on the VM and the work role will not. What else? Well, turns out that’s about it. In every other sense as far as Window Azure is concerned those roles are pretty much the same. You could potentially have your worker role listen on port 8080 and receive web traffic and your web role have a Run()method that does the background work. When you create a Cloud project in Visual studio, by default in the webrole.cs the template does not add a Run() method like it does in your worker role but there is nothing that stops you from doing that either because the WebRole class also derives from the same RoleEntryPoint which workers derive from as well.

public class WebRole : RoleEntryPoint
{
public override void Run()
{
// This is a sample worker implementation. Replace with your logic.
Trace.WriteLine("WorkerRole1 entry point called", "Information");

while (true)
{
Thread.Sleep(10000);
Trace.WriteLine("Working", "Information");
}
}
}

As simple as that. Once your web role gets provisioned Azure fabric will start start IIS and deploy your application as well as start a worker which you can use to do some background processing. The thing to note that both of these processes are running on the same VM and will share the resources so this technique should not be used where a consistently high throughput is required at all the times by either your website or your background worker. But if you are able to use this technique you end up cutting your compute cost in half for your small service.

Hope that helps.



Thursday, August 5, 2010

Using SyntaxHighlighter 3.0+ on your blog

You can guess from the title that this is a Techie blog and that means I will be posting some code snippets from time to time and so I was looking into some options of code syntax highlighting and I narrowed it down to the awesome SyntaxHighlighter. I use a custom domain name but host my blog on blogger. I also use the awesome Windows Live Writer for posting.

Setting SyntaxHighlighter up was fairly easy but I did find a ton of blog posts on the web about how to do that with varying information. A lot of these posts were so old that they just misdirect you and deprive you from using the all the great features that the latest version offers so I thought I might take a moment to post the best solution that I know so far. Here goes,

Things you should know
SyntaxHighligher is a completely javscript and css based solution to syntax highlighting and it works on the client side and does not require you to embed inline styles and css. Now that is great with one drawback. Since the scripts are hosted (either on your site or somewhere on the web) and are linked on your website pages they will not make it to your RSS feed so most readers will not be able to show the highlighting. Personally, I think it is alright but if you don’t agree stop right here, SyntaxHighligher is not for you.

So How to Set it up then
As I said most of the information on the web is old so those posts tell you to link all the the brush JS on your page but from version 3.0 onwards SyntaxHighlighter has a nifty little feature for auto loading just the required brushes rather than linking all of them. Now if you don’t understand what I am talking about don’t worry, it’s even better since you don’t have to “unlearn” anything :-). Just follow the steps below to set it up for your blogger blog!

Step 1: Add the css and JavaScript links in the <head> section of your blog

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/> 
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'/>



Now notice that Alex Gorbatchev is actually providing free hosting for the required JavaScripts and CSS so you don’t have to worry about getting a place to host them. Also you will always point to the latest version if you just point to the “Current” directory.



Step 2: Setup Autoloader for brushes by adding the following javascript function again in the <head> section of your blog



<script language='javascript'>

function path()
{
var args = arguments,
result = [];

for(var i = 0; i != (args.length-1); i++)
result.push(
args[i].replace(&#39;@&#39;,&#39;http://alexgorbatchev.com/pub/sh/current/scripts/&#39;));


return result
};
</script>


Now blogger actually changes the single quotes to &#39; for you or you can post it encoded like above. Either ways it should be fine.



Step 3: Call to action – Use the JS to highlight all the sections on your blog, insert the script below just above </body> tag.



<script type='text/javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = &#39;http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf&#39;

SyntaxHighlighter.autoloader.apply(null, path(
&#39;applescript @shBrushAppleScript.js&#39;,
&#39;actionscript3 as3 @shBrushAS3.js&#39;,
&#39;bash shell @shBrushBash.js&#39;,
&#39;coldfusion cf @shBrushColdFusion.js&#39;,
&#39;cpp c @shBrushCpp.js&#39;,
&#39;c# c-sharp csharp @shBrushCSharp.js&#39;,
&#39;css @shBrushCss.js&#39;,
&#39;delphi pascal @shBrushDelphi.js&#39;,
&#39;diff patch pas @shBrushDiff.js&#39;,
&#39;erl erlang @shBrushErlang.js&#39;,
&#39;groovy @shBrushGroovy.js&#39;,
&#39;java @shBrushJava.js&#39;,
&#39;jfx javafx @shBrushJavaFX.js&#39;,
&#39;js jscript javascript @shBrushJScript.js&#39;,
&#39;perl pl @shBrushPerl.js&#39;,
&#39;php @shBrushPhp.js&#39;,
&#39;text plain @shBrushPlain.js&#39;,
&#39;py python @shBrushPython.js&#39;,
&#39;ruby rails ror rb @shBrushRuby.js&#39;,
&#39;sass scss @shBrushSass.js&#39;,
&#39;scala @shBrushScala.js&#39;,
&#39;sql @shBrushSql.js&#39;,
&#39;vb vbnet @shBrushVb.js&#39;,
&#39;xml xhtml xslt html @shBrushXml.js&#39;,
&#39;xml @shBrushXml.js&#39;
));
SyntaxHighlighter.all()
</script>


Notice I am using the new AutoLoader functionality and also since my blog is hosted on Blogger I am setting the bloggerMode to true. If your blog/website is different you should not set this flag and the rest of the setup should be the same for you. Also notice I have added XML brush twice one as a part of the xml xhtml.. group and one as a stand alone item. This was done to work around an issue with the WLW plug-in that I use so if you are not using it then you can remove that. Keeping it the way it is doesn’t hurt too. 



Step 4: Add the sections that you want to highlight and set the correct CSS class



<pre class="brush: css; toolbar: false;">

public static void main()


{


    Console.WriteLine(&quot;Highlight me!&quot;);


}


</pre>



And if everything is setup correctly it should look like below,



public static void main()
{
Console.WriteLine("Highlight me!");
}


A complete list of brushes can be found here. And the complete list of Settings can be found here. But wait, why remember these brushes and settings, why not install the awesome PreCode Snippet plug-in for the Live Writer and let the plug-in handle that for you. Once you install the plug-in you should be able to fire up the plug-in window like below and go crazy..



image



Wow, this post got long! But hopefully it will save people some time. And hey, this post will be a good test to see if I set it up correctly or not.

Wednesday, August 4, 2010

Testing Some Code highlighting

public static void main()
{
Console.WriteLine("Syntax Highlighter Testing");
}


How about some XML



<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'/>


And some JavaScript maybe



//
// Adds a new row to the table.
//
function addRow(){
//get the table
var table = document.getElementById('myExampleTable');

//get the number of rows currently in the table
var numRows = table.rows.length;

//insert a new row at the bottom
var newRow = table.insertRow(numRows);

//create new cells
var newCell1 = newRow.insertCell(0);
var newCell2 = newRow.insertCell(1);
var newCell3 = newRow.insertCell(2);

//set the cell text
newCell1.innerHTML = 'Row ' + (numRows + 1) + ' Cell 1';
newCell2.innerHTML = 'Row ' + (numRows + 1) + ' Cell 2';
newCell3.innerHTML = 'Row ' + (numRows + 1) + ' Cell 3';
}


And how can you forget SQL..



Select * from Employee


And CSS.. although it might not feature on the blog that much..



a:visited {
color:$visitedlinkcolor;
text-decoration:none;
}
a:hover {
color:#333333;
text-decoration:underline;
}
a img {
border-width:0;
}

“Page not found” or 502 when accessing an Azure Web Role

In the last week me and one of my collogue have been trying to nail down an issue when we try to access a simple Azure application from our Work network. I am posting it here as I think someone can benefit from this,

I literally just clicked through the Create New Project –> Next –> Next and created a “Simple” Cloud application with just a single Web Role and a Hello World page. Removed the diagnostic connection string that Azure adds by default just to make it even simpler. Basically the page just said “Hello World!” and nothing else was going on. Deployed the app on Azure and to my surprise it just didn’t work. I kept getting the default “Page not found”! Time to fire up fiddler and see what’s going on and here’s what Fiddler gives me,

[Fiddler] Connection to razorfishmvc1.cloudapp.net failed.
Exception Text: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 65.52.221.203:80

imageimage
Basically nothing much. Same deal when you use a tracert command.
image

And to add to that the app was just working fine from my iPhone. So we have an app that worked from an external network but didn’t from our corporate network with very little debugging info that one can point at. Luckily there was one service that we were able to hit from our corpnet and I logged into that and found that the only difference between that service and my “hello world” app was the affinity group.

Affinity group Details for the Service that DID NOT work:

Affinity group : mycustomaffinitygroup
Geographic Location: North/Central US

Affinity group Details for the Service that DID work:

Affinity group : Unaffiniated
Geographic Location: Anywhere in US

I changed the “hello world” to Unaffiniated and “anywhere in US” and wallah It started working. Now this SHOULD NOT happen. Either the North/Central data center was just slow to respond to requests from our internet gateway or there is something wonky with the custom affinity groups but either ways it’s BADD! Or a third reason could be the timeout value for our gateway before it closes the connection is set to a low value.. but not likely as I have never seen any issues with any other internet sites as such.

I have a thread going with Steve Marx from Microsoft here. Let’s hope he can track it down if at all it’s an issue with the Azure service. I hope not!

Tuesday, August 3, 2010

Find your favorite Setting in Visual Studio 2010

Most programmers are really picky! Especially when it comes to the IDEs. Visual studio 2010 offers you 100s of customizations. For the most part it’s awesome as long as you can find the setting that you want to change. Here’s what an options dialog from Visual Studio 2010 looks like..

image

Notice there are 100s of items that you can customize but it’s missing one important thing! Where is the “Find” button to jump to the right setting???

Not to worry, Microsoft cares for you developers. Although it didn’t release it as a Visual studio feature they released an awesome extension called Productivity Power tools. Install that and it has a nice little feature called “Quick Access”, just press cntrl + 3 and you will see a window like below

image

Notice it finds menu items, Visual studio options and much more. It also let’s you navigate directly to the option from right within the interface. Really helpful.

Btw, have you tried pressing “cntrl + ,” yet?? Go ahead try it.. I think you will like it!

Hope that helps.

Tuesday, June 15, 2010

Configure Microsoft Web Platform installer to install developer tools

Web development is complex and changing rapidly. Just installing all the different tools that you need to do you job is a task in itself and when you have to keep all those pieces updated with the rapid product releases it becomes even more demanding.

Enter Microsoft Web Platform installer! It’s an amazing tool that analyses your computer and carves out a path to upgrade it to the latest bells and whistles. Also lists everything out in a single place where you can just check-check-check and Install instead of finding compatible installers and installing them separately. It also gives you jump starter web applications instead of reinventing those yourselves. Here’s how you configure the web platform installer to include the developer tools (silverlight, Azure and more..) in the mix.

Click on the “Options” on the bottom left corner.

www.hparikh.com

And check the “Developer Tools” box. And click OK.

image

It will rescan your machine and come up with the dev tools suggestions.

image

I also like to just fire up the web platform installer every once in a while just to see if there are any interesting updates that are available that I can take advantage of, in fact that’s how I found the Azure tools v1.2 release.

Hope that helps.

Sunday, April 11, 2010

Test Post

This is a test post.. loren ipsum