Vadim's Weblog

Never stop learning.

MbUnit 3.2 makes it easier to work with Xml

Posted by Vadim on July 18, 2010

In my previous article I mentioned about upcoming new release of Gallio /  MbUnit.  Feel free to download the Release Candidate and try it for yourself.  In this post I’ll talk about another new feature.

Not everybody like XML but everyone had to work with it. It’s used for many different purposes. Most people use it for configuration like web.config or .csproj / .vbproj. Some people use this format for data, others for communication. I believe that it’s going to be very hard to find a .NET developer that didn’t work with XML. If you do work with XML and you like to unit test your code, than I have good news for you. With new upcoming version 3.2 of MbUnit you are going to get better support to unit test your XML code. The Gallio team gives us three new Assert methods to test XML:

  • Assert.Xml.AreEqual
  • Assert.Xml.Exists
  • Assert.Xml.IsUnique

Assert.Xml.AreEqual

Let start by showing a simple and probably very obvious example:

        [Test]
        public void TestXmlAreEqualWithString()
        {
            const string xmlString =
                "<Books>" +
                "  <Book title='C# in Depth' />" +
                "  <Book title='Learing C#' />" +
                "</Books>";

            Assert.Xml.AreEqual(xmlString, XElement.Load(new StringReader(xmlString)).ToString());
        }

In the example above we’re comparing XML strings.  There’s another overload that instead of strings takes TextReader objects.

        [Test]
        public void TestXmlAreEqualWithTextReader()
        {
            const string xmlString =
                "<Books>" +
                "  <Book title='C# in Depth' />" +
                "  <Book title='Learing C#' />" +
                "</Books>";

            TextReader textReaderXml = new StringReader(xmlString);
            Assert.Xml.AreEqual(
                new StringReader("<Books><Book title='C# in Depth'/><Book title='Learing C#'/></Books>"),
                textReaderXml);
        }

As you can see, the formatting of XML is different, but our test still succeeds since it represents the same XML.

Let’s now make a small test.  We know that XML is case-sensitive  language.  What is going to happen if you we mismatch case?  Let’s make expected value for one of the book title ‘Learning c#’ instead of ‘Learning C#’.

        [Test]
        public void TestXmlAreEqualWithString()
        {
            const string xmlString =
                "<Books>" +
                "  <Book title='C# in Depth' />" +
                "  <Book title='Learing C#' />" +
                "</Books>";

            Assert.Xml.AreEqual(
                "<Books><Book title='C# in Depth'/><Book title='Learing c#'/></Books>",
                XElement.Load(new StringReader(xmlString)).ToString());
        }

After executing this test, we will see the following error that conveniently highlights the problem area:

AreEqual_error

Wait a second.  But what if in my application I don’t care about case-sensitivity for my data?  Well, in this case guys from the Gallio team provided us with an optional parameter of type XmlOptions.  Therefore, if we add XmlOptions.Loose parameter to our Assert.AreEqual, our test is going to pass.

            Assert.Xml.AreEqual(
                "<Books><Book title='C# in Depth'/><Book title='Learing c#'/></Books>",
                XElement.Load(new StringReader(xmlString)).ToString(), 
                XmlOptions.Loose);

You can find more information on XmlOptions in the Gallio Wiki site.

 

Assert.Xml.Exists

This assertion method checks if an element or an attribute can be found in a specific XML document.

  • The first parameter of Assert.Xml.Exists method is an Xml document.   Like in Assert.Xml.AreEqual method you can represent Xml document as a string or a TextReader object. 
  • The second parameter is an Xml Path that can be either a string in format “/element[/element]:attribute” or an object that implements IXmlPathLoose interface.
  • The third parameter is already familiar to us XmlOptions object.

