August 30, 2011

Microsoft Windows Azure Development Cookbook Review

Recently I got my hands on the Microsoft Windows Azure Development Cookbook book written by Neil Mackenzie (@mknz), and honestly I was impress with the quality of the examples he gives into it. As a disclaimer I have to say that the book was sent to me by the publisher however there are no incentives for me to write this review. Once again I think the book provides very good hands on examples for the complete set of services that Windows Azure offers – starting with Windows Azure Storage, going through the Hosted Services and ending with SQL Azure and AppFabric.

The value I saw in the book is that 1.) it explains each of the services with real examples, and walks you step by step through what is happening, and 2.) is written from the customer point of view (Neil is a MVP, who is dealing with Windows Azure since it was announced at PDC08). I personally found the following three chapters very valuable even for me:

  • Using the Shared Access  Signature for a container blob
  • Using the retry policies with blob operations
  • Autoscaling with the Windows Azure Service Management REST API

I am sure that I will refer to those three chapters very often for my own work on Windows Azure.

As a suggestion I would like to say to Neil that in the next edition I would be happy to see a section dedicated to the troubleshooting, debugging and profiling services on Windows Azure. From my own experience I can say that the majority of question I’ve seen have been in this area, and his experience with the platform as well as his independent view will allow him to provide really good troubleshooting tips and helpful workarounds.

I know Neil remotely, and we have interacted couple of time on MSDN forums or via Twitter. I can say that he is very knowledgeable about the topic, and you can learn a lot from the book and his personal blog.

 

I hope you will find the book a good resource, and kudos to Neil for writing it!

July 05, 2011

Will Google Take Over the Half of the Social Networking Market with Google+?

Yesterday Jason posted an interesting article on the Launch side called Why Google+ Will Take Half of the Social Networking Market from Facebook, in which he points out six reasons why he thinks Google will be successful with G+. While I agree with some and disagree with others, I thought it would be nice to get my view of the future.

Google Will Take Over the Whole Social Networking Market

How about this? Google has the potential to take over the whole Social Networking Market! Yes, this is absolutely possible! We have already seen this happen with MySpace and Facebook ($35M vs. $80B). And we have seen it Google doing it at the beginning of the century. But the keyword here is “potential”! Whether this will happen or not only time will show, but here is what makes me say that they have the “potential”:

  • For the past 10 years Google has dominated the Web with their search and services. Although the prediction is that search will plateau soon it is still growing and Google has the lion share of it. More searches means more users, and more users means more potential.
  • Google knows how to get users on their platform. Take for example AdSense, or Gmail, or Google Docs, or Analytics. All those services had tremendous success, and continue to do so. Although they had some failures lately with Waves, Orkut and Buzz they still have the potential to create good service.
  • Last but not least, Google has the money to compete. With $30B in revenue and $8.5B in net income in 2010 they are ~15 times bigger than Facebook (with their estimated $2B in revenue and $600M in net profit – see Facebook 2010 profit? Try $600 million on MSNBC). What this means is that they have the luxury to try-and-fail much more than Facebook.

 

What Does Google Need to Take Over the Social Networking Market?

Yesterday when I logged into Google+ my first reaction was: “It looks exactly like Facebook!”. The UI, the wall, the profile – absolutely the same. Then I discovered the circles: “Yeah, this is useful!”. But couple of new features, few UI improvements (honestly Facebook drives me crazy with their UI) and better control of personal data will not drive adoption of Google+. Things that will though are:

  • Get rid of the invites. People read all over the web that Google is releasing their “new” social network, and are excited to see it but if the only thing they see is “Check back later” they will either forget about it or will be VERY disappointed to see that it is “just like Facebook”. This worked well for Gmail but there was an significant advantage over other web based e-mail services  - it was offering tons of space FOR FREE. The same with Google Docs and Analytics – it was offering the same functionality FOR FREE. Facebook is already FREE, and this cannot be differentiator in this case. Keeping it closed will not increase the desire (like the Gmail case) but may fade out the curiosity.
  • Add additional value to my social graph. People are already sharing links, pictures, and videos. Nobody needs one more service for that (although from Google). What else can Google+ offer the users that Facebook doesn’t offer yet, and that will make them switch (or at least use both)? Hangouts? Not bad! But is that all? I am not giving suggestions but I am sure there are tons of things that can be done here.
  • Integrate with the other social networking services. I am sorry Google, but even Facebook integrates with Twitter and LinkedIn (and doesn’t just have links to those in my profile)! I know it is hard to overcome the feeling that Facebook will “own” your data but if you want users you better do it. We live in an interconnected world, and keeping my data for yourself (i.e. living in your own box) may not be the right strategy. If I am willing to share it with you I will be willing to share it with others too or not share it at all.
  • Make it easy integrate Google+ on third party web sites. Some people will say that this is following Facebook (and Twitter), and my answer is: “Yes! You are already a follower! Get it out ASAP! You know already how to do it!” Google+ buttons started appearing on the web sites but if Google doesn’t allow developers to build on their social platform (think Zynga and their contribution to Facebook success), and if they keep it closed to Google properties only their “success” will be limited. If Google puts G+ in users’ faces on every web site then they will start using it (somebody remember AdSense?).
  • Roll it out on every mobile platform. Don’t tell me that Google+ will be available only on Android phones! There will be two more years before I buy my next phone, and you are very optimistic if you think this will be an Android phone. And this is the case with… lot of users around the world. Even if IDC predictions are correct there will be still 56% of mobile users who won’t use Android in 2015. Are you willing to give up this market?
  • Improve my experience on the web. This is the area where I think Google can go the extra mile. With billions of users who search the web every day, Google is the best positioned to make a difference what content users consume, and eventually how do they consume it. But wait! I know what you are thinking – you can use my Google+ data to improve the search results on the web. Do that but for MY OWN search results. PLEASE, don’t use my Google+ data to improve the search results for other people (even my own friends) – I really don’t fit into the statistically representative sample, and this will totally screw their results.

 

Will Google+ Really Take Over Half of the Social Networking Market?

