Easy Event Logging on Windows Azure

I’ve been working on an application that has a need to log many events on a Web Role running on Windows Azure.   Effective logging can be difficult to setup.  Do a search, and you’ll find a handful of articles that cover logging to the blobstore, mounting drives to extract the logs, etc. 

Instead, I wanted an easy way to log custom events and exceptions in my application.  This is how to do it:

1. Create a class that inherits from System.Diagnostics.TraceListener. 


public class AzureTraceListener : TraceListener   

{    

public static List<String> Events = new List<String>(); 

    public override void Write(string message)       {            Events.Add(message);        } 

    public override void WriteLine(string message)       {            Events.Add(message);        }  

} 

2.  In your web role, add a reference to your custom trace listener.  This is done by adding the following two lines in your OnStart() method.


AzureTraceListener atl = new AzureTraceListener();   Trace.Listeners.Add(atl);

 

3.  In your application, log your events using the Trace.Write(string) method.

4.  To display your events, create a new page called Traceviewer.aspx with the following block of HTML:


<h1>Trace Log</h1>   <% foreach (String eventitem in WebRole1.AzureTraceListener.Events)        {            Response.Write("<h4>"+eventitem+"</h4>");       } %>

That’s it.  Deploy your application and simply call Traceviewer.aspx to look at all of your generated events.

Posted in Cloud Computing by Simon. 1 Comment

CITA-P – Certified IT Architect

Last week I took (and passed!) my CITA-P examination.  CITA-P (Certified IT Architect) is a new certification, offered through IASA (the International Association of Software Architects).  I wanted to share some thoughts on the certification, the process, and why you might want to consider applying yourself.

The Certification

The CITA-P certification evaluates an IT Architect across six core areas:

  • Business / Technology Mapping
  • Design Skills
  • Human Dynamics
  • IT Environment
  • Quality Attributes
  • Software Architecture or Infrastructure Architecture (you pick one of the two)

Each of the above six areas has around ten or so subcategories which go into some detail.  There is a worksheet available here on the IASA site that covers all six, and can be very useful to reflect on your own strengths and weaknesses, even if you are not planning on taking the exam.

The goal of the certification is to gauge your level of competency across each of these six areas.  The majority of this will of course be based on your knowledge, experience, and personal reflections. 

The Process

Because it would be impossible (and indeed, wrong) to certify IT Architects through a multiple choice examination, the process of certification is an involved process, although very well structured.

The first part requires submitting a set of documentation.  The details of what is required can be found in the application guide, and for my submission I decided to offer my perspectives and thoughts across the six certification areas.  I wrote a story about each, reflecting my experience, views, and examples of projects that I’ve been involved in.

After submission, I received my date for the in-person board review, which is split into three parts:  The first part is a 30 minute presentation of your choosing.  The board is looking for experience across the certification areas, and also for communication skills.  Staying within the 30 minute timeslot and having a presentation that is both engaging and covers all of the areas is difficult, but important if you are going to be successful.

Following the presentation comes a line of questioning, with each of the four board members given ten minutes to question you about your presentation.  The idea here is not to pick holes in the presentation or play stump the chump, but merely to validate experience in areas that you may not have shown in the presentation.  A large amount of my presentation was based on a framework around cloud computing, so while I had many questions related to this, I also saw the board trying to relate the material to other areas which I didn’t mention in the material.

After the first round of questioning, you are given a 15 minute break.  This is a great opportunity to get some water and gather your thoughts while the board compares notes to look for areas they might have missed.  Another round of questioning follows (4 x 10 minutes) on various topics and it’s all over.  After the board review concludes, the board members meet and you are given their decision together with helpful advice in a couple of days.

A Good Thing?

Although this is my first experience, I’ve been a strong supporter of IT Architect certification since my time in the Platform Architecture Team here at Microsoft, and I believe it’s a good thing for the industry.

We see many IT Architects in our industry today.  Most inherit that role during the natural evolution of their career.  Many of these are indeed valid IT Architects, but I have the impression that other are also riding on the cache of the title.  If we are going to grow this profession, it’s important that we standardize the areas and level of experience we expect from this role.

More Information?

For more information about CITA-P certification in your area, I would recommend getting in contact with IASA for more information.

QCon San Francisco talk now available online