Let’s look at a specific example where will check if Book element exists. 

        [Test]
        public void TestXmlExistsForElement()
        {
            const string xmlString =
                "<Books>" +
                "  <Book title='C# in Depth' />" +
                "  <Book title='Learing C#' />" +
                "</Books>";

            // Xml Path as a string
            Assert.Xml.Exists(xmlString, "/Books/Book", XmlOptions.Default);
            // Xml Path as a IXmlPathLoose
            Assert.Xml.Exists(xmlString, XmlPath.Element("Books").Element("Book"), XmlOptions.Default);
        }

For completeness let’s show a separate example where we will be looking for title attribute.

        [Test]
        public void TestXmlExistsForElement()
        {
            const string xmlString =
                "<Books>" +
                "  <Book title='C# in Depth' />" +
                "  <Book title='Learing C#' />" +
                "</Books>";

            // Xml Path as a string
            Assert.Xml.Exists(xmlString, "/Books/Book:title", XmlOptions.Default);
            // Xml Path as a IXmlPathLoose
            Assert.Xml.Exists(xmlString, XmlPath.Element("Books").Element("Book").Attribute("title"), XmlOptions.Default);
        }

In case an element or an attribute not found, Gallio will produce an error message similar to the one below:

Exists_error

Assert.Xml.IsUnique

This method takes the same parameters as Assert.Xml.ExistsAssert.Xml.IsUnique fails if an element is encountered more than once in Xml document.  I expect that you will not utilize this method as much as other two methods.

The following code is going to fail because we have two Book elements in out Xml.

        [Test]
        public void TestXmlIsUnique()
        {
            const string xmlString =
                "<Books>" +
                "  <Book title='C# in Depth' />" +
                "  <Book title='Learing C#' />" +
                "</Books>";

            // Xml Path as a string
            Assert.Xml.IsUnique(xmlString, "/Books/Book", XmlOptions.Default);
            // Xml Path as a IXmlPathLoose
            Assert.Xml.IsUnique(xmlString, XmlPath.Element("Books").Element("Book"), XmlOptions.Default);
        }

Here’s our error message:

IsUniqe_error

Last words.

I hope you find it useful and I didn’t waste mine and your time because my wife and kids never going get this hour back.

 Gallio wiki site is a great place to learn more about XML AssertionsGallio / MbUnit is an open source project and they always looking for new contributors.  If you consider joining the project, click here to learn how.

kick it on DotNetKicks.com

Posted in .Net, MbUnit | Tagged: , , | 3 Comments »

Assert.Count in MbUnit version 3.2

Posted by Vadim on July 18, 2010

The Gallio team is about to release version 3.2 of Gallio and MbUnit.  If you’re impatient and like to eat your cake hot before it cools down, then download the Release Candidate.  The new version has many new great features.  Click here to see the list of enhancements and here for the bug fixes.

One of the new features is Assert.Count.  It’s impossible to count how many times I wrote code that verifies number of items in the specified collection:

        [Test]
        public void Test()
        {
            var list = new List<int> {2, 3, 5};
            Assert.AreEqual(3, list.Count);
        }

Now with new 3.2 version I can write my code like this:

        [Test]
        public void TestCount()
        {
            var list = new List<int> { 2, 3, 5 };
            Assert.Count(3, list);
        }

I assume that for most people it doesn’t look like a huge improvement and it’s probably not, but it definitely makes code more readable and defines clear the intentions of the specific assertion.

I don’t expect to surprise anybody by telling you that it also works with arrays.

        [Test]
        public void TestArray()
        {
            Assert.Count(3, new[] { 1, 2, 3 });
        }

Actually it works with any object that implements IEnumerable interface even if doesn’t have Count or Length property like CredentialCache class.

        [Test]
        public void TestEnumerable()
        {
            var myCache = new CredentialCache
                         {
                             {
                                 new Uri("http://www.contoso.com/"),
                                 "Basic",
                                 new NetworkCredential("userName", "password")
                             },
                             {
                                 new Uri("http://www.contoso.com/"),
                                 "Digest",
                                 new NetworkCredential("userName", "password", "domain")
                             }
                         };
            Assert.Count(2, myCache);
        }