I doubt! 20% – yes! 30% – maybe! 50% – I don’t think so! Why? Here a few reasons:

  • Company size – Google is to big and too slow to compete with Facebook. Why it happens all over again and again? Microsoft did it 20 years ago with IBM; Google did it with Microsoft 10 years ago; guess what? Facebook will do it with Google now. It is always some small company that takes over and rules for a decade until it grows so big that politics and talent attrition start eating it from inside.
  • User perception – Google brand is not associated with social networking. With the rest of the web – yes, but not with social networking. Here are my associations:
    • Enterprise == IBM || Microsoft || Oracle || SAP
    • Desktop == Microsoft
    • Web == Google (think search, services etc.)
    • Social Networking == Facebook

      Somehow anyone of those companies fails to move into any of the other areas. I am not saying it is not possible (think how Microsoft entered the Enterprise space) but I guess you get my point.
  • Age – Google is too old to understand the new world. Companies are like people – the older they get the less risk they want to take and the slower they move and think. It is harder to get an older person out of their comfort zone, and this is happening with Google employees – those are people who lived through the Web ages; they understand the Web, and know how to control it but they don’t understand the Social Networks and don’t know how to control it (or how to let it loose).
  • Too many things on their plate – self-driven cars, anyone? Google is trying to do too many things that are 1.) not in their competence and 2.) distracting them from the market.

 

It is all predictions; the range is from 0 to ∞ (infinity) and Google has its fair chance to take over as much as it can. As an early adopter I will be using G+ but if I don’t see additional value soon I may as well forget about it.

June 21, 2011

Configuring Tomcat Logging

If you looked at my recent posts I was playing with Java and Tomcat a lot, and trying to run those on Windows Azure. One of the things I wanted to achieve is to store Tomcat log files if folder different than the default Tomcat location. Surprisingly for me configuring Tomcat logging turned out to be not so intuitive. Let’s start with the basics…

 

Where are Tomcat Logs Stored?

By default Tomcat stores the log files under
$CATALINA_BASE\logs

Where CATALINA_BASE is the folder where Tomcat is installed. If you open that folder you will see something like this:

 

06/21/2011  02:49 PM  7,534 catalina.2011-06-21.log
06/21/2011  01:37 PM      0 host-manager.2011-06-21.log
06/21/2011  02:49 PM  1,872 localhost.2011-06-21.log
06/21/2011  02:49 PM      0 localhost_access_log.2011-06-21.txt
06/21/2011  01:37 PM      0 manager.2011-06-21.log

 

For more information what each file is about you can read the Tomcat Logging page.

My goal was to move those log files to a folder different from

$CATALINA_BASE\logs

 

How to Configure Tomcat Logging (Really How)?

If you search Google (or Apache’s web site) you will find out that in order to configure Tomcat logging you will need to either:

  • edit the logging.properties file in $CATALINA_BASE\logs
  • or create new logging.properties and set the java.util.logging.config.file System property to point to it

The easiest way to use the second approach is to set the Environment Variable


LOGGING_CONFIG=”-Djava.util.logging.config.file=[your_logging.properties_file_location]”

 

As you may expect the default logging.properties file is located in $CATALINA_BASE\conf.


Now, the hard part with this is that you CANNOT use Environment Variables in Java properties file. And of course this was what I really wanted to do. In general what I wanted to do is to use the %ROLEROOT% Environment Variable in the location path for all the log files (see What Environment Variables Can You Use in Windows Azure). The workaround to this problem is to set Java System property to use the Environment Variable (ie. the –D option for java.exe). Tomcat startup scripts use Environment Variable JAVA_OPTS for exactly this purpose:

 

set JAVA_OPTS=-DMY_SYSTEM_PROPERTY=%MY_ENVIRONMENT_VARIABLE

 

For Windows Azure specifically you can use the Variable tag in CSDEF:

 

<Variable name="JAVA_OPTS" value="-D[my_property_name]=%ROLEROOT%\[some_folder]" />

 

Next, in order to use the System property in the Java properties file you need to specify it in the following format:

 

${[my_property_name]}

 

Here is what I actually did. In CSDEF you set the Environment Variables as follows:

 

<Environment>
    <Variable name="TomcatLocalResourcePath"
              value="%ROLEROOT%\Approot\temp" />
    <Variable name="JAVA_OPTS" value="-DTomcatLocalResourcePath=%
              TomcatLocalResourcePath%" />
</Environment>

 

and in the logging.properties you use the Java System property as follows:

 

1catalina.org.apache.juli.FileHandler.directory = ${TomcatLocalResourcePath}

2localhost.org.apache.juli.FileHandler.directory = ${TomcatLocalResourcePath}

3manager.org.apache.juli.FileHandler.directory = ${TomcatLocalResourcePath}4host-manager.org.apache.juli.FileHandler.directory = ${TomcatLocalResourcePath}

 

This is all good, however it takes care only of the following log files:

 

catalina.2011-06-21.log
host-manager.2011-06-21.log
localhost.2011-06-21.log
manager.2011-06-21.log

 

What about localhost_access_log.2011-06-21.txt? The access log file in Tomcat is not configured via logging.properties file but in server.xml file. You can read more about the Access Log Valve (which controls the access log) on Apache’s web site. The simple thing that you need to do is to set the directory attribute on the Valve tag as follows:

 

<Valve className="org.apache.catalina.valves.AccessLogValve"
               directory="${TomcatLocalResourcePath}" 
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b"
               resolveHosts="false"/>

 

UNIX vs. Windows vs. Java Property Files

As a final note some clarification on when to use dollar sign $, percent % and dollar sign with curly braces ${} as I think it may be confusing for some people:

  • As you know dollar sign $ is used to evaluate Environment Variables in UNIX. For example if you define the following Environment Variable in UNIX:

    setenv MYTEMPPATH /usr/temp

    you can use it later on as follows:

    setenv SOMEPATH $MYTEMPPATH/new
  • In contrast Windows uses percent % to evaluate Environment Variables. Here is the same example for Windows:
    set MYTEMPPATH=C:\Temp

    and you can use it as follows:

    set SOMEPATH=%MYTEMPPATH%\new

  • Property files in Java use the UNIX type of format but with curly braces to evaluate System properties. For example if you define the System property as follows:

    -DMyTempPath=C:\Temp

    you can use it in Java properties files as follows:

    some.property=${MyTempPath}

May 15, 2011

Running Java and Tomcat on Windows Azure VM Role

Just for an exercise I decided to see what is the experience for Java developers who would like to use Windows Azure as a cloud platform. Of course the easiest way to do this is to use the IaaS feature of Windows Azure – the VM Role.

Now, let’s go through the steps of preparing the VHD and deploying it to the cloud.

 

Preparing VM Role VHD with Java and Tomcat