This is from November 2009, but I’ve just noticed that my “Patterns for Cloud Computing” session recording from QCon San Francisco has been posted online. You can find the recording and slides here.

Moving VHDs to the Cloud

When I speak with customers about cloud computing, a common question is often “how do I migrate an application to the cloud?”  While this is a multi-part answer, one of the hurdles for migration is often storage. 

Many applications store data using the file system (e.g. read / write a file to d:\data\config.xml).  Moving these types of applications to the cloud can be difficult as the storage mechanisms in the cloud are somewhat different. 

To help address this problem, in Feb 2010 we released v1.1 of the Windows Azure SDK which supports a new feature call Cloud Drives.  A Cloud Drive is the ability to mount a virtual drive in the cloud so that applications can write to it as they would a local drive.  This cloud drive is persisted so that even if the machine goes down, the data is not lost.

What many people don’t realize however is that the format that the Cloud Drive uses is interchangeable with the VHD (Virtual Hard Drive) format used by virtualization products such as Hyper-V, Virtual PC, Windows Server, and Windows 7.  What this means is that you can create a single VHD, use it locally on a Windows PC, attach it to a virtualized image, and now copy it to the cloud and access it there also.  As you can imagine, for anyone looking to migrate applications to the cloud, this opens up a world of possibilities.

In this post, I’ll walk through a series of steps that show creating a VHD from scratch, copying it to the cloud, and accessing it from a web role running in Azure.

Before you begin

You’ll of course need an Azure account.  If you don’t have one, you can go here to sign up.

Once you have your account, you’ll need to setup two new services. 

image 

You’ll need to create a storage account – this is where the VHDs will be stored – and a hosted service to run your application from.  When you set them up, make sure that they are created in the same geography (i.e. don’t have your storage account in Asia, and your hosted service in the US as the drive mounting has to be in the same region).

Once you have your storage account and service created, you are ready to create and upload your VHD. 

Step 1.  You’ll need a VHD

If you already have a VHD file that you would like to use, you can skip to Step 2.  You’ll be copying this VHD to the cloud, so you may want to choose a smaller VHD file for test purposes.

If you are running Windows 7, creating a new VHD is easy. 

Firstly, go to the start menu and type disk management

From the start menu click on Create and format hard disk partitions

image

This will open up the disk management tool.  From the Action menu, select Create VHD.

image

Enter a location for the VHD file and a size.  The minimum is 16Mb and the maximum is likely the amount of free disk space on your machine. 

image 

When your disk appears in the management tool, right click on the disk name and select Initialize Disk.  Select the default (MBR) and select OK.

image

After initialization, right click on the disk and create a New Simple Volume.  Walk through the wizard, accepting the defaults and assign a drive letter to the VHD.  Finally, format the disk using NTFS (a quick format is fine).  If a dialog box appears asking you to format the disk (sometimes the disk gets detected just before formatting has begun), just hit cancel.

After this is done, you can open the drive and access it as you would any other drive. Add some files and folders, etc.

image 

When you are ready to upload to the cloud, you’ll need to detach the drive.  To do this, go back in to the disk management tool, right click on the disk name and select Detach VHD.

image

(Do not select the Delete the virtual hard disk file checkbox – otherwise, they’ll be nothing to upload!)

Step 2.  Upload it to Azure Storage

The next step is to upload the VHD to the cloud.  The VHD will be stored in something called Blob (Binary Large OBject) storage.  You may have heard of blob storage if you’ve seen any of the introductory Azure presentations.  It’s the type of storage that is used for binary data such as images, videos, and the like.

In February we enabled support for Page Blobs.  Page Blobs are binary objects stored in the cloud that support random read/writes through pages.  This makes them ideal for dealing with VHD type of access, and this is the format that we’ll be using to upload our VHD to the cloud.

The one caveat of this is that you must use a tool that supports page blobs (most of the tools available today only support regular blobs).  The tool I would recommend is Cloud Storage Studio by Cerebrata as it supports page blobs through a nice interface.

image

Open the tool and access the storage account that you created in the “Before you begin” section earlier in this post. 

I would recommend creating a new container for your VHD images to keep them separate from other content.  As shown in the screenshot above, I’ve created a container called vhd.

image

Select the container, and click on the Upload Page Blob button.  There are two upload buttons – you need the one with the icon that includes the page and the up arrow.

Point to the location of your VHD file and click on the Upload button.

image

