Tuesday, October 11, 2011

Adventures in HTML5: A JavaScript Doomsday Counter

Part of mastering HTML5 is mastering JavaScript, a big focus for me and 120 colleagues this month. The best way to go deep on anything in the software world is to be constantly building stuff with it, so here’s something I developed over the last few days: an animated odometer-style counter control suitable for counting down to a deadline.

DEVELOPING THE CONTROL
I didn’t start out intending to write a counter control at all, I was trying to find one to use in a dashboard. I want to be building some cool HTML5 business dashboards in the months to come, and a counter is one of the many widgets I’ll need. I started out looking for one, and sure enough there are a number of free JavaScript counters with source to be found online. Unfortunately, after some evaluation I found issues with each of the ones I tried and I wasn’t able to control appearance or behavior to my satisfaction. Ultimately, I decided to take a shot at creating my own counter control. I wasn’t sure how far I’d get but if nothing else it would be a good learning experience. Rather than writing a simple counter that shows a single value, I chose to create a days-hours-minutes-seconds counter that would count down to a deadline.

The first step was to obtain graphics for the odometer images, then think through how the digit display should work. If we were merely displaying and updating digit images this would be no big deal, but for this control I wanted the seconds digits to be moving as well as the minutes, hours, and days digits when they get decremented. I created a filmstrip-like image (below) with the digits 0-9 arranged vertically beneath each other. Using this image as the background for each digit, showing any particular value is just a matter of clipping the image and changing its top offset. Moving the image only requires use of a timer to increment or decrement the clip area and top offset until the new digit has rolled into place. As you can imagine there’s quite a bit of logic needed to do this well and bump seconds to minutes to hours to days.

Using top margin and CSS clipping to show and roll digits

To show one digit from the image, I used the CSS clipping feature. I created CSS classes for each digit that set the image’s top margin and clipping area. One complication of CSS clipping is that it requires absolute positioning, something I didn’t want. It turns out you can have it both ways, by using absolute positioning inside a DIV tag container that uses relative positioning.
/* Digit classes */

.d0 { position:absolute; clip:rect(39px 37px 78px 0px); vertical-align: middle; margin-top:-39px; }

.d1 { position:absolute; clip:rect(78px 37px 117px 0px); vertical-align: middle; margin-top:-78px; }

.d2 { position:absolute; clip:rect(117px 37px 156px 0px); vertical-align: middle; margin-top:-117px; }

.d3 { position:absolute; clip:rect(156px 37px 195px 0px); vertical-align: middle; margin-top:-156px; }

.d4 { position:absolute; clip:rect(195px 37px 234px 0px); vertical-align: middle; margin-top:-195px; }

.d5 { position:absolute; clip:rect(234px 37px 273px 0px); vertical-align: middle; margin-top:-234px; }

.d6 { position:absolute; clip:rect(273px 37px 312px 0px); vertical-align: middle; margin-top:-273px; }

.d7 { position:absolute; clip:rect(312px 37px 351px 0px); vertical-align: middle; margin-top:-312px; }

.d8 { position:absolute; clip:rect(351px 37px 390px 0px); vertical-align: middle; margin-top:-351px; }

.d9 { position:absolute; clip:rect(390px 37px 429px 0px); vertical-align: middle; margin-top:-390px; }

Lots of JavaScript code later, I had a decent working prototype control. This afforded me an opportunity to learn more about JavaScript as I tackled events, timers, dynamic DOM alteration, and date calculation. Although I’ve only implemented decrementing deadline counters so far, the code is written in anticipation of other counter types in the future. While my code is in need of completion and refactoring, I’m still proud of it for a first effort. 
CREATING THE DOOMSDAY COUNTDOWN DEMO

Next it was time to incorporate the countdown control into a demo application, and it would need to involve one or more deadlines. With all the end-of the-world date setting going on these days, it seemed a natural to create a tongue-in-cheek “Doomsday Countdown” web site that shows the running countdown to the various end-of-the-world dates. Check it out here. Unfortunately there are some positioning problems in Firefox I have yet to figure out with the days counter, but it renders just as it should on Chrome and IE.


In my HTML page, the application references JQuery, the counter.js library for the control, and the counter.css CSS for the control.
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js">script>
     <link rel="stylesheet" href="counter.css" type="text/css"/>
    <script type="text/javascript" src="counter.js">script>