In this particular case I used Hyper-V Manager on Windows Server 2008 R2 to prepare the VHD (for more details on VM Role you may refer to my previous post How to Deploy Windows Azure VM Role). As you may know at the time of this writing the only supported OS for VM Role is Windows Server 2008 R2. Here are the simple steps I went through:

  1. Started Hyper-V Manager on the local machine (running Windows Server 2008 R2 of courseSmile) and created new Virtual Machine

    image
  2. Selected memory size

    image
  3. Next was the Networking interface

    image
  4. And finally the Virtual Disk (VHD)

    image
    It is important to note that Windows Azure has limits on the Virtual Disk (VHD) size that you can mount in the cloud. Depending on how big your VM Role is (Extra Small, Small or Medium and above) you can mount different VHD sizes. For details look at the MSDN documentation for How to Create the Base VHD for a VM Role in Windows Azure. Oh, and yes, the screenshot is wrong Smile
  5. And I selected to install the operating system from the local DVD drive

    image


Here the summary for my VM:

image

 

Configuring the Virtual Machine for Windows Azure

As mentioned in my previous post How to Deploy Windows Azure VM Role in order to run the VM in the cloud I have to install the Windows Azure VM Role Integration Components but before that I had to enable .Net 3.5 Framework.

image

 

As you can see from the screenshot above I selected the top node for .Net Framework 3.5.1 Features however this introduced some problems. It seems that WCF Activation feature occupies port 80 and I wasn’t able to run Tomcat on the default port. You don’t need WCF Activation in order to install and run the VM Role Integration Components so you don’t need to install it. Alternatively you can install the IIS Management Console and change the bindings for WCF to a different port (see How to change the TCP port for IIS service for details).

 

Installing Java and Tomcat on the Virtual Machine

Once I had the main operating system and Windows Azure Integration Components installed I had to install Java and Tomcat on the Virtual Machine. I decided to go with very simple configuration using Oracle’s JVM and Tomcat and downloaded the 32-bit/64-bit Windows Service Installer from Apache Tomcat’s web site. The reason I went with service installation was that I wanted Tomcat to start automatically when my instance is started.

Of course I changed the port for Tomcat from 8080 to 80 during the installation process.

 

image

 

Now that you have everything installed on your local Virtual Machine you can follow the instructions in How to Deploy Windows Azure VM Role to create a package and deploy the VHD to Windows Azure.

 

Some Tips

If I had more time to play with it I would have separated the base OS from the additional components (Java and Tomcat) in two different VHDs:

  • Base Image will contain the OS only + the Windows Azure VM Role Integration Components
  • Differencing Disk will contain the Java installation and the Tomcat installation

You can upload both the Base and Diff VHDs to Windows Azure and link them so that they are considered as one when your instance is started.

May 01, 2011

Using DebugView to Troubleshoot Windows Azure Deployments

Recently I fell into the same trap lot of other developers fall into – my Windows Azure role instances were cycling, and the logs were not helpful to find out what was happening. Fortunately I was able to connect via Remote Desktop to my instance, and use DebugView to troubleshoot the issue.

 

Here are the steps you need to go through to troubleshoot your deployment:

  1. Configure your deployment for Remote Desktop access; for more details see my previous post Remote Desktop Connection to Windows Azure Instance
  2. In Windows Azure Management Portal select your failing instance and click on the Connect button. Note that the button will not be enabled all the time; normally it becomes enabled when the Guest VM that is hosting your code is up and running (normally, just before your instance is about to become ready)

    image
  3. Download DebugView from Microsoft’s TechNet site. You may decide to download it directly on the VM if you want to deal with the Enhanced Security for IE. If not you can download it on your local machine and just copy it via the Remote Desktop session.

    image

    I copied it under D:\Packages\GuestAgent but you can choose any other folder you have access to.
  4. Start Dbgview.exe and select what you want to capture from the Capture menu. You can start and stop the capturing by clicking on the magnifying glass in the toolbar.

    image

In my particular case DebugView was very helpful in troubleshooting command line script that I used as startup task.

March 28, 2011

What Environment Variables Can You Use in Windows Azure?

Yesterday I found the following forum post on Windows Azure Forums: How to get environment variable and information in startup task. At the same time I was prototyping some of our new features, and needed to achieve almost the same goal as in the forum post, hence I decided that it will be useful to publish some more details about what environment variables are available by default in Windows Azure, and how can you use them.

Environment Variables in Windows Azure

You may already know that you can define environment variables per role in Windows Azure Service Definition (CSDEF) file using the Environment tag:

 

<Environment>

     <Variable name="[my_name]" value="[my_value]" />

</Environment>

 

CSDEF schema allows you to put the Environment tag it either the Startup task tag or in the Runtime tag. It is important to know that environment variables that are defined for startup tasks are not available in the runtime and the reverse. Hence if you want to have environment variable that can be used in both the startup task and the runtime you need to define it twice.

Here an example for defining environment variables for startup tasks and for your role’s runtime:

 

<WorkerRole name="MyWorker">
     <Startup>
          <Task taskType="background" commandLine="my.cmd"

                               executionContext="limited"> 
               <Environment>
                    <Variable name="MY_ENV" value="my_value" />
               </Environment>
          </Task>
     </Startup>
     <Runtime>
          <Environment>
               <Variable name="MY_SECOND_ENV" value="my_value2" />
          </Environment> 
     </Runtime>

</WorkerRole>

 

Pre-Defined Environment Variables in Windows Azure