This might take a little way depending on the size of your VHD and the speed of your network.

Once you have uploaded the file, validate that it exists by hitting the refresh button.

image

With the VHD uploaded, we can now move on to creating the cloud application that accesses it.

Step 3.  Accessing the VHD from Windows Azure

I’m going to assume that you have some knowledge of creating an ASP.NET application and uploading it to Windows Azure.  If you haven’t done this before, I would recommend checking out the Windows Azure Training Kit.

To access the VHD in the cloud, we create a webrole and use the following code.

Add reference to the Microsoft.WindowsAzure.CloudDrive DLL that can be found in the GAC (assuming that you have the v1.1 SDK installed).  Then, in your webrole, you’ll need to add the following using statements:

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;

Here is the code that you should run in your web role.  (You can place this behind a button or something…)

// Setup the account details
String accountName = "";  // insert your storage account name here
String accountKey = "”;  // insert your storage account primary key here

StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey(accountName, accountKey);

CloudStorageAccount storageAccount = new CloudStorageAccount(credentials, new Uri(String.Format("http://{0}.blob.core.windows.net",accountName)),
                                                                            new Uri(String.Format("http://{0}.queue.core.windows.net", accountName)),
                                                                            new Uri(String.Format("http://{0}.table.core.windows.net", accountName))
                                                                            );

// initialize the local cache - need to trim the end backslash otherwise, HRESULT=D0000033
LocalResource localCache = RoleEnvironment.GetLocalResource("LocalCache");
CloudDrive.InitializeCache(localCache.RootPath.TrimEnd('\\'), localCache.MaximumSizeInMegabytes);

// Create and mount the drive
CloudDrive c = storageAccount.CreateCloudDrive("vhd/myvhd.vhd");
String driveLetter = c.Mount(localCache.MaximumSizeInMegabytes, DriveMountOptions.None);

// do regular System.IO.File and System.IO.Directory operations here against driveLetter
Response.Write(System.IO.Directory.GetFiles(driveLetter + "\\").Count() + " files found on the root of the mounted drive.");

// unmount the drive
c.Unmount();

There are five main pieces to the code.

Firstly, the storage account reference is created using the account name and key that you retrieve when you setup your Azure account.

After that we need to initialize a local cache used by the cloud drive.  To create this, insert the following code into your ServiceDefinition.csdef file on your webrole.

<LocalResources>
  <LocalStorage name="LocalCache" cleanOnRoleRecycle="false" sizeInMB="100" />
</LocalResources>

We then create and mount the drive using the CreateCloudDrive and Mount methods.  Make sure that the path and name to your VHD matches what you uploaded in Step 2.

Once the drive is mounted we get a drive letter (as a string – e.g. “f:\\”).  You can then make calls to that drive letter using the regular calls (e.g. System.IO.File and System.IO.Directory).  In a worker role you can even launch applications from the VHD by spawning a new process. 

Finally, to unmount the drive, just call the Unmount method to release the VHD image.

image 

There are a lot of details behind the scenes that I’m not going to go into here (e.g. read and read/write access to the VHD)  – if you want to learn more, I would recommend checking out this PDC session by Brad Calder

Appendix.  Running this in a local development environment.

You should note that uploading a VHD only works using a live deployment in the cloud.  In the local development fabric, you’ll find that you cannot access a remote VHD (you’ll get a HRESULT = 80070003 error).  Also, you can’t upload a page blob to local development storage.

However, you can still duplicate the same functionality in the local development environment by using this code:

// Setup the account details
CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
// initialize the local cache - need to trim the end backslash otherwise, HRESULT=D0000033
LocalResource localCache = RoleEnvironment.GetLocalResource("LocalCache");
CloudDrive.InitializeCache(localCache.RootPath.TrimEnd('\\'), localCache.MaximumSizeInMegabytes);

// Create and mount the drive
CloudDrive c = storageAccount.CreateCloudDrive("vhd/myvhd.vhd");

// try creating the drive if it doesn't exist
try
{
        c.Create(16);
}
        catch (Exception)
{
         // ignore - VHD folder already exists
}

String driveLetter = c.Mount(localCache.MaximumSizeInMegabytes, DriveMountOptions.None);

// do regular System.IO.File and System.IO.Directory operations here against driveLetter
Response.Write(System.IO.Directory.GetFiles(driveLetter + "\\").Count() + " files found on the root of the mounted drive.");