The HTML page also contains some initialization JavaScript that creates an array of counter objects. Each object specifies an Id prefix, a counter type (“Date”), an increment/decrement direction, a target date, and an optional hour of the day adjustment.

    <script type="text/javascript">

      // Create an array of counter objects.

      var counters;

      var counterCamping = {
          Prefix: "Camping",
          CounterType: "Date",
          Direction: -1,
          EndDate: "10/21/2011",
          Hours: 8
      };

      var counterBibleCode = {
          Prefix: "BibleCode",
          CounterType: "Date",
          Direction: -1,
          EndDate: "01/01/2012",
          Hour: -16
      };

      var counterMayan = {
          Prefix: "Mayan",
          CounterType: "Date",
          Direction: -1,
          EndDate: "12/21/2012",
          Hour: 0
      };

      var counterRasha = {
          Prefix: "Rasha",
          CounterType: "Date",
          Direction: -1,
          EndDate: "01/01/2280",
          Hour: -16
      };

      var counterNostradamus = {
          Prefix: "Nostradamus",
          CounterType: "Date",
          Direction: -1,
          EndDate: "01/01/3739",
          Hour: -8
      };

      var counterSun = {
          Prefix: "Sun",
          CounterType: "Date",
          Direction: -1,
          EndDate: "01/01/99999",
          Hour: 42
      };

      counters = [6];

      counters[0] = counterCamping;
      counters[1] = counterBibleCode;
      counters[2] = counterMayan;
      counters[3] = counterRasha;
      counters[4] = counterNostradamus;
      counters[5] = counterSun;

      // Load event handler - add counters to the DOM and start update timer.

      function load() {
          SetCounters(counterCamping);
          SetCounters(counterBibleCode);
          SetCounters(counterMayan);
          SetCounters(counterRasha);
          SetCounters(counterNostradamus);
          SetCounters(counterSun);
          StartCounters();
      }
  <script>

The onload event handler calls the counter.js library to insert counters into the DOM and start a countdown timer running. From there the counters count down all by themselves.

The body of the document is a header, a table that holds the counters and labels, and a footer. Yes, I’m well aware that tables aren’t cool these days—but I had to timebox this experiment and was focused on the JavaScript. As you can see, the Ids used in the table entries match the JavaScript object prefixes seen above. The counter.js library assumes for a counter object with name X that there are elements named XDays, XMinutes, XMinutes, and XSeconds.

<tr>
<th class="Label SideLabel">Mayan Calendar</th>
<td> </td>
<td class="Label DateLabel">2012-DEC-21</td>
<td> </td>
<td><div id="MayanDays" class="BigCounter" /></td>
<td class="sep"> &#8226 </td>
<td><div id="MayanHours" class="Counter" /></td>
<td class="sep"> &#8226 </td>
<td><div id="MayanMinutes" class="Counter" /></td>
<td class="sep"> &#8226 </td>
<td><div id="MayanSeconds" class="Counter" /></td>
</tr>

Was this the valuable learning experience I expected it to be? It was. I wouldn't have gotten very far without the many useful tips and code snippets about JavaScript online. For the application heading I found a nice fire text effect on UI Hacker.  The application also uses a function or two from the JQuery library.

With the understanding this is only prototype code and there is a display issue on Firefox, the Doomsday Countdown application and countdown control may be downloaded from here.