Of course the more interesting question is what are the pre-defined environment variables in Windows Azure, and whether you can leverage those. I wrote a simple Web Role that uses System.Environment.GetEnvironmentVariables(), iterates through all of them and prints them in a web page. Majority of the variables are standard Windows environment variables but here are some Windows Azure specific ones (Note: Those variables are specific to the process in which your role runs):

  • @AccountUsername ** – this is the username you can use for Remote Desktop connection to the role instance
  • @AccountEncryptedPassword ** – this is the encrypted password that you can use for Remote Desktop connection to the role instance. The password is encrypted using the SSL certificate for your Hosted Service
  • @AccountExpiration ** – this is the timestamp when the Remote Desktop account expires
  • @ConnectionString – is the diagnostics connection string for access to Windows Azure Storage. This is the configuration that you defined in the Service Configuration (CSCFG) file for your deployment. You can change this by modifying your CSCFG file.
  • DiagnosticStore – this is the location where diagnostics information is stored locally before transferred to the Windows Azure storage account
  • RdRoleId – this is the really unique identifier of the role instance. This information is not available in the Management Portal and it is build by concatenating the RoleDeploymentID and the RoleInstanceID.
    Example: eaaa6a386255466dada9dd158c5d4008.WebTest_IN_0
  • RdRoleRoot – is is the same as the RoleRoot above
  • RoleDeploymentID * – is the deployment identifier for your deployment and it is the same one you see in the Windows Azure Management Portal. This is the same for each role and role instance.
    Example: eaaa6a386255466dada9dd158c5d4008
  • RoleInstanceID * – is the unique identifier of the role instance. The instance ID uses the RoleName as a prefix. 
    Example: WebTest_IN_0
  • RoleName * – this is the role name.
    Example: WebTest
  • RoleRoot – this is maybe the most important environment variable in Windows Azure, or at least the one that you need the most. It points to the root where your Windows Azure role code is placed. Very often you will want to access some resource files for your role using %RoleRoot%\AppRoot.
  • __WaRuntimeAgent__ – this is the identifier for the runtime agent that is used by the Fabric controller to monitor your role. Again, it is very unlikely that you will need this one
  • WA_CONTAINER_SID – this is the system identifier of the Windows Azure container. It is very unlikely you will need this one

 

All environment variables marked with asterisk (*) above are available as properties in Windows Azure Management Portal.

You can change the environment variables marked with double asterisks (**) above by clicking on the role in Windows Azure Management Portal and then on Configure Remote Access.

Also, most of the information stored in the environment variables is available through the Windows Azure Runtime APIs. However those environment variables are accessible from both your role’s startup tasks as well as from the runtime.

 

Windows Azure Full IIS Mode and Environment Variables

One thing to remember is that if you use Full IIS Mode in Windows Azure you will NOT be able to access the environment variables mentioned above. The reason for that is that you should use the standard IIS programing techniques to access your environment. You will know that you are running in Full IIS Mode if you have the Site element in your Service Definition file.

February 06, 2011

How to Deploy Windows Azure VM Role

For a project that I started in Windows Azure I needed access to the VM Role functionality and hence I decided to test the experience from customer point of view. Here are the steps I followed:

  1. Request access to the VM Role functionality in Windows Azure
  2. Preparing the VHD for VM Role 
  3. Upload the VHD in the VM Image Repository on Windows Azure
  4. Create a hosted service to host the VM Role
  5. Upload Windows Azure Hosted Service Certificate
  6. Create package and deploy the VM Role to the hosted service
  7. Remote Desktop to the VM Role and install additional software if needed

Request Access to VM Role Functionality on Windows Azure

As you may already know Windows Azure VM Role feature is still in beta, and in order to use it you need to request access to the feature. You can do this using the following steps:

  1. Go to Windows Azure Management Portal at http://windows.azure.com
  2. Login using your Live ID, and click on Beta Programs in the left-side navigation
  3. In the main pane you will see the list of Beta Programs that are available as well as checkboxes for each one
  4. Click on the checkbox next to VM Role and click on the button Join Selected

Windows Azure Beta Programs

 

After you complete this workflow you need to wait until your request gets approved. I had to wait approximately two weeks before I received notification that my request is approved. Keep in mind that each Beta Program has its own wait time because they have different quotas and are approved by different teams within Windows Azure. Those times can also change based on the number of requests received.

Important: Please read the notification email carefully! In the email you will find information how to enable VM Role features in the Visual Studio development environment. In essence you need to run one of the scripts below to add new registry key or just change the following [dword] registry key:

HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\Windows Azure Tools for Microsoft Visual Studio 2010\1.0\VirtualMachineRoleEnabled​=1

 

The scripts above will enable the Add New Virtual Machine Role in the context menu in Visual Studio.

 

Preparing the VHD for Windows Azure VM Role

One important point I would like to emphasize when you prepare the VHD is the need to install the Windows Azure Integration Components. MSDN Library documentation is very explicit how you can do that using HyperV Manager.

Of course I don’t have the HyperV Manager on my Windows 7 machine and preparing the 64-bit image turned out to be a bit problematic (Note: At the moment Windows Azure supports only 64-bit VM Roles based on Windows Server 2008 R2).

The workaround I used was to install the Open Source VirtualBox software, and prepare the image with it. However you will need hardware virtualizations in order to create the 64-bit VHD.

 

Upload VHD Image to Windows Azure

The next thing you need to do is to upload the VHD file into Windows Azure image repository. I have created very simple VHD file with Windows 7 Ultimate using the Virtual PC in Windows 7.

In order to upload the VHD into the image repository you need to use the csupload.exe tool delivered as part of Windows Azure .Net SDK 1.3 or later. Here is how to use the tool:

  1. Open Windows Azure SDK Command Prompt as Administrator

    image
  2. Execute the following command

    csupload Add-VMImage -Connection "SubscriptionId=[subscription_id]; CertificateThumbprint=[certificate_thumbprint]" -Description "[description]" -LiteralPath "[vhd_location]" –Name [vhd_filename] -Location "[azure_subregion]" -TempLocation %TEMP% -SkipVerify

    image

    Where:
    subscription_id is the ID of the Windows Azure subscription where you want your VHD to be placed
    certificate_thumbprint is the thumbprint for the management certificate uploaded in the above mentioned subscription. Note: This is the Management Certificate used to manage Windows Azure services for this subscription and NOT the Hosted Service certificate you will need later on when you deploy the VM Role. 
    description is user friendly description you want to use
    vhd_location is the location of the VHD on your local machine or network
    vhd_filename is the name of the VHD file
    azure_subregion is the Windows Azure sub-region (you can find the names of the sub-regions in every offer description on Windows Azure web site – look for Data Transfer Details and expand the section)

    Few notes related to the csupload.exe tool:
    1.) Make sure that you have write permissions to the vhd_location folder else the command will fail during verification. If you do not have write permissions to the location folder you can use the –SkipVerify option or specify –TempLocation as I did above
    2.) At the time of this writing there was an issue with verification on 32-bit Windows 7, and if you are trying to upload the VHD from 32-bit Windows 7 machine you may encounter some errors. In this case use the –SkipVerify option.

Depending of the size of your VHD and the upstream speed of your Internet connection you may need to wait a while until the upload is complete.

Once the VHD image is uploaded to Windows Azure you will see it in the image repository in the Management Portal.

 

image

 

Create a hosted service to host the VM Role

You create the Hosted Service for VM Role the same way you create Hosted Service for Web or Worker role. One important thing you need to remember is to create the hosted service in the same location where you have uploaded the VHD. If you forget to do so you will receive the following (very explanatory) error message at deploy time:

 