It even works with string types (of course it does, string also implements IEnumerable).

        [Test]
        public void TestString()
        {
            Assert.Count(5, "Vadim");
        }

kick it on DotNetKicks.com

Posted in .Net, MbUnit | Tagged: | 1 Comment »

How to display your assembly “Add References” dialog.

Posted by Vadim on July 11, 2010

In Ultimate Software (the company that I work for) we build all the assemblies in the same directory.  Let say it’s C:\Common.  When we need to reference an assembly, we browse to C:\Common directory and select a desired assembly.

I decided to look what we need to do to add our assemblies into .NET tab of “Add Reference” dialog box.  It’s quite simple actually.  All we need to do is to create a registry entry.

First lets assume that we want to reference AssemblyReference.dll that located in C:\Common directory.  It’s probably not going to surprise anybody if I tell you that you’ll not find it in “.NET” tab of Add Reference dialog.

.NetReference

As you can see it’s not there at the moment.  However, if we chose a “Browse” tab and navigate to C:\Common directory will be able to find it.

BrowseReference

I just want to point out that adding an assembly to GAC will not add that assembly to the .NET tab’s list.   It’s also not a good practice to install an assembly to the Global Assembly Cache, unless you want to share that assembly with other applications running on that computer. 

Therefore only thing we need to do add our assembly to .NET tab’s list is to create a unique sub-key under

HKLM\SOFTWARE\Microsoft\.NETFramework\.NETMinimumVersion\AssemblyFoldersEx\

If you’re running a 64-bit OS you will need to create it under:

HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\.NETMinimumVersion\AssemblyFoldersEx\

.NETMinimumVersion is the lowest .NET Framework version from which the assembly can be referenced.  In our example I chose version 2.0.50727 as you can see below.

After creating a new sub-key, we’ll change its default string value to the “C:\Common\” directory path.

RegistryReference

After restarting Visual Studio 2010, we can find our AssemblyReference assembly in .NET tab’s list of Add Reference dialog.

.NetAssemblyRef

In our example we added the sub-key under HKEY_LOCAL_MACHINE node that allows all the users on this system to see AssemblyReference.dll.  If we wanted only the current user to see this assembly, we would create our sub-key under HKEY_CURRENT_USER instead.

Note for VS 2008 and earlier:

For Visual Studio 2008 and earlier you need to add your sub-key under

HKLM\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\

kick it on DotNetKicks.com

Posted in .Net | 2 Comments »

AssemblyHelpers now works .NET 4 assemblies.

Posted by Vadim on May 9, 2010

assemblyhelper-thumb[1] More than two weeks ago I received an email from someone that AssemblyHelper tool doesn’t work with .NET 4 assemblies.

I first mentioned about the tool in Testing internals members with InternalsVisibleTo attribute article.

Here I just want to tell the tool is updated an you can use it against .NET 4 assemblies.  Of course, it still works with assemblies prior version 4.

Feel free to download the updated version.

kick it on DotNetKicks.com

Posted in .Net, TDD | Tagged: | 1 Comment »

Visual Studio 2010 RC is out.

Posted by Vadim on February 8, 2010

Finally VS 2010 RC is out.  It’s available to MSDN subscribers today, February 8th.  Everybody else will be able to download it on February 10th.

Posted in Visual Studio, VS2010 CTP | Tagged: | Leave a Comment »

Live Writer syntax highlighting plug-in for WordPress.

Posted by Vadim on February 8, 2010

About a year ago I wrote a small article how to use syntax highlighting in WordPress using Windows Live Writer.  Few months ago I discovered  Rich Hewlett’s plug-in for Windows Live Writer that works perfectly with WordPress blogs.  I’ve been using it since.

I’m very happy with this plug-in it works great, but it misses the WYSIWYG.  It would be nice to see the code exactly like it appears on the published page during creation of the post.  Also for XML you cannot see code at all.  But it looks great on the published page.