(we're counting on you, but if you don't use it, it's not the end of the world)

Saturday, October 8, 2011

The Cloud Gourmet 30-Minute Meal: Static Web Site Migration to Windows Azure



Bonjour and welcome again to The Cloud Gourmet with your host, Chef Az-ure-D.
My friends, today I would like to share with you the first of several “30 minute meal” recipes for Windows Azure or as you might put it, “low-hanging fruit”. In cooking, not everything must be a masterpiece that requires a great effort. So it is in the cloud: a great many useful things can be done easily and in a short period of time. We are not talking about “fast food” here, which I detest, but simple meals that are nutritious and satisfying that also happen to be quick and easy.


Perhaps some of you reading this have been considering Windows Azure for some time but have been afraid to, shall we say, take the plunge? I have the perfect remedy. Create one of these 30 minute meals and see for yourself how satisfying Windows Azure is. Doing so will give you confidence and something to show your colleagues. In no time you will be on your way to more ambitious projects.

Recipe: Migrating Static Web Sites to Windows Azure in 30 Minutes
Web sites come in all sizes and complexities. We have in mind here static web sites, in which we are serving up content but there is no server-side authentication, logic, database, web services, or dynamic page creation. If this is indeed the case, then your needs are simple: you need something to serve up HTML/CSS/JavaScript files along with media content (images, video, audio) or downloadable content such as documents or zip files. Here’s a step-by-step recipe for migrating your static web site to Windows Azure in 30 minutes.

I just happen to have one of these made already that I can pull out of the oven and show you: http://azuredesignpatterns.com. Note that even though the site is static that doesn’t mean it has to be limited in terms of visuals or interactivity. You can use everything at your disposal on the client side including HTML5, CSS, and JavaScript. This site in fact, static though it is, works on PC browsers as well as touch devices like tablets and phones.


Plan
The standard way to host a web site in Windows Azure is to use the Compute service and a web role. However, that’s overkill and an unnecessary expense for a static web site. An alternative is to use blob storage. This works because blob storage is similar to file storage, and blobs can be served up publicly over the Internet if you arrange for the proper permissions. In essence, the Windows Azure Blob Service becomes your web server.  I personally use this approach quite often and it works well.

Ingredients:

1  web site consisting of n files to be served up (may be flat or in a folder hierarchy).

You Will Need:
·     A Windows Azure subscription
·     A cloud storage tool to work with Windows Azure blob storage such as Cloud Storage Studio or Azure Storage Explorer. We’ll use Azure Storage Explorer in our screen captures. 

Directions
Step 1: Create a Windows Azure Storage Account

In this step you will create a Windows Azure Storage account (you can also use an existing storage account if you prefer).
1A. In a web browser, go to the Windows Azure portal

1B. Navigate to the Hosted Service, Storage Accounts & CDN category on the lower left.




1C. Navigate to the Storage Accounts area on the upper left.


1D. Click the New Storage Account toolbar button. A dialog appears.
Note: if you want to use an existing storage account instead of creating a new one, advance to Step 1G.


1E. Specify a unique name for the storage account, select a region, and click OK. We’re using the name mystaticwebsite1 here, you will need to use a different name.


1F. The storage account will soon appears in the portal. Wait for it to show a status of Created, which sometimes takes a few minutes.

1G. Ensure the storage account is selected in the portal, then click the View Access Keys toolbar button. Record one of the keys (which you will need later) and then click Close.



Step 2: Create a Container
In this step you will create a container in blob storage to hold your files. A container is similar to a file folder. We use will use a cloud storage tool for this step.

2A. Launch your preferred cloud storage tool.

2B. Open the storage account in your tool. You will need to supply the storage account name (Step 1E) and a storage key (Step 1G).











2C. Use your cloud storage tool to create a new container.  Be sure to specify both name and container access level in the dialog.

  · Name: Give the container any name you like, such as web.
  · Access Control: Specify public blob access.


Step 3: Upload Files
In this step you will upload your static web files to the container you created in Step 2 using your cloud storage tool.

3A. In your cloud storage tool, select the container and click the toolbar button to upload blobs. A file open dialog will appear.

3B. Navigate to the folder where your static web files reside, select the files to upload and click Open.

3C. Wait for your files to upload and appear in the cloud storage tool.

3D. Check the Name (Uri) and ContentType property of each file you uploaded and revise them if necessary:

· Name: If you uploaded from your root web folder, no changes are needed. If you uploaded from a subfolder (such as /Images), you must rename blobs to have the “folder/” prefix in their name. For example, if you uploaded logo.jpg from an images subfolder, rename the blob from “logo.jpg” to “images/logo.jpg”.
· ContentType: The content type must be set or a web browser will be unsure what to do with the file. The content type may have automatically been set properly based on the file you uploaded and the tool you are using. If not, manually set it. The table below shows some common web file types and the proper ContentType value that should be specified.

File Type
Content Type
.htm, .html
text/html
.css
text/css
.js
application/javascript
.bmp
Image/bmp
.gif
image/gif
.jpg, .jpeg
image/jpg
.png
image/png
.mp3
audio/mp3
.wav
audio/wave
.ogg
audio/x-ogg
.mpeg
video/mpeg
pdf
application/pdf
.zip
application/zip

Be sure to check and correct the name and content type of each file you have uploaded.



3E. If you have subfolders of web content, repeat steps 3A-3D for each subfolder.

Step 4: Test Navigation

In this you will confirm your ability to access the site.
4A. Find the root index file of your web site and compute its URL as follows (the cloud storage tool you are using may be able to do this for you):

http://<storageaccountname>.core.blob.windows.net/<containername>/<indexfilename>

In the example we have been showing, the URL is:
http://mystaticwebsite1.core.blob.windows.net/web/index.html

4B. Visit your web URL in a browser. The site should come up, and should be fully navigable. Voila!

If the site is not accessible or is partially accessible with content missing, double check you have correctly performed the previous steps. Here’s a checklist:

· Did you create your storage account?
· Are the storage account name and key you have been using the correct ones?
· Did you create your container with a public access level?
· Is the container name you are using the correct one?
· Did you upload all of your web files to the container?
· Is the index file name you are using the correct one?
· Did you rename blobs from subfolders to have the folder prefix in their names?
· Did you verify the blobs have the correct content type?

Concluding Remarks
Congratulations, I knew you could do it! I have never been prouder.

It’s beyond the scope of this recipe, but be aware that if you wanted to have a prettier domain name you can map a custom domain to your container or forward a custom domain to your container/root-index-file.

Although running your static web site out of blob storage is quite inexpensive, you should remember to delete the blobs when you no longer need them; otherwise you’ll be charged for the storage and bandwidth used month after month.
What we’ve done here is quite different from how you would host a complex or dynamic web site using the Compute service; I hope it has served its purpose to get something of yours up in the cloud in a short period of time—and that it spurs you on to something more ambitious.

Next: Cloud Gourmet #3 - 30-Minute Meal: Migrating a Simple Database

The Cloud Gourmet: Cooking with Windows Azure


Bonjour and welcome to The Cloud Gourmet with your host, Chef Az-ure-D. Together we shall create delicious masterpieces in the cloud on the Windows Azure platform.

In this first post I want to share some of my favorite resources for cooking in the cloud. in subsequent posts we will explore individual recipes.

Now you may be thinking "chef, that's fine for you but I cannot cook!" Nonsense! Absurdité! Anyone can learn to cook in the cloud, and many items are simple to prepares. Together we shall learn. You will see.



Recipes

Of course we learn by doing, but sometimes you just need to get something accomplished and need guidance to ensure a successful outcome. That's why we have recipes. Let me share some of my favorite recipe sources with you.

Windows Azure Development Cookbook
Neil Mackenzie
http://www.packtpub.com/microsoft-windows-azure-development-cookbook/book


Neil Mackenzie (@mknz) is not only a Windows Azure MVP and respected blogger, he’s also the Julia Child of Windows Azure. His Microsoft Windows Azure Development Cookbook is just what it claims to be, a cookbook (available in print and Kindle editions). Neil’s cookbook is a step-by-step guide to accomplishing key development tasks on the Windows Azure platform with sample code all along the way. It includes chapters on access, blob storage, table storage, queue storage, hosted services, diagnostics, management, SQL Azure database, and AppFabric service.

Windows Azure How To Topics
Microsoft Documentation
http://msdn.microsoft.com/en-us/library/windowsazure/gg432998.aspx


There’s a lot of good information in the Windows Azure online documentation, and one of the best parts of that are the Windows Azure How To Topics pages and index. As you can see from this partial screen capture it covers a lot of tasks. Each how to page gives you the approach and steps to follow and shows sample code.

Windows Azure Training Kit
Microsoft
http://www.microsoft.com/windowsazure/learn/get-started/


The Windows Azure Training Kit contains a nice collection of hands-on labs. With the investment of an hour or two, each lab shows you step-by-step how to build something that leverages one or more of the services in the Windows Azure platform.



Shows

There’s nothing like a cooking show to get inspired: an expert shares insights, shows you how something is done, and then pulls a finished version out of the oven to show you the outcome.

The Cloud Cover Show
Steve Marx and Wade Wegner, Microsoft Channel 9
http://channel9.msdn.com/Shows/Cloud+Cover


Cloud Cover is your eye on the Microsoft Cloud. This weekly videocast by Microsoft evangelists Steve Marx (@smarx) and Wade Wegner (@WadeWegner) is excellent, educational, and entertaining. In each show they’ll take an area of Windows Azure and show it you close up as well as discussing its significance. Cloud Cover is also one of best ways to keep up with news about Windows Azure.

Session Videos from Microsoft Conferences


Microsoft puts on several large conferences each year including PDC, MIX, TechEd, and BUILD. The videos of the keynotes and technical sessions are usually kept online for a year on Microsoft Channel 9. In these you can hear from Microsoft product team members and developer evangelists.



Live Demonstrations

An in-person cooking demonstration is a real treat—especially if you get to cook alongside. These kind of events exist for Windows Azure. Keep an eye out for upcoming events in your area.

Windows Azure Bootcamps
http://azurebootcamp.com

From time to time, Microsoft and the MVP community will put on Windows Azure bootcamps which are usually 1- or 2-day free events. Here, you’ll hear topical presentations and be guided through hands-on labs with assistance. These events are also a great opportunity to talk directly to an expert.

Code Camps


Regional code camps are another great way to see live Windows Azure presentation and development. Windows Azure is often a topic covered at these events.



The Personal Touch

On-site Training


You get what you pay for, no? Perhaps you want more than the occasional free regional event and want on-site training, which can be tailored to your needs, people, location, and schedule. Windows Azure training is offered by some Microsoft patterns including Neudesic. Think of on-site Windows Azure training for architects, developers, and IT professionals as the equivalent of sending your people to a culinary institute.

Consulting

There’s nothing like a personal chef, eh? If you retain the services of a knowledgeable and experienceD consultant you are in good hands. You can leverage a consultant in a number of ways: they can advise you, help with design, and/or perform the actual development work. You can use consultants to create your solutions for you, or even better you can cook alongside them so you learn. These days they can work on location and/or remote, with on-shore and/or off-shore resources as desired. Windows Azure consulting is offered by some Microsoft partners including we at Neudesic.

My friends, this is by no means all. The Microsoft and community resources for Windows Azure are substantial. Once you have a feel for who in the community is working in areas that interest you, I urge you to follow their blogs and social network posts. I look forward to cooking in the cloud with you!

Next: Cloud Gourmet #2 - 30-Minute Meal: Migrating a Static Web Site

Sunday, October 2, 2011

Relaunching AzureDesignPatterns.com with HTML5 and Expanded Content

For several years now I’ve maintained a design pattern catalog of design patterns for Windows Azure (Microsoft’s cloud computing platform) at AzureDesignPatterns.com. I’ve recently overhauled the site with expanded content and it is now HTML5-based. Since this is a work in progress you can still access the former site.

Expanded Content

Expanded content on each pattern makes the site a lot more useful. You’ll find the typical sections found in most design pattern catalogs: problem, solution, analysis, and examples.

The patterns are arranged topically (Compute, Storage, Relational Data, Communication, Security, Network, and Application). Currently the Compute patterns are up on the site and content for the other categories is on their way. The navigation panel on the left allows you to open one of these categories and quickly find the pattern you want, and it works equally well with touch or mouse. By keyboard you can enter the name of a pattern in the search area with auto-complete.


This content ties in closely to my upcoming Windows Azure architecture book which is nearing completion. The book includes two parts. Part 1 describes the Windows Azure platform services and the architecture of applications that use it. Part 2 is a comprehensive design pattern catalog.

HTML5 Overhaul

I’ve recreated the site as an HTML5 site for several reasons. First, to broaden its reach: AzureDesignPatterns.com is now accessible across PC browsers as well as touch devices like tablets and phones. This is achieved by avoiding the use of plugins, handling backward compatibility with modernizr, and using fluid layout. The site selects one of four CSS layouts (desktop, tablet-landscape, tablet-portrait, or phone) to best fit the device it is rendering on. Layout areas and type are proportionally sized in accordance with the principles of responsive web design. Another reason for doing this is, I’m going deep on HTML5 this year and upgrading my existing sites is one way to practice and learn. This is my first “real” HTML5 experiment.


I found some nice shared resources online I incorporated into the site. I made use of the Less Framework to plan my device layouts and create my baseline CSS. To provide auto-complete on keyboard input in the search area, I adapted this auto-complete control. For animating the cloudscape behind the navigation panel, I used this animation example that leverages the MooTools JavaScript framework.

Hosting in Windows Azure

It would be kind of hypocritical for a design patterns site for Windows Azure to not be hosted in Windows Azure. However, this is a content-only site with no server-side logic—it doesn’t actually require hosting in the Compute service and we can save some expense by serving the site from low-cost Windows Azure Blob Storage, a technique I've previously written about. The same technique was used for the former Silverlight-based site.

I hope you enjoy the new Azure Design Patterns site and find useful.

Saturday, October 1, 2011

When Worlds Collide, Part 3: HTML5 + Cloud = Location, Location, Location

In Part 1 I wrote about the dual revolutions going on in web applications: HTML5 and devices on the front end, and cloud computing on the back end—how they influence each other and are together changing the design of modern web applications. In Part 2 we looked at the shared attribute of elasticity. In this third post we’ll discuss another aspect both worlds share: location (specifically, freedom of location).


Location in HTML5: Run Anywhere

Today’s active web users are on the move! They take the web with them wherever they go and whatever they are doing, even en route between destinations. That’s become possible because of devices, the increasing ubiquity of high speed Internet and wireless networking, and high availabilty and scale of online services . Users are no longer tethered to the home or office in order to use the web. In fact, web surfing on phones and tablets is expected to surpass PC web surfing by 2015.

It’s less and less common for an individual to only use one computer or device to get at the web. Depending on what needs to be done and where someone is, a user might reach out to a nearby PC, a tablet, or a phone. They might even use a device that doesn’t belong to them, such as a public web kiosk at an airport or a borrowed mobile device (“can I borrow your phone for moment?”). More and more, modern web apps can adapt expertly to different screen form factors and support touch, mouse, and keyboard equally well. This can be accomplished with HTML5 features such as media queries combined with fluid layout and responsive web design.


Applications and services that use location have become pervasive. When’s the last time you scrutinized a printed map and figured out a route yourself? Navigation systems and online map services such as Bing Maps, Google Maps, and Mapquest are now essential to everyday life for many of us. Finding a nearby Starbucks, ATM, restaurant, or hotel—along with reviews—couldn’t be easier. With user permission, HTML5 web applications can get geolocation information from the browser and device they are running on and put it to good use.

In an HTML5 world, we are free to go where we want and use any convenient device to get at our online world. Not only is location not a barrier, it’s an asset: something web applications can use to serve us better.

Location in Cloud Computing: Run Everywhere

A change in location is the first thing about cloud computing that jumps out at you: you’re putting your application and your data “up there” in a cloud data center. Why are you putting them there? Usually it’s for one or more of these reasons: reduced cost, high availability & reliability, elastic scale, fast time to market, automated management, or the flexiblity of not having to commit to a specific term of use. These are all compelling reasons to use cloud computing, but there’s another one to add to the list: location. Putting your assets out in the cloud makes them very accessible—universally accessible, limited only by the security you put in place.

Access is a big deal these days. So many employees now work out in the field or from home, and they’d prefer to avoid the limitations of VPN connections. Your customers want to use your online services wherever they happen to be, even if travelling. When you use the cloud, you’re spared from having to put your own infrastructure in place to support all that. Access to your online services anywhere, anytime is now a common expectation. The easy way to meet that expectation is to leverage the cloud.
For efficient delivery of media files to locales around the world, you can leverage content delivery networks. In the Windows Azure platform, the Content Delivery Network service utilizes a worldwide network of 24 edge servers to cache and serve up media files such as images and video.

If you need to support users across a large geography or have a wordwide presence, cloud computing makes that straightforward. You can deploy to multiple data centers. With the Windows Azure platform, for example, there are 6 worldwide data centers you can deploy applications to (2 in North America, 2 in Europe, and 2 in Asia). To direct user traffic intelligently to the nearest data center you can make use of the Windows Azure Traffic Manager service. At this level of use your application is truly global.

In the era of cloud computing, universal access and efficient serving to any locale is a reality. As our IT assets become virtualized, specific physical machines become unimportant: like caterpillars become butterflies, our software can now soar over a worldwide elastic infrastructure.

Write Once, Run Anywhere (and Everywhere)

Unless you’re young, you no doubt recall the “write once, run anywhere” promise that stirred up immense interest in Java when it was new. Businesspeople as well as technology fans were captivated by the idea of creating something once and then deploying and using it across many different platforms.

Today, HTML5 and cloud computing are delivering even more strongly on this promise for web applications. Together they allow us to run our web applications anywhere and everywhere. Location has never matter more. Or less.

Next: When Worlds Collide #4: HTML5 + Cloud = Personal Cloud