HTTP Status Code: 400
Error Message: A parameter was incorrect. Details: One of the specified images cannot be used for creating the deployment. When you want to create a deployment that is based on a machine image, one of the following constraints must be met: (1) the hosted service and the image belong to the same affinity group, or (2) neither the hosted service nor the image belong to an affinity group, but their location constraints are the same, or (3) the hosted service belongs to an affinity group and the image has a location constraint equal to the location constraint of the affinity group. Here are the details about the current deployment: Image [image_name] does not belong to an affinity group. Its location constraint is [vhd_location].Hosted service [hosted_service_name] is not in an affinity group. Its location constraint is [hosted_service_location].
Operation Id: [some_operation_id]

 

I am not going to describe the Hosted Service creation process in details – you can do this quite easy from Windows Azure Management Portal.

 

Upload the Hosted Service Certificate

 

Before deploying VM Role you will need to upload Hosted Service Certificate (also used to enable SSL communication to your endpoint). Here is how you do that:

  1. In Windows Azure Management Portal select the Hosted Services, Storage Accounts and CDN tab and then Hosted Services in the top left navigation
  2. In the main pane expand the Hosted Service, into which you want to upload the certificate and select the Certificates

    image
  3. Click on the Add Certificate button in the ribbon

    image
  4. Browse for the certificate locally and type the password for it

Create Package and Deploy the VM Role to Windows Azure

In order to deploy the VM Role to Windows Azure you need to create a CSPKG package and CSCFG for your application and deploy those to the hosted service you created in the previous step. Here is how to do that:

  1. In Visual Studio 2010 create a new Windows Azure Project

    image
  2. In the next step in the wizard it is important that you DO NOT create any Windows Azure Role – thus the project will only have CSPKG and CSCFG files created and no separate projects for the roles

    image
  3. Now that you have the project and have changed the Visual Studio configuration to show the Add->New Virtual Machine Role option you can click on the Roles node (or the Project node) in the project and add the VM Role

    image
  4. If you don’t have your Windows Azure account configured in Visual Studio you will need to do that first. You will need to use the same subscription you used to upload the VHD file for this configuration.

    image
  5. If you have your Windows Azure account already configured you can select the VHD from the drop down menu

    image
  6. In the configuration tab you can change the number of instances you want to have for the VM Role
  7. You can also add endpoint for the VM Role and make it accessible from outside. I personally enabled port 80 and port 8080 for my test role

    image
  8. Once you are done with the configuration right-click on the project and select Publish

    image

    You will see the publish dialog: 

    image
  9. Configure Remote Desktop for all the instances by clicking on the link right above the buttons

    image

    Note: The certificate you choose in this window MUST be the same you uploaded to your Hosted Service in the previous section.
  10. Click on the OK button and wait until the deployment is complete 

    image
  11. Once the deployment is done you can see your VM Role running in Windows Azure Management Portal

    image

Remote Desktop to VM Role

You can Remote Desktop to the Windows Azure VM Role from Windows Azure Management Portal by selecting the instance you want to remote to and clicking on the Connect button in the ribbon:

 

image

 

You will be asked for the username and password – you should use the ones that you set up in step 9. in the section Create Package and Deploy the VM Role above. You may need to specify the machine name before the user name in order to login into the system – if you don’t have the actual machine name you can use the Hosted Service name and it will work:

 

image

 

I already had all the software installed on my VM and didn’t need to do any other installations.

 

Hope this step-by-step guide will help you bootstrap your Windows Azure VM Role deployment.

November 03, 2010

SEO Tips and Tools (My Raw Notes)

Last week at #cmgrchat the theme was Blogging and Community but the topic of Search Engine Optimization and Search Engine Marketing (SEO/SEM) was discussed also thoroughly. Throughout the discussion I promised @digitalmention to share my notes that I have collected few years ago, and here is the post I have promised.

Before you scroll down I have to mention that those are raw notes with SEO tips and links to tools that were intended for my sole use and purpose. You are welcome to use those, however keep in mind that some of the links and/or information may be outdated. I will be glad to answer any questions and to clarify any of the notes below – just drop me a comment, email or tweet.

Substantial part of the notes I took while reading the following book that I highly recommend:

Search Engine Marketing, Inc.: Driving Search Traffic to Your Company's Web Site (2nd Edition)

Other very useful SEO/SEM resources on the Web are:

Majority of the information below as well as much more can be found in the resources above.

And here the notes…

 

Little Terminology

Link popularity:

  • The links to the site need to contain the keywords. This gives more weight to the link. So called anchor text.
  • Look for authority – those are web sites that have high rank; and request links from them to your site.

Keywords:

  • Keyword density (keyword weight) should be around 7%
  • Keyword proximity – how close are the search terms
  • Keyword prominence – where the search terms are found. The most important are:
    • Title
    • Headings and emphasized text
    • Body
    • Description

 

Searcher’s Behavior

  • Navigational, informational and transactional searchers – target last two
    • If you search for leads informational is the best – provide good content and links to the sites
  • Search engines take the snipped from the content – the content should contain the keywords close to each other
  • Use the 3-seconds rule: Can the buyer tell what are you selling in 3 seconds? If not, simplify your copy
  • Create content pages that lead the informational searchers to the lists of “product” you want them to buy
  • Provide entertainment on the site so people can spend more time on it and come more often

 

Steps to Follow in Your SEM Campaign

  • Identify the goals of your web site. Examples
    • Web sales
    • Offline sales
    • Leads
    • Market awareness
    • Information and entertainment
    • Persuasion
    • Influencing public opinion
    • Helping people
  • Target your first search marketing campaign
    • Choose the target area of your site – make matrix using the four metrics below and answer with Yes/No/Unknown. 
      • Pick something high profile (don’t pick sleepy product)
      • Make sure the business impact is measurable
      • Keep it simple (don’t collide with other marketing programs)
      • Make it practical (don’t use the best product if it will be hard to cooperate with the people developing it)
  • Focus on keyword searchers use
  • Asses your current situation
  • Calculate your first campaign’s opportunity (www.targeting.com)
    • Check your keyword demand
    • Discover your missed opportunities
    • Some statistics           
      48% of searchers click a result on the first page
      60% of these users click organic result
      ----------------------
      29% of all searchers click organic result on the first page
      Anecdotally between 1.8 and 2.8 results are clicked for every search, hence:  1.8 * 29 = 52 clicks per 100 searches
      ----------------------
      #1 - #3 -> 8% - 30% of the clicks for all searches
      #4 - #10 -> 0.5% - 7% of the clicks for all searches
      #11 - #30 -> 0.25% of the clicks for all searches

 