<note>
  <to>Rich</to>
  <from>Vadim</from>
  <subject>Thanks</subject>
  <body>Rich, Thanks for the great plug-in.</body>
</note>

Rich also recently published a new version of his plug-in.  You can download it directly from this link.

I believe that you must have this plug-in if you host your blog on wordpress and publish snippets of code.

Posted in Windows Live Writer | Tagged: , , | 1 Comment »

Part 2: Configuration – Learning Azure with me.

Posted by Vadim on January 31, 2010

In Part 1 “Hello Azure” we briefly talked about the Service Configuration file (ServiceConfiguration.cscfg).  In that article we didn’t modify this file, we just accepted all the values provided by Cloud Service Visual Studio template.

Let look at this file and take it apart.

<?xml version="1.0"?>
<ServiceConfiguration serviceName="LearnAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
  <Role name="LearnAzureWeb">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" value="UseDevelopmentStorage=true" />
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>

image The root element ServiceConfiguration has only one attribute which is serviceName.  The serviceName attribute is required. If you omit this attribute, Visual Studio is going to complain about your XML during compilation.  You can see that this attribute has the same value as our Cloud Project which is LearnAzure.  The name of the service must match the name of the service in the service definition.  If you look inside ServicDefinition.csdef file, you’ll see that value for the name attribute in ServiceDefinition element is also LeanAzure.

ServiceConfiguration element can have only Role elements as children.  Because the only role we have is ASP.NET Web role, LearnAzureWeb, we can see only one Role element.  In case our project contained another role the Service Configuration file would reflect this fact.

Role element also has a single name attribute which is required.  The name attribute represents the name of the service and must match the name of the service in the service definition defined in the WebRole element.  The Role element can have following children elements:

  • Instances
  • ConfigurationSettings
  • Certificates

Looking at our ServiceConfiguration.cscfg file we can see that it contains ConfigurationSettings and Instances elements.

Instances Element

Before we start discussing the Instances element, let me tell you what I know about Microsoft datacenters that host Windows Azure applications.  Microsoft has many strategically placed datacenters that have no physical roof.  Inside each datacenter a lot of sealed shipping containers.  Each containers has inside anywhere from 1,800 to 2,500 servers.  One of these datacenters is located in Chicago.

Now back to our Instances element that has a required count attribute that represents number of instances of your application.  In case our Learn Azure application becomes a hit, we will need more computing power to run it.  We’ll request more power by increasing count value in the Instance element.  Each instance will be run on different server and probably in different container.  And I’m going to guess that it has  a very good chance that each instance will be executed in different datacenter.

<Instances count="5" />

Instances element is required and you can have only one element in each Role.

If you are not friendly with XML, you can modify Instance count using GUI in Visual Studio.  In your Cloud Project right click on the Role and select Properties or just press Alt+Enter.

image

In Configuration tab you can find Instance count and enter the desirable value.

ConfigurationSettings Element

If you’ve developed any .NET application, than ConfigurationSettings element concept should be very familiar to you.  You used this technique many times in your web.config or app.config files.  It serves the same purpose as appSettings element in .config file.

You can have only one ConfigurationSettings section in your Service Configuration file.  This element is not required that means that you can completely omit this section if you don’t set any custom settings.  ConfigurationSettings element can have any number of Setting elements. A Setting element is a mapping of a name to a string value.  A setting name must be declared in a service definition file (ServiceDefinition.csdef).

For example, in our LearnAzure application we hard coded “Hello Azure!” text in the Default.aspx file (See Part1).  We can easily make the hard coded text configurable.

First thing we’ll do is to add our setting name “myText” to the Service Definition file.

<Setting name="myText"/>

Below is complete ServiceDefinition.csdef file.

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="LearnAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="LearnAzureWeb">
    <InputEndpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
    </InputEndpoints>
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" />
      <Setting name="myText"/>
    </ConfigurationSettings>
  </WebRole>
</ServiceDefinition>

Next we need to add the Setting element with a name and value into ConfigurationSettings section of our Service Configuration file.