// unmount the drive
c.Unmount();

There are a couple of differences from the live environment.

Firstly, instead of using the public account details, we can just make a call to CloudStorageAccount.DevelopmentStorageAccount

Secondly, just before we mount the drive we actually try to create it using the c.Create(16) command.  If it already exists, then it throws an exception that we just ignore.

It’s important to know that this doesn’t actually create a VHD file. Instead, it creates a new directory in this folder:

c:\users\[username]\AppData\Local\dftmp\wadd\devstoreaccount1\vhd

You can now access this folder through Windows Explorer, go into the .vhd folder and add/remove files as you wish.  Once you are ready to move to a production environment you simply copy the files from this directory in to a new VHD (as created in Step 1), upload, and switch to the production code.

Microsoft @Cloud Conference in Korea

I have the pleasure of presenting the keynote at the Microsoft @Cloud Conference in Korea next week.  I’m not sure how many people from Korea (if any!) follow my blog, but if you do and are planning to come, I would love to meet you. 

This will be my third trip to Korea and I’m really looking forward to returning even though my trip is short this time.  My goal is to learn a few phrases and words in Korean before I come – I can converse at an intermediate level in Japanese, but I feel completely lost in Korean – maybe I can learn enough to at least introduce myself in front of the attendees! 

Posted in Cloud Computing Events by Simon. No Comments

Presenting Successful Demos

I was watching a presentation yesterday, half way through which the presenters fired up a demo of their application. To their horror, the demos failed spectacularly.  After what seemed like an eternity trying to recover, the presenters were forced to move on, leaving the presenters visibly annoyed and the audience disappointed.

Although I’m not immune to this (I had an epic demo fail at JavaOne last year), in this post, I wanted to share a few things that I’ve found successful in preparing for and presenting technical demos.

All About State

I’ve lost count of how many demos I’ve seen that have failed on stage.  One of the most common post-demo excuses is “That’s strange…  it worked OK in my hotel room”.  What these presenters don’t realize is that it’s all about state – and how two types of state changes can affect demos.

Predictable State.  When you boot your machine, it starts in a particular state (let’s call it S1).  When you test your demo in your hotel room, at the end of the demo your machine is in a different state (let’s call it S2).  The demo was successful, and you assume that everything is going to be great for your talk.  However, when you walk up to the podium, your machine is no longer in it’s original S1 state, it’s in S2 (because you’ve just run the demo previously).  What many presenters fail to realize – until they have 250 people staring at them – is that the demo doesn’t work if the machine is in state S2.  Maybe temporary files weren’t cleaned up, or the database connection was left open, etc. 

Timeout State.  Another case I see frequently is with time lag.  I’ve also heard this referred to as “your machine being baked on stage”.  In your hotel room, you boot your laptop (which is in state S1) and run the demo – and it works.  What many presenters face however is a time lag between starting their talk and presenting their demo.  For example, your machine could be sitting on stage for 50 minutes before you actually get to the part where you need to show your demo.  By that time your machine is in a different state (maybe some kind of power saving / indexing / virus scanning has kicked in – or maybe your application has a memory leak / has closed database connection) and as a result fails.

How do you mitigate these two changes of state?  There are a couple of things that I’ve found really help. 

Firstly in your hotel room – either before the presentation or the night before – run the demo as you would, and then re-run it directly afterwards.  At the time I’m often thinking “of course this is going to work”, but I’ve been amazed at how many times the demo actually fails on the 2nd attempt.  For my more complex demos, one of the things that I’ve been considering is using some TDD approaches to help setup.  For example, having a build script that will clean, compile, and run my demo together with a set of unit tests that will check the output.  I can run this multiple times in the hotel room previously, and also again when I reach the podium before my talk begins.

Secondly, the only way to deal with the lag issue is to recreate the conditions that you’ll face.  A full rehearsal in the hotel room the night before is often the only way to get around this.  Many times I’ve been amazed to see that demos that normally need a few seconds to complete take much longer once the machine has been sitting there idle for half the presentation.  There are a few things that I normally set by default to help mitigate this (e.g. ensure the machine is in high power mode, turn off unwanted settings etc.)

Scripts

To help recreate a successful state, for each demo I always use two scripts, in printed format.  One is my “pre-req” script, another is my “run-through” script.