Some Useful Tools

http://www.marketleap.com/publinkpop/default.htm

http://www.marketleap.com/siteindex/default.htm

http://www.marketleap.com/verify/default.htm

http://home.snafu.de/tilman/xenulink.html


Beware of Spider Traps


… And Create Spider Paths

  • Site Maps
    • Words used for links can have heavy weight
    • If category pages are used then descriptive paragraph can be added to each page
    • Links in Sitemaps should be ordered by level of importance because some spiders limit the number of links that will be indexed on a page
    • Try to include text on the sitemap
  • Country Maps

 

Choose Your Target Keywords

  • Choose the right words for your search; concentrate on keywords that are right for your site – if you cannot offer conversion for the keywords you are targeting it makes no sense to target them
    • Target hot words only for brand awareness
  • Don’t use words with multiple meanings
  • Don’t choose too cold words
  • Target longer phrases – 2 or 3 words
  • Keyword planning steps
    • Gather your keyword candidate list
      • Ask people around you how will they search for your web site
      • Focus first on nouns
      • Add adjectives after the nouns; list several different categories of adjectives like comparison, qualifier, function, attributes, action etc.
      • Ask the following questions
        • What do your customers need? What problem are they trying to solve? What words do they use to describe their needs and problems?
        • What content do we have on our site that would satisfy someone’s search? What words would you search for to find that content?
        • How would you describe your product to a novice?
        • What words do industry magazines and industry analysts use to describe your products? Is there a product category name that they use?
      • Check your current search referrals
      • Don’t target existing customers for search
    • Research each keyword candidate
    • Prioritize your keyword candidate list
      • Top priority – close match to your site’s content and is very popular or moderately popular or has high conversion rates
      • Medium priority – close match to your site and is somewhat popular with acceptable conversion rates
      • Low priority – close match to your site and has enough searches to be worth paid placement, but not worthy for organic search optimization efforts
      • Target the keywords based on the web conversion cycle – Learn, Shop, Buy

 

Content Optimization

  • What engines search for
    • Filters
      • Language filters
        • Language metatag - <meta http-equiv=”content-language” content=”en”> - engines never decide the language using this tag alone
        • Character encoding - <meta http-equiv=”content-type” content=”text/html; charset=shift-jis”>
        • Content analysis – metatags are used only if the language cannot be determined by the content
      • Country filters – by IP
      • Other filters
        • Pay special attention to improper language on message boards and forums because the site may be filtered for that
  • Search Ranking Factors
    • Page Ranking Factors – any particular page’s page factor is exactly the same for every query
      • Link popularity
      • Popularity data – search engines keep track what pages you visit with the help of the toolbars
      • URL length and depth – longer URLs reduce the page ranking
      • Freshness – if the page is not changed for a long time the rank will be lowered
      • Page style – use newspaper article style
      • Site organization – good and easy navigation
      • Spam-free
    • Query Ranking Factors
      • At least one of the keywords needs to be found on the page unless enough links containing the keyword link to the page
      • Keyword prominence – more weight have keywords in the title and the headings (placement) as well keywords closer to the beginning of a page element that they are (position) -> the most prominent keywords at the beginning of the title
      • Keyword density – search engines like 7% (mystery number)
      • Keyword frequency – how often the keyword is seen on the page; Note: Avoid spamming
      • Query intent – navigational (site’s home page), informational (pages rich on content) or transactional
      • Contextual relevancy – takes into account the searcher’s job, gender etc; also location, subject of pages viewed recently, recent search keywords etc.
      • Term rarity (multiple-word queries) – search engines take from the query the term that is most rare and filter the pages by it
      • Term proximity – how close to each other the terms are
  • Step by Step writing for search
    • Choose a landing page for a set of keywords – choose based on what the searcher wants to see and not what you want him to see
      • Use “keyword site:www.mywebsite.net” for finding good candidates
      • You can optimize more than one page for the same keyword and link between these pages – this will boost the ranking
    • Analyze the landing page’s metrics
      • Organic search rankings for the landing page sing multiple search engines
      • Search referrals
      • Web conversions – this one is the most important one
    • Audit the landing page
      http://ranks.nl/tools/spider.html
      www.sitecontentanalyzer.com
      www.webceo.com
      www.webposition.com
      http://www.majesticseo.com
      • Analyze the title
        • Use trigger words like local place names, low prices, prized features, and time sensitive offers
      • Analyze the snippet – these are excerpts of text from the page
        • Different engines use different ways to choose the snippet – very often they use a section of text where all or most of the keywords are found together. The first occurrence in proximity is frequently the excerpt chosen
        • The snippet algorithm changes over time so it is worth chasing it
      • Tune your description
        • It has far less weight than the body
      • Evaluate the body text
        • Using the keyword as first word is 100% prominence
        • Important places for keywords
          • Headings – receive higher weight with <h1> receiving the highest
          • Keywords at the beginning have more weight than at the end
          • Emphasized text – bold and emphasized texts
          • Links – important for intra-site links
          • Everything else
        • How to write good pages
          • Keep it short
          • Write with variety – use plural forms, verb tenses, different word order
          • Think location – for local businesses add the local names
          • Think local – when translating
          • Think like a newspaper reporter – start out with the most important information; continue to emphasize concepts; end with strong conclusion
          • Think like a direct marketer – think about the title and the snippet
          • Avoid tricks
        • HTML hints
          • Using <div> you can place the content early in the code but anywhere on the visible page
          • Non-text elements
            • Remove embedded scripts and style sheets
            • Avoid overemphasis on images
            • Avoid text hidden in images
            • Avoid poor alt text – don’t stuff keywords unrelated to the picture
      • Examine your link popularity
        • Quality of links is more important than the quantity
    • Improve your landing page’s content

 