<Setting name="myText" value="Hello Azure from the Configuration!" />

Here’s the copy of the complete ServiceConfiguration.cscfg file:

<?xml version="1.0"?>
<ServiceConfiguration serviceName="LearnAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
  <Role name="LearnAzureWeb">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" value="UseDevelopmentStorage=true" />
      <Setting name="myText" value="Hello Azure from the Configuration!" />
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>

You don’t have to manually modify custom settings.  Visual Studio provides us with GUI to add, remove, or modify our settings.  Select property on our Role and on the left chose the Settings tab.

image

We are done with configuration.  Now let use “myText” in our source code. In our Default.aspx file we need to replace

    <div>
    Hello Azure!
    </div

with

<div>
<asp:Label ID="mainTextLbl" runat="server" />
</div>

We just added a new Label control.

The only thing left is to read the value from the configuration file and assign it to our mainTextLbl Label control.  We’ll do it on page Load event in Default.aspx.cs file.

protected void Page_Load(object sender, EventArgs e)
{
    mainTextLbl.Text = RoleEnvironment.GetConfigurationSettingValue("myText");
}

Now we can compile and run our application on local computer.

image

Now you know how to set basic custom settings for an Azure application.

Certificates.

I believe that discussion of certificates deserves its own article.  I’ll try to talk about it in the future posts.

Why another XML configuration file?

You are probably wondering why do we need another XML configuration file (in this case ServiceConfiguration.cscfg).  We can perfectly set the setting in my Web.config or app.config files.   That’s true but then you’ll have to repackage and redeploy the whole application again.

You can modify ServiceConfiguration.cscfg file from your Azure portal and no redeployment will be required.

To change configuration just login to your Windows Azure portal, select the service and click on Configure button.

image

From Service Tuning page you can modify the existing Service Configuration file or upload a new one.

image

Summary

Now we have basic knowledge how to configure our Azure application.  We learn about Instances and custom settings.  In future article we’ll learn about certificates.

kick it on DotNetKicks.com

Posted in Azure | Tagged: | Leave a Comment »

Invisible Task Manager menu bar and tabs.

Posted by Vadim on January 20, 2010

image Today I was pair programming with one of my co-workers, and during the session he somehow made Task Manager tile,  menu bar, tabs, and status bar disappear.  At first, we had no clue how it happened and were forced to use Alt+F4 to close Windows Task Manager because close (x) button was gone with the title bar.  However, in a little while he did it again.  He was double clicking on the empty space in the top border.

You can try it yourself.  Just start Windows Task Manager and double click anywhere in the empty space in the top border.  Double click again to get the menu and tabs back.   If you are not sure where the top border is, just double click in the same place the cursor is located on the image that you see on the right.

If you know of other weird behaviors in Windows, please let me know.

Posted in Tips And Tricks | Tagged: , | 3 Comments »

Part 1: Hello Azure – Learn Azure with me.

Posted by Vadim on January 19, 2010

Windows_Azure_logo[1] I want to learn Windows Azure.  I already have done some reading on the subject and created some simple Windows Azure applications.  However, I believe that writing articles about Cloud Services will help me to get stronger understanding of the platform.

I will not tell you what Windows Azure is.  I hope that you’re reading this because you know what it is and ready to learn it.  I also hope that you already downloaded and installed Windows Azure Platform on your computer.  If you haven’t done it, you can download it from Microsoft Windows Azure site.

My goal for this article:

  1. Create LearnAzure Cloud Service that displays “Hello Azure!” message.
  2. Set up your service online.
  3. Deploy the application to Azure Fabric.

Create LearnAzure Cloud Service.

Start Visual Studio.  I’m going to use VS 2010 Beta 2 but it should work just fine with VS 2008.

Press Ctrl+Shift+N to create a new project.  You also can select File –> New –> Project… from Visual Studio menu.  You should see New Project dialog.