My pre-req script lists all of the things I need to do in order to get the demo in to a known state for presentation.  This can include pre-opening the IDE, setting fonts correctly, minimizing windows, resetting config values, deleting output files, etc.  I also have a master “pre-req” list that includes many things that I don’t need every time (switch off IM client, close Outlook, etc.)

My run-through script is exactly as it sounds – a script that I use during the presentation to run through the steps of the demo.  I know many people feel uncomfortable reading from a script during a presentation – and for the slides, I completely agree – but for the demo, everyone in the audience tends to be looking at the screen and not at you directly, so while reading from a script might not feel natural, you’ll see that the audience won’t actually notice.

One thing I will say about the run-through script is that it needs to a set of mental prompts, not a set of instructions.  For example, if the first part of your demo is to open a new browser window to your demo page, a mental reminder like this would work:

*  IE –> http://myapp

Whereas this would not:

*  Click on start, select Internet Explorer.  Wait for browser to start.  Go to address bar, enter demo address and click on OK.

In the heat of the moment, you won’t have time to process everything and you’ll end up ditching the script half way through.

Video Recording

You face your worst nightmare and your demo spectacularly fails.  What’s your backup plan?  For me, it’s a video recording of the demo produced the night before and made accessible before the presentation.

Many people dislike creating video recordings because they think the audience won’t like the format – or worry that it will take too much time to prepare.  I disagree.  The audience would prefer to see something in context of your presentation, even if it’s a recording.  For example, let’s imagine that your demo doesn’t work during your presentation.  It’s perfectly acceptable to spend a few seconds to try and recover before saying “Well, I seem to be having some trouble with the demo – let me switch to a recording instead and walk you through what I was going to show”.  I open the video and within seconds the audience is able to keep context with the main flow of the presentation – and they’ll forgive me more for using a video than if they couldn’t see the original intended version.

In addition, if you are doing a full rehearsal the night before, it’s little effort to start some screen capturing software and record your demos.  The video doesn’t have to be a Hollywood masterpiece – remember, this is for backup purposes only – and you don’t need to worry about audio (as you’ll be talking over the top of this).

When you record the videos, always set your machine to the resolution of the projector that you’ll be using (this is good advice for running through any demo prep).  If you don’t know the resolution of the projector beforehand, I would recommend 1024×768.  Your audience will prefer to see a demo with additional screen real estate vs. a demo that’s looks crammed because the resolution was too high.

After you’ve created the videos, I recommend copying a version of them to a folder on your desktop for quick access, and to either a USB stick or online storage where you can access them from another machine if need be.  Many conferences that I’ve presented at often have a second presenter machine than I can use in case my demo machine dies.

 

As a final note, if all of this sounds way over the top, I like to remind myself of the time investment from the audience.  If I have 100 people show up to a talk and I have a 15 minute demo, the audience is investing 25 man hours co
llectively just for that demo (100 people x 15 minutes).  I feel that adding a few more minutes of my prep time to ensure the demo runs flawlessly is worth justifying the investment of everyone in the room.

Posted in Events Getting Things Done by Simon. 4 Comments

Cloud Computing Interoperability

Over the past few weeks I’ve been working with Jean Paoli’s team at Microsoft to create an application that runs across multiple cloud vendors.  Jean’s team has been working on a number of SDKs for PHP and Java, and I wanted to create a sample that demonstrated all of them working together.

The result is a small application that calculates every prime number between 1 and 10,000,000 in a minute or less, with the calculation performed by a set of PHP pages running on Windows Azure, a Java Servlet running on Google AppEngine, and an ASP.NET application running on Amazon EC2.  All of the results are stored in a central SQL Azure database, and I used the .NET Service Bus to coordinate messages across the three cloud applications.

I presented this for the first time at TechEd Europe last week in Berlin and this week at QCon in San Francisco.  Both presentations seemed to strike a chord with the audience, especially the attendees looking for how interoperability works in the cloud.

For those that weren’t able to make it to my sessions, I’ve recorded a short screencast of the demo in action – you can find it here

If you are after more information, here you can find a longer (50 minute) screencast that goes into the details of how this works.

Upcoming Events: TechEd, PDC, and QCon

I’ll be back on the road again on Tuesday to squeeze in three more conferences before the end of the year.  My stops this time include:

TechEd Europe, Berlin