Attracting Links

  • Bow-tie theory
    • Core pages – 30% (high importance)
    • Origination pages – 24%
    • Destination pages – 24% (high importance)
    • Disconnected pages – 22%
  • High importance for ranking has the text in the links to the page
  • Search Engines evaluate the link popularity in 4 different ways:
    • Link quantity
    • Link quality
    • Anchor text
    • Link relevancy
  • Hub and authority pages
    • Hub pages – pages that link to several or many other pages on similar subject
    • Authority pages – pages that are linked to by many other pages on a particular subject
  • Which sites can deliver the most qualified visitors to yours:
    • Sites with lots of traffic
    • Sites related to yours
    • Sites with less competition
  • Hints
    • Look for links that will increase your conversions/will drive the most qualified visitors
    • Seek out relevant, popular sites, especially sites that do not have many competing links on them
    • How the engines check sites “within family”
    • When considering outbound links
      • Is the site well written and credible? – this is a good service to your visitors
      • Is the site content strongly related to yours?
      • Is the site competitor to yours?

 

Step-by-step Link Building

  • Make your site is a link magnet
    • Identify link landing pages – similar to search landing pages
      • Complementary product or service
      • Valuable information – article, FAQ, a blog, a newsletter, a white paper, e-book etc
      • An authoritative source of information – the landing page can be the right place to find links to the most trustworthy pages about a subject
      • A desirable tool – suggest ideas based on interest
      • A business relationship
    • Design the right landing pages
      • Reinforce the topic – to attract links, you must know what the subject of your page is; have a strong idea what the anchor text should be – use the same text as a prominent heading on the page and in the title tag
      • Never change the topic
      • Deliver excellent content
      • Use link-friendly URLs
      • Take down the roadblocks – show directly the page and don’t ask for more information before that (like registration, country etc.)
      • Keep good company – request links from quality sites only
      • Draw visitors deeper – make sure they are invited into the site
    • Link landing pages can be the same as search landing pages
  • Perform a link audit
  • Identify sources of links
    • Find a reason why some site should link to you
      • How does this help their visitors?
      • Do you offer a complementary product or service?
      • Information their visitors need?
      • Useful tool?
      • Do you have an existing business relationship?
      • Are you going to offer their customers discount?
      • Will you pay them to link?
      • Will you link back to them
    • Why do you want them to link to you?
      • Does it draw high traffic?
      • Is it qualified traffic for your conversions?
      • Does it have high quality content?
      • Is that content relevant to your site?
    • Types of links
      • Internal links
        • Carefully select the anchor text
      • Relational links – links from existing business relationships
      • Solicited links
        • Does the site contain creditable, well-written information?
        • Does the site’s content relate to yours in a strong way?
        • Are the visitors to the site the kinds of visitors you want at your site?
        • Is the site a competitor of yours? – don’t waste time requesting links from such
        • Where to search for such sites?
      • Paid links
  • Negotiate your links
    • Address it to a person
    • Use a compelling subject line
    • Use a simple body format (no HTML, no pictures)
    • Prove you visited the recipient’s site – do this in the first paragraph
    • Sell – need a very simple but compelling reason for an endorsement to your site; for two way link request make sure you have already placed the link on your site
    • Identify the page to be linked from – use different anchor text every time
    • Identify the page to link to
    • Ask for response
  • Link management tools

Rank Checking Tools

 

Resources

 

  Advertisement

 

 

   

 

October 28, 2010

Remote Desktop Connection to Windows Azure Instance

It has been long time since my last post related to Windows Azure. We have been concentrated on delivering all the new and exciting features for PDC2010, and of course we wanted to keep them secret.

In this morning’s PDC2010 keynote Bob Muglia revealed the secret, and I would like to start with my favorite feature – establish Remote Desktop connection to any Windows Azure instance. Here is the step-by-step guide how to enable the feature, and how to use it.

Configuring Windows Azure Deployment for RDP

The first thing I did is to create new basic Cloud Project in Visual Studio. I called it Hello RDP. Nothing new here. I modified the Default.aspx page just to make it say: “Hello, RDP!”.

Here are the steps (quite simple) that you need to go through to enable Remote Desktop in your deployment:

  1. In Visual Studio right-click on the Cloud Project (Hello RDP in my case) and select Publish. You will be presented with the Deploy Windows Azure project dialog below:

    image

    I have selected the Create Service Package Only option but you have the choice to deploy from Visual Studio to the cloud directly if you want.
  2. Next click on the link Configure Remote Desktop connection above the OK button. You will see the Remote Desktop Configuration dialog where you can select the certificate you want to use to encrypt the credentials as well as the actual credentials you want to use to login to the instance and the expiration date for the password.

    image
    In the Certificates drop down you can select a certificate from your local cert store or create a new one that will be sored locally. After you fill in all the information click on the OK button in the current dialog as well as in the deployment dialog.

    Your package will be created on the local hard drive.

    Note: If you do not have Hosted Service created and/or if you don’t have the certificate already uploaded through the Windows Azure Portal you should create the package locally and deploy it through the Portal. See next section for more details.

Configuring the Windows Azure Hosted Service

In the current implementation (as of PDC10) you need to create hosted service and upload the certificate before you do the deployment. There may be some changes for the official release of the new UI in order to make it more streamlined. Here is the current workflow:

  1. Load the Windows Azure Portal and click on Compute, Storage & CDN in the navigation area

    image
  2. Click on the Compute Services node in the tree. In the grid you will see your subscription (or subscriptions if you have more than one)

    image
  3. Click on the New Hosted Service button, and you will get the dialog to fill in Hosted Service and Deployment information

    image

    In the new Windows Azure Portal UI we combined the creation of Hosted Service and the Deployment in one step. However for RDP you should choose the “Do not deploy” option because you will receive error if you don’t have the certificate uploaded.
  4. When you fill in all the information click the OK button and you will see your Hosted Service appear below your subscription.

    image
  5. Expand the Compute Services node in the tree and select the Service Certificates node

    image
  6. Click on Add Certificate to open the Upload Certificate dialog. Select the same certificate that you selected in the Visual Studio dialog when configuring your package, and click the Create button.

    Note: Make sure you select the right Hosted Service in the Target Hosted Service dialog

    image
  7. After it is uploaded you will see your certificate in the grid

    image
  8. Go back to the Compute Services view and click on New Production Deployment (or New Staging Deployment if you want to deploy to staging). Create a new Deployment dialog will appear where you can select the package and the configuration file you created in visual studio above.

    image
  9. After clicking OK you will see new line item in the grid that represents your deployment. In addition you will receive frequent updates what is happening with the deployment, and it will expand once the roles and instances are spun up. Really cute – isn’t it? Winking smile We refresh the status every 10 seconds.

    image
    Now, you just need to wait until your deployment is complete.

Connecting to the Windows Azure Instance

Once the deployment is complete the instances will be in Ready state, and when you select any one of them the Remote Desktop Connect button in the ribbon will light up.