From Installed Templates select Cloud Service (if you don’t see Cloud Service template, than you need to install Windows Azure SDK).   For the project name I typed “LearnAzure”.image

Click on the OK button and you will see a New Cloud Service Project dialog box.  In this dialog box, from the Roles, select ASP.NET Web Role because we want to create an ASP.NET Windows Azure application.  Click on the right arrow to make ASP.NET Web Role appear in Cloud Service Solution list.  By default Visual Studio will give “WebRole1” to your ASP.NET Web Role.  This name is too generic; let’s rename it to “LearnAzureWeb”.  To rename, move your mouse over WebRole1 and click on the little pencil icon on the right of the role.  Now you can rename it to LearnAzureWeb.image 

image After Visual Studio is done, you should have LearnAzure solution that has two projects: LearnAzure and LearnAzureWeb. LearnAzureWeb looks almost like any other ASP.NET application but there few differences.

If you expend References in our ASP.NET Web projects, you’ll see three additional references to Windows Azure assemblies:

  • Microsoft.WindowsAzure.Diagnostics
  • Microsoft.WindowsAzure.ServiceRuntime
  • Microsoft.WindowsAzure.StorageClient

Use Diagnostics namespace for your logging needs.
Use ServiceRuntime namespace when you need to interact with Windows Azure fabric.
Use StorageClient namespace when you need to work with storage services.

These assemblies are located in Program Files\Windows Azure SDK\v1.0\ref folder.

I know that right now this is not enough information for you to understand exactly what these names are for, and how to use them.  But remember, this is just a “Hello Azure!” article.  We’ll have plenty of time to discuss more advance subjects in the future posts.

You also can see WebRole.cs file in your LearnAzureWeb project.  WebRole class provides callbacks to initialize, run, and stop instances of our ASP.NET role.

We have a working Azure application without writing a single line of code.  However, if we start the application by pressing Ctrl+F5 or F5 in case you wanto to start it with debugger, you will see an empty web page.

image In your system tray you can find a new blue window flag icon.  It tells you that Windows Azure simulation environment is running.  It also means that  the Development Fabric and the Development Storage services were started.  You can right click on this icon to see User Interfaces either for the Development Fabric or Development Storage services.  You also can

shutdown any of these services using this icon.

We are done but I hate to look at an empty web page; therefore, I’m going to add “Hello Azure!” to the body of Default.aspx page.

<body>
    <form id="form1" runat="server">
    <div>
    Hello Azure!
    </div>
    </form>
</body>

Here’s the output of our brand new Windows Azure application:

image

Setup your service online.

Now we know how to run our Hello Azure Cloud Service on Simulation Environment.  Next we need to setup the service online.  I assume that you already went to Microsoft Windows Azure site and have an Azure account setup.

In order to deploy our Hello Azure app. you need to log into your Azure portal with the Live ID you registered with.  Below you can see my  Windows Azure page.  I have only one project: PDC08 CTP.

image Next click on the project name. In my case I’m going to click on “PDC08 CTP” as it’s my project name.  You should see the project page.  On this page you can create a new hosted services and storage account.  On my page you can see that a storage account “diagnosticsdata” that I created earlier.

image

I don’t have any hosted services yet. You and I are going to create “Learn Azure” hosted service.  To create a new service, just click on New Service link; you have two these links on this page.  One just above the left navigation bar and another on the right of the project name.  You should see Create an new service page, similar to the image below.

image On this page, we can create either a Storage Account or Hosted Service.  We already decided that we want to create “Learn Azure” hosted service.  Let’s click on Hosted Services link.  You should see Create a Service page.  Provide a service label and description for the service and then click the Next button.

image You should go to the second part of Create a Service.  On this page you need to enter a Public Service Name and choose an Affinity Group.  The Public Service Name must be unique.  I wanted to enter “LearnAzure” but it’s not available; therefore, I chose “LearnAzureWithMe”.  The Public Service Name you’ll choose will be the first part of the URL for your service.  Because it’s part of a URL, it must be unique and cannot have white spaces.  Unfortunately, you have to come up with a different name because “LearnAzureWithMe” belongs to me now.  You can click on the “Check Availability” button to see if the name you selected is still available.