This will be my first time to Berlin, so I’m really looking forward to it.  I think it will be especially interesting as this year marks the 20th anniversary of reunification in Germany.  While I won’t be there on the actual day (9th), I still think the atmosphere will be a great experience.

I have three sessions at a sold out TechEd Europe this year.  On Thursday 12th, I will be presenting Working with the OSS Community:  Cloud Computing Interoperability (INT02-IS).  This was a late addition to my schedule, and I’ve been working on a sample application that runs across Windows Azure, Google AppEngine, and Amazon EC2 – and as it’s an interactive session, my goal is to show mostly demos and walk through how the application was put together.

In the afternoon I’ll be continuing the theme of cloud computing with Demystifying Cloud Computing (ITS204) in the IT Managers Track.  This will be an update of the session that I delivered at TechEd US, with a goal of giving IT Managers the foundational information on what cloud computing is, and why they should care.

To conclude the week on Friday, I’ll be presenting Patterns for Cloud Computing (ARC309) which takes architects and senior developers through 5 patterns for the cloud.  If you’ve been following my recent posts on my blogs, then this will be the session that brings all this together. 

PDC, Los Angeles

The week following I’ll be heading back to the West coast for PDC in Los Angeles.  I have a BOF Session this year on Will Cloud Computing change your life?  This is an INETA organized panel, and I’ll be in good company with Aaron Skonnard, David Pallmann, Michael Stiefel and others.

QCon, San Francisco

My final stop will be QCon in San Francisco.  This will be my first time at a QCon event. and as I know Floyd and the team well, I’m really looking forward to it.  I’m presenting my “Patterns for Cloud Computing” session to open the cloud computing track at the event.

Posted in Uncategorized by Simon. No Comments

Eclipse Tooling for Windows Azure

If you’ve been following the recent developments on Windows Azure, you are probably aware that the July CTP of Windows Azure introduced support for FastCGI.  One of the benefits of supporting FastCGI is the ability to run PHP applications in the Azure fabric. 

If you are a developer using the Eclipse IDE, this month marks another milestone with the release of the “Windows Azure Tools for Eclipse”, a project that provides a complete toolkit for Windows Azure development, right inside the Eclipse IDE.

I’ve been playing around with an early build, and have been really impressed.

The tooling adds support to an existing PHP project (using PDT) so that it can run on Windows Azure, integrates with the local fabric so that you can test applications running on your local developer box before deploying, and includes an explorer for interrogating storage elements of Windows Azure. 

You can find out more about the project here.  If you are using Eclipse 3.5 today, the update URL is http://www.windowsazure4e.org/update.  Full instructions for downloading can be found here.

I’m planning to cover this in some detail in one of my sessions at TechEd Europe (INT02-IS Working with the OSS Community: Cloud Computing Interoperability).  If you have thoughts on what else you would like to see in a session with such a title, do let me know!

Screencasts from "Patterns for Cloud Computing" Presentation

Since returning from Europe a couple of weeks ago, I've been asked if my presentations were recorded, especially for the demos shown.  A number of events did record the session, and I'm sure they will be making these available soon, but in meantime I have put together screencasts for each of my demos. 

The first screencast shows a small application called PrimeSolvr, which was created by a couple of colleagues – Wade Wegner and Larry Clarkin.  PrimeSolvr is a simple application that solves prime numbers, running on a 25 node instance using Windows Azure.

Screencast 1

The second screencast focuses on multi tenancy and shows handling data and UI for multi-tenant applications using ASP.NET MVC, which could then be uploaded the cloud.  The demo was inspired by Maarten Balliauw, a Microsoft MVP in Belgium who created a routing mechanism for ASP.NET that uses the domain name.

Screencast 2

The third screencast, and demo, is a simple implementation of MapReduce running on Windows Azure.  The demo is run locally to demonstrate logging in the fabric, and shows how a MapReduce-like application can run on Windows Azure.

Screencast 3

The fourth and final screencast looks at communication using the cloud, specifically using the .NET Service Bus. Instead of exchanging "hello world" type messages, I actually show how the service bus can be used to do protocol mapping between two machines – I think this demonstrates some of the more interesting applications that using the cloud can enable.  In this demo I connect to an instance of SQL Server running on a remote machine using the .NET Service Bus.

Screencast 4

Update:  Updated the screencast links (now moved to Azure blob storage from Silverlight streaming)