image

 

When you click the Connect button you will be asked to download RDP file from the Windows Azure Portal (Note: Silverlight will also present you with security warning the first time you click on the Remote Access Connect button; you can select the checkbox in the warning if you don’t want to be warned in the future). You can select Open in the prompt for downloading the RDP file and the connection to the Windows Azure Instance will be established. Optionally you can save the RDP file locally for future use.

 

image

 

Voila! You are in!

 

image

 

Finally, it is highly recommended that you turn off Remote Desktop access to your Windows Azure instances when you don’t need it in order to avoid security risks. You can do this very easily from the Portal – just select the Role row, and uncheck the Remote Access Enabled checkbox:

image

 

Final Notes and Disclaimers About the Remote Desktop Feature

Couple of things I would like to mention at the end:

  • First, the Remote Desktop feature is scheduled to be released at the end of the year, which means we are still working on it and there may be some changes in the workflow
  • And second, the new Windows Azure Portal UI is also scheduled to release at the end of November and there may be some changes in the UI also. I have used the environment we use for the PDC demos to make the screenshots above, and if you are attending the conference you will see the same UI in the hands-on labs

I will try to update this blog post with any changes we make between PDC and the final release.

Hope you enjoy the new features in Windows Azure, and as always your feedback is highly appreciated.

 

Update (March 30th 2011) – Troubleshooting Remote Desktop Connectivity Issues

If you are experiencing issues establishing remote desktop connection to your Windows Azure instance you may want to check the RDP file that is downloaded from Windows Azure Management Portal. Here is what you need to do:

  1. Click on Connect button in Windows Azure Management Portal
  2. Save the RDP file on your local machine
  3. Open the RDP file with Notepad and verify the following
    full address:s:[your_dns_name].cloudapp.net
    username:s:[your_remote_desktop_username]
    LoadBalanceInfo:s:Cookie: mstshash=[role_name]#[instance_name]#Microsoft.WindowsAzure.Plugins.RemoteAccess.Rdp

In some occasions
#[instance_name]#Microsoft.WindowsAzure.Plugins.RemoteAccess.Rdp
part will be missing and this will prevent you from establishing remote connection to your Windows Azure instance
. Add the necessary information to the RDP file and save it.

You can get the role_name and the instance_name from the Management Portal

 

  Advertisement

 

 

   

 

October 10, 2010

3 Things Developers Always Miss... And Customers Get Annoyed With

Last week I had to deal with very interesting bug that reminded me of the common mistakes developers make. Here is the story. We use inclusion list (aka “white list”) for allowing access to users from specific domains. Everything worked fine with the initial list of domains we had, however after adding some more domains to the list users from those domains were not able to login. To amplify the problem the issue appeared to be present only in our production environment, and we were not able to reproduce it in any of our test environments. 

As it turned out the problem was quite simple. Can you guess it? Yes - trimming white spaces. Something so simple is able to turn the live of developers and testers into a nightmare but not only that - it can annoy customers like hell. In each and every project I was part of, I have seen this one repeated again and again together with two other common mistakes: case insensitive comparison and sorting in the UI. Let me elaborate a bit on all of those.

Trimming Forwarding and Trailing White Spaces

Honestly, I can’t think of a scenario where one doesn’t want to trim forwarding and trailing white spaces when user input is involved. The chances that users will add additional space while typing or paste text with spaces at the front or the end are close to 100%. From other side we are so used to software that handles such simple transformation for us that we already take it as given. Hey, we are not in the 90s anymore (or at least most of us)!

For comma or semicolon separated lists trimming the white space is a must have. The simple reason for that is that people intentionally add spaces for readability, and not trimming those will result in such silly bugs.

Here is an interview tip for you! Next time you interview a developer, ask him to read the items from comma separated list and compare it to some user input. Depending on how he does on this simple assignment you can guess the quality of your future implementation. I am pretty sure you will get very interesting answers.

Case Insensitive Comparison

How often happens to you that type your credentials on some web site and you cannot login? Then you start wondering whether you forgot your password only to discover after 5 mins after that they forgot to mention on the login screen that your username is case sensitive. Smart, isn’t it? Not really! Shift and Caps Lock keys are so close to each other and the odds that one switches to caps lock while typing are quite high. My nickname is ToddySM doesn’t matter whether I type it “toddySM”, or “Toddysm”, or “ToDdYsM” - I still expect you to sign me in. If you don’t the chances are that I will use your product less or not at all.

One note here though - make sure you don’t do case insensitive comparison for passwords. People expect passwords to be case sensitive because this is part of the algorithm to create strong password. And to give you good example for usability, Windows warns you with yellow bang when you have caps lock on on the login screen - small hint that I bet lot of people appreciate (including myself).

To expand my interview tip from above - ask the developer to implement back end for login screen. Pay good attention how the comparison of the string is done - case insensitive for username but case sensitive for the password

Sorting in the UI

Let me be clear here - it is not about sorting, it is about providing intuitive way to find the one thing one needs among tens or hundreds of others. Take for example the list of countries - if nobody bothered to show a sorted list of countries in the drop down lists every registration page on the Web would be nightmare to fill in. Unless you have special reason not to sort, and this reason is more than obvious for the average user, sorting is the your best bet to make your UI usable. Even if the default view you provide is not sorted you should give an option for the user to sort ascending or descending. 

Here an example from TweetDeck where I have few lists created. Of course, the developers of TweetDeck forgot the sorting - it is manageable (but still annoying) at the moment but can you imagine if I have more than 20 lists created (and I do plan to have more than 20).

Screen shot 2010-10-08 at 10.06.23 PM

Different example I have is the way regions are presented in Windows Azure Portal. Here is the current list:

Anywhere Asia
Anywhere Europe
Anywhere US
East Asia
North Central US
North Europe
South Central US
Southeast Asia
West Europe 

Of course the list is sorted, but is it usable? I don’t think so - If I am US customer I will expect to see all US regions to be together so that I don’t need to search for them. Here is a better choice (again sorted): 

Asia - Anywhere
Asia - East
Asia - Southeast
Europe - Anywhere
Europe - North
Europe - West
US - Anywhere
US - North Central
US - South Central

(Don’t worry! We are fixing this soon ☺)

My last interview tip - use the first list above, and ask the developer to present it in the UI.  

Development is not anymore about moving bits from one place to another - development nowadays is about the experience. I hope the tips above will help you develop better and more usable software in the future. 

 


Advertisement


    Free trial