The second part of the form is related to Hosted Service Affinity Group.  Microsoft has many different datacenters around the world.  You want to select a region that the best represents your audience / customers to get better performance.  Also if you have services that are related you might want to deploy them to different datacenters for disaster recovery or geo-distribution purposes.

image Press the Create button to create your hosted service.

Deploy the application to Azure Fabric.

Finally we have a cloud space where to deploy our “Hello Azure!” application.  But before we do so, we need to create the Service Package (.cspkg).  We could use CSPack.exe utility that you can find in Azure SDK folder but it’s much easier to create the Service Package from Visual Studio by right clicking on LearnAzure Cloud Service project and select “Publish”.

image

Visual Studio executes CSPack.exe to create the Service Package. After all is done, you should see the folder containing the Service Package (LearnAzure.cspkg) and Service Configuration file (ServiceConfiguration.cscfg).  .cspkg is a glorified zip file, you should be able to open it with any zip utility if you want to see what inside the package.

image The next step is to deploy the Service Package and Service Configuration file.  You can deploy directly to production, but I would recommend that you deploy to staging environment first.  In order to deploy the application you need to go back to your Azure Portal.  If you don’t see a staging ice cube next to the production one, click on the little arrow that is right of production cube.

image Click on Deploy button under the staging ice cube.  On the next screen, browse for your Service Package and Service Configuration file.  You also will need to give a label for this deployment, my label is “v. 0.1”.

image Click on Deploy button in order to deploy “Hello Azure!” application to Staging environment.  The deployment process can take couple of minutes.  After all is done the gray cube should magically transform to nice ice blue cube.  Your Azure application is deploy but to test it, you need to click on Run button under Staging cube.  You will see that the status flipped to “Initializing”.  It might take few minutes for the status to change to “Ready”.  You can test your application by navigating to your staging Web Site URL.

Next logical step after you tested our application on staging is to promote it to production.  It’s very easy done by clicking on a circle with two arrows inside.  If you need more clues to find the circle, it’s between Production and Staging cubes.  You don’t actually move the application to different place.  After you click on the circle, Windows Azure just flips production and staging environments.  The old staging environment becomes our new production one and vice versa.

image It takes only few moments to promote from staging to production because Windows Azure makes only small configuration change.

Now I can point my browser to http://learnazurewithme.cloudapp.net/ to use my perfectly useless application.

image

Summary

In this article, we learned how to create a simple Azure application.  We also talked about new files and references that need to be added in order to run our app. in the cloud.  Now you can tell all of your friends how to setup and deploy the Windows Azure application.

Next, we’re going to learn how to use Azure Service Configuration.

kick it on DotNetKicks.com

Posted in Azure, Tutorial | Tagged: | 4 Comments »

Cropper free alternative to Snagit.

Posted by Vadim on January 12, 2010

FileDownload[1] If you read my posts, you know that my writing skills can be improved by a lot.  Therefore, I tried to put a lot of pictures in my posts to compensate my English.  Until recently I was using Snagit application from TechSmith to capture my screens snapshots.  Snagit is a very good application and I wish I still had it today. However, I had 128 days inactivity of posting.  During this time I upgraded my computer to Windows 7.   couldn’t find my old license of Snagit to install it on new system.  Even Snagit is not that expensive, just $49.95, I looked for free alternative.  I found it on CodePlex, it’s Cropper by Brian Scott.

Cropper is not as powerful as Snagit but it allows me very fast to get a screen capture an paste it to my post. You also can find a collection of plugins for Cropper on CodePlex.  One feature I miss from Cropper is an ability to annotate the image I just captured. 

May be I should stop wishing and get my hands dirty and contribute to Cropper or Cropper Plugins open source projects.

Posted in .Net | Tagged: | 3 Comments »