Friday, June 14, 2013

WPF Data Binding to physical objects (updated)
Listen

I had some spare time tonight, so I thought I'd have a go at controlling a small servo I had lying around using an Arduino Uno. That was pretty easy (it is explained on the Arduino website over here), so I decided to take it a step further. What about writing a .NET application that can control the servo? Right, Windows Forms? Nah... boring... WPF! And to make the code nice and shiny, let's use data binding.

Here is a picture:

And a video!

What does this take?

  • A little bit of code on the Arduino that listens for commands to change the servo position on the serial interface.

  • A .NET class that represents the physical servo, which has a "Position" property (to which we can data bind) and which sends out a command on the serial port when the position changes.

The Arduino sketch: The servo class in C#:

Let's now use this class to data bind the position of a slider control to the position of the physical servo:

The XAML:

Side note: for some reason my little servo does not like to go below 30 degrees, that is why the minimum of my slider is 30, you might want to set that to 0.

The C# code:

Of course there are a million other ways to do this and there is a lot of room for improvement, but I find it quite remarkable that it can be done in such an elegant way and with so little code.


Update 14/06: After posting this yesterday, fellow MSP Fran├žois Remy remarked that it would be nice if it worked both ways. If there is logic running on the Arduino that decides to change the position of the servo, then the data bound slider should update as well. He was of course absolutely right! I have updated the code to add this functionality. The Arduino now sweeps the servo from left to right continuously and sends the position to the pc over serial. When the pc sends a position over serial to the Arduino, this overrides the sweep for 1.5 seconds. In other words, the Arduino listens to the pc, until it hasn't received a new position for 1.5 seconds, then it continues the sweep.

Here is a video:

The code for the Arduino: And the C# Servo class:

As you can see, I have implemented INotifyPropertyChanged (refer to this) and used async/await instead of having to deal with threads (refer to this). Although this adds some complexity, the Servo class is still fairly straightforward.

Also worth noting: the Arduino resets the ATMega when a serial connection is opened. This is useful when using the Arduino software to program it (a reset causes the bootloader to run), but kind of annoying when writing an application that uses serial communication. I have disabled the auto-reset by cutting the trace between the pads labeled RESET-EN on the PCB using a Stanley knife. If you prefer a less destructive method: refer to this forum thread.

Sunday, February 3, 2013

Recap: "An introduction to Windows Azure"
Listen

In December I did a presentation titled "An introduction to Windows Azure" for some Microsoft Student Partners in Brussels. A lot of MSPs could not attend and my not-so-well-rehearsed presentation was a bit chaotic, so I have decided to publish most of it in the form of a blog post. It has been a while, I have been quite busy (exams, thesis, work...), so sorry for the delay in posting this.

The Azure poster displayed above is a nice overview of what Azure has to offer (you can find a full size version over here). I have marked what I will discuss in this blog post with green rectangles: cloud services (a web role and a worker role, with a queue between them) and blob storage. This blog post is by no means meant to be a comprehensive overview of what these services have to offer, but rather a fun example of a common use case. By the way, if anyone knows where to get a printed version of that poster, I want one!

So, what could we make with Azure Cloud Services? Well, a cloud service can contain web roles and worker roles. What a web role can do is rather obvious: it serves a website. A worker role is basically an application running on a virtual server in the cloud. It can communicate with external services and/or end users (you can define endpoints: ports that will be available to your application), but it does not have to. A worker role could be a WebSocket server, an image processing server (for example to create thumbnails), a video trans-coding service... A web role is basically a worker role with IIS pre-installed and an endpoint for TCP port 80. If for some reason you prefer to use Apache instead of IIS, you could do so using a worker role.

Azure Cloud Services are pretty open: you can use the technology of your choice to write applications. On the Azure website (pictured above) you can find pretty good documentation for .net, node.js, java, php and python. All APIs are RESTful, so using another language or technology should not be a problem either. In this post I will only discuss .net technologies. Of course, the integration of Azure with .net and Visual Studio is pretty good.

Okay, so let's build a fun application. In this example we will build a web app that generates images like this one. A picture is shown on a black background in white frame with two sentences underneath it (let us call them "title" and "description" for clarity).

Let's call our application "Memeify".


This is our cloud architecture. We will need a website where users can upload an image and enter the text they want to add to it. We use a web role to serve this website. After a user has uploaded an image we need to make the composition with the black background and the text and then return the finished image to the user. Generating this composition and saving it to an image file may take a couple of seconds, so we probably should not be doing this on our web server. We will create a worker role that does the image generation out of band.

It is perfectly possible to have direct communication between a web role and a worker role, however this kind of tight coupling is probably not the best way to go in our use case. It is easy to imagine that when our website gets popular, we may want to have multiple instances of the worker role processing multiple images at the same time. It would be great if we could have some kind of scalable queue somewhere in the cloud, wouldn't it? The web role could then put tasks on the queue and the worker role could monitor the queue and complete the tasks. This kind of loose coupling is very common in cloud applications.

Azure offers two queuing mechanisms: Storage Queues and Service Bus Queues. For a comprehensive comparison between the two I refer to this msdn page. Besides the technical comparison it is also a good idea to take a look at the pricing differences between the two systems, depending on the intended/predicted load (use the online pricing calculator).

We will use Service Bus Queues, but it would be trivial to do the same with Storage Queues.

Let's get started! We will use Visual Studio 2012, with all the right tools installed. I would advise you to use the Web Platform Installer to find and install the latest Azure tools and SDKs. We will also be using ASP.NET MVC 4 to build the website, you will find that in WPI as well.

I always like to start with a Blank solution and then add projects to that empty solution. (File » New » Project...)

The first project we add to this solution is a an MVC web application. (Right click on solution name in the Solution Explorer » Add » New Project...). We could call this project "Memeify.Web".

As this is about Azure, I won't go into to much details about ASP.NET MVC 4 (watch this or start here). I'll start with a basic ASP.NET MVC 4 project and will not bother with unit tests (but you should!). I will use the Razor view engine, because it is awesome.

At this point we can add an Azure project to the solution. This is nothing more than some configuration files that define a cloud service. We could call this project "Memeify.Azure".

We then add the existing web project as a web role to the cloud service.

By right clicking the role we can get to its settings. These settings are stored in XML files (with a .cscfg extension) in the project which, alternatively, we can edit manually as well.

Pro tip: while experimenting and testing or even deploying to a limited number of users, set the VM size to "Extra small". Extra small instances are charged at 1/6th of the rate of a small instance. See this page for more information.

Let's now do some work on the website.

We will need a model to represent a meme. Models/MemeModel.cs Let's keep it simple: a POCO that has properties for the image, the title and the description. The image is a file and title and description are strings.

We also create a view. Views/Home/Index.cshtml This is an extremely simple HTML form that has three fields (a file upload and two textboxes) and a submit button. We use the HTML helper provided by the web framework to link this form to our model at the server side. One thing that is easy to forget is to set the encoding to "multipart/form-data", in order to support file upload.

Next, we will need a controller. Controllers/HomeController.cs On a GET, we simply want to show the form, so we return the view. When the form is POSTed, we need to create the image and somehow return it to the user.

At this point we could just write some code to create the image right in this action of the controller (the line in the above marked with a TODO comment, line 11). However, we do not want our web server(s) to handle this work. Instead, in the controller we need to do two things: (1) store the image in blob storage so that the worker role can access it and (2) put a task on a queue to let the worker role know that there is an image waiting to be processed (or "memeified" in our example).

The Azure documentation provides very clear step-by-step instructions on how to use all these services. Here is the how-to on using blob storage in .net. Because this documentation is very good, I will skip ahead to the code here. In summary, what you have to do is create a blob storage account using the online portal and add the "connection string" to the settings of the role.

We should first validate that the form input is correct (e.g. all required fields are there, the text is not to long, the image is of a valid type and not to big...). Again, because this is a post about Azure and not about ASP, I will skip that part and assume the input is valid. If you need some help adding validation: this is a good read.

In a blob storage account you can have several containers (directories) and these containers contain the blobs (files). There is no real hierarchy like the file organisation on your computer, but blob names can contain the slash sign, so you can emulate directories within containers. We connect to a blob storage account and get a container named "Images".

We can create this container first using the online portal or using a third party tool (e.g. CloudXplorer) or create it in code as demonstrated below. We should also set the permissions: blob containers can either be private or public. A private container would be fine here (as only our own worker role needs access), but the code below demonstrates how to make the container public. In our example, this would for example be useful to show the uploaded picture in the web interface.

Next, we will need to give the image a unique name and upload it to the container. Let's just take a random GUID and add a timestamp. The chance of a name like that not being unique is remote, but you should probably still check! Checking whether a file already exists in blob storage is not that simple in the .net implementation, but Steve Marx has written a nice extension method.

And then we can upload the blob.

Once the image is in blob storage, the only thing that is left to do in the web role is to add the task to a queue. Queues work in a very similar way: we first create a storage account (storage queues) or a namespace (service bus queues) in the online portal, we then add the connection string to the settings of the role and use the .net implementation of the REST API to access the queue. In the following we will use service bus queues.

On to the worker role! Let's add the project and call it "Memeify.ImageServer".

This project contains a template called "WorkerRole.cs", this file has a method "OnStart", this is were we will put our code.

We start a new thread that runs an infinite loop that pulls messages (tasks) from the queue and calls a method "CreateMeme" when a new task has been pulled from the queue. In the case of service bus queues the "Receive" call is blocking: it does not return immediately if the queue is empty, so there is no need to add some sleep at the end of an iteration. This is an important difference between service bus queues and storage queues!

The CreateMeme method pulls the image from blob storage, adds the background, frame and text using GDI and saves the result back to blob storage. The bulk of it has little to do with Azure, so here is the code without further ado.

One thing that I am not addressing here is how to get the result back to the user after the worker role is done with it. We could for example use websockets or a library like SignalR to notify the web page. We could also let the worker role send the user an email with a link to the generated image. It all depends on the use case. For the purpose of this demo, lets just say that the worker role saves the result to blob storage and prepends "result-" to the name (see the code above). We can then show the user a page with an image tag that points to this URL in blob storage (http://{storageaccountname}.blob.core.windows.net/{containername}/{result-blobname}) and tell them to wait a bit and refresh the page. Not very nice, but good enough for now. One can easily see that designing a good, loosely coupled, cloud architecture requires some thought.

I am making the source available on GitHub, so you can easily browse it and fork it to share your own changes. Please note that I have removed connection strings to my accounts, so you will have to dive into the settings to enter your own information to make it work. Also, in the view "Home/Show.cshtml" you will have to change the URL to point to your own storage account. No go play with it and make some great stuff!

Monday, October 8, 2012

TypeScript Bundle Transform for ASP.NET
Listen

Last week, Microsoft announced TypeScript, a superset of Javascript that adds strong typing, interfaces, classes, modules and lambda expressions. If you have not heard of it, their website has a tutorial and playground. If you have some more time, there is a very good video overview by Anders Hejlsberg on Channel 9 (embedded below).



The response to this new language seems to be mixed. I largely agree with the opinions expressed in this article: Thoughts on typescript.

An interested fact about the open source TypeScript compiler is that it is written in TypeScript. This compiler translates TypeScript to plain Javascript.

When I first read about TypeScript (yesterday), I immediately started looking for an IBundleTransform implementation that runs the TypeScript compiler. I did not find any implementations, so I decided to write one myself and put it on GitHub and NuGet.

The only available compiler is written in TypeScript itself (so you can compile it to Javascript) and I did not quite have the time to translate the entire compiler to C#, so I needed a way to execute Javascript in C#. I know I could have used Microsoft's Chakra Javascript engine, but that would have introduced a dependency on having Internet Explorer installed on your server. I ended up using Google's V8 Javascript engine, which I could bundle with the project.

Enjoy!

Tuesday, September 25, 2012

Third place at AppsForFlanders hackathon
Listen



Last week, I went to the AppForFlanders hackathon with some friends. At this event, students were invited to build apps with government data.

More info about the event:
Alexander, Tom, Nicolas and I have build a little online game (or rather quiz) about biodiversity. We called it "berenleren!", which is Dutch and could be translated as "bear teaching". I take no responsibility for this name whatsoever (Miet takes the blame).

Berenleren combines biodiversity data with images and descriptions from Wikipedia and book titles from boek.be.

The application, built in a couple of hours, is buggy at best (and ugly at worst), but available at http://berenleren.apphb.com/ (it is written fully in HTML/JS/CSS, so feel free to grab the source).

And oh, forgot to mention: it got us a third place (500 euros and a ticket for iMinds), which is nice.

Some more pictures:


Brainstorming


Designing


Coding


The jury


The presentation

No animals were harmed in the making of this software.

Saturday, April 28, 2012

A week of student entrepreneurship events in Ghent
Listen

I am a bit late to blog about this, sorry for that!

Last week I was invited to two events for student entrepreneurs. Not that I would call myself an entrepreneur, but apparently I match some people's definition of the phrase.

On Monday I attended Student Ghentrepreneur, an event that was collectively organised by Ghent University and two university colleges. The event took place on the top floor of the Artevelde Hogeschool building (Campus Kantienberg, for the locals). They have a view on Ghent that makes me jealous! After all the presentations and activities, there was a reception where about 40 students had a poster showing off their "company". I had this poster about vikingapps.be, which is off course ridiculous, but I could hardly refuse a one meter high poster, now could I? Anyway, while I did have some interesting conversations, my general feeling about the event is that the three institutes are trying way to hard push their respective student entrepreneurship programs forward. I understand that they like to brag with numbers about how many entrepreneurs they already have after the first year of the program (about 60, they said), but lets be honest: if they even count vikingapps as a company, it is easy to come up with figures like that. Next time, let's focus on the few real companies led by students that are doing really well, alright? I ended up leaving the event a bit disgusted by all the (false?) hyper-optimism of all those students who think they are going to change the world.


More info: http://studentghentrepreneur.be

On Tuesday night, I was invited to speak at another event about student entrepreneurship, organised by the Ceneka student club. My introduction was quite surprising. The professor who was introducing the speakers showed an e-mail, once send to me by a professor, stating that said professor would not let me move some lab sessions to attend a conference (which he compared to a skiing holiday). Apparently his suggestions in that mail have later played a role in the creation of the student entrepreneurship program at our university. The professor continued to show a screenshot of yelper in an online newspaper and part of my resume. After this EPIC introduction I did a ten minute presentation, slides included below. Other speakers at this event included Frank Bekkers, the CEO of Mobile Vikings. His talk was inspiring! I had some interesting conversations at the reception afterwards as well. I left this event with a good feeling.


More info: http://student.ugent.be/ceneka/?q=node/148
Pictures: http://www.flickr.com/photos/ceneka/sets/72157629855620783/

Friday, February 17, 2012

Presentation at Students to Business Day 2012
Listen

My presentation at the Students to Business day 2012 in Braine-l'Alleud, Belgium.

Keywords: RIA development, client, HTML5, Javascript, CSS, jQuery, jQuery UI, jQuery mobile, Twitter Bootstrap, KnockoutJS, SignalR.

Thursday, February 9, 2012

My review of the Nokia Lumia 800
Listen

Click here to get a PDF version of this review.

A couple of weeks ago, Nokia has given me a Lumia 800 device to try. The only condition was that I had to share some feedback. So here it goes…

The Lumia 800 is Nokia’s new flagship smartphone running Windows Phone 7 Mango. It has been almost a year since Microsoft and Nokia announced their partnership. Nokia still is the largest manufacturer of mobile phones, but their smartphone department was not doing well. The Lumia 800 has been available for a couple of months in several countries and seems to be doing quite good so far. In Belgium it is available since February 1st for 499 euro.

Reviewing this device was not an easy task. I have done my very best to do it as good and as complete as possible. Should you buy it? Is Windows Phone mature enough? Does it work properly? Read on to find out what my opinion is.

Disclaimer: I am writing this as an independent consumer, gadget-enthusiast and app developer, not a Microsoft or Nokia poster boy. Some of my thoughts about this device might surprise you.


Hardware

The hardware of this device is very similar to the N9, so similar that usually it would be unacceptable for any manufacturer to copy itself like that. However, the N9 was born dead, the OS will not be developed any further. It is a very good thing that the innovative design and body of the N9 live on in the Lumia. The looks of the Lumia 800 are nothing short of stunning. One could argue that it is the most beautiful phone ever. It is definitely the prettiest Windows Phone available today. It is available in black, cyan and magenta (white will be available soon). The front is curved Gorilla glass with a capacitive touchscreen and three buttons: back, home and search (as required by Microsoft).

The body is crafted out of a single piece of polycarbonate by using the same techniques that others use to carve blocks of aluminum. It is curved on the sides and slightly tapered at the top and bottom. It is pleasant to hold and the ergonomics are great, the weight and size are just about perfect. It feels solid, but is transparent to radio waves, which greatly improves reception. I absolutely love it, it is so different from just about any other phone I have ever tried. It is pleasant and warm, not cold and impersonal like most other handhelds.

Screen and buttons

The 3,7 inch AMOLED screen has Nokia’s ClearBlack technology, which is big plus, it makes the dark colors really dark by being less reflective. The ClearBlack technology really shows when watching a very widescreen movie with black bands, you don’t even notice the bands, you simply cannot see where the screen stops. The screen has 800x480 pixels (WVGA) and because it is AMOLED, the colors are very rich. One beef I have with the display is that the whites are, well…, not very white.

The three buttons under the screen are capacitive and while that is really pretty, I still prefer a real buttons, I keep pushing these accidentally. The backlight of these button acts a bit weird: while watching a movie in the dark it was on at full power (annoyingly) and when you switch of the automatic brightness adjusting of the screen, the backlight of the buttons is disabled when selecting medium or high for the backlight of the screen. According to Nokia Belgium, this is intended behavior, although I still don’t see why anyone would want that.

On the right, it has some buttons: a volume rocker, a power/sleep button and a dedicated camera button. Sadly, there are a few problems with these buttons. The power button is placed terribly, right under the volume rocker. I often lock the device when trying to lower the volume, very annoying. The camera button on my device sits a bit loose, when shaking the device you hear the button make a ticking sound. I have read reports of other people having this issue with the power button. Also, the camera button doesn’t feel as good as it should. You can press it half way down to focus, but that stop half-way down is a bit too soft and easy to miss.

Audio



On the top you’ll find a standard 3,5 mm audio jack, a USB port (under a stupid hatch) and a Micro-SIM slot. That is right, the Lumia 800 is one of only three devices that uses Micro-SIM. The iPhone 4 and the Nokia N9 are the other two. It shouldn’t be too hard or expensive to get a Micro-SIM card (the Belgian provider Mobile Vikings charged me 5 euros), but this may cause some inconvenience. The holder for the SIM card is made of aluminum and should be solid enough. The hatch is a bit wiggly, but should be fairly strong as well.

Edited 9 feb 2012: A reader pointed out that the Nokia Lumia 710 uses Micro-SIM as well. I stand corrected.

The audio quality is terrible. I know that that is putting it quite strongly and that it contradicts some other very good reviews, so let’s be clear about it: the audio quality in phone calls is good and the speaker on the bottom is about as good as a tiny build-in speaker gets. However, if you plug in some good quality headphones, the first thing you hear is noise. If you like music and you would like to use your phone as music player, that is a real deal breaker. I have compared the noise levels for the same audio files and for some YouTube clips on an iPod, an iPad, a Samsung pre-production Windows Phone 7 device, an LG E900 and the Lumia 800. I have no remarks about the audio quality of the Apple device (although I have a lot of other remarks about them, but I will save that for some other time). Sadly, of the three Windows Phones I have tested, only the Samsung delivers the same audio quality, and the Samsung is the only one that you can’t actually buy. I always considered the LG just a cheap device, with pieces falling off after a year of use, so the disappointing audio quality was to be expected. I had much higher hopes for the Lumia, being almost twice as expensive and definitely having been designed with a lot of attention to detail. Today I am still carrying two devices: an iPod for music and the Lumia. That is quite sad indeed.

Camera

On the back: an 8 megapixels camera with a wide-angle Carl Zeiss lens that can do 720p video and dual LED flash, which is very, very bright. A front facing camera would have been nice, especially with Skype coming soon to Windows Phone, but I don’t consider the lack of it that much of an issue. Video calls on a mobile phone still are not very commonplace anyway. The quality of the rear camera is alright: the colors are good, the flash is bright but it adjusts well to the lighting of the scene and the autofocus is speedy (considering it is a phone and not a DSLR, of course). I have made some test shots (most are taken inside, sorry for that):



A problem I have with the camera is a reddish mist in the middle of pictures. It really shows when taking a picture of a white sheet of paper. I don’t know if this problem is isolated to my device and whether it is a hardware or software issue, but it is unfortunate.

And yes, I already had this issue before putting the device on a red background for the photos.

The camera can also do 720p video. Like the stills, the colors are good, but the video suffers some motion blur. Also, these days a lot of competing devices are offering full HD (1080p) video. Still, I think the camera is sufficient for what I think is its most important task: taking a quick picture of a funny or memorable situation and sharing it instantly.

Inside

Inside this slab of plastic and glass are locked some good components, although nothing spectacular. The Qualcomm processor runs at 1,4 GHz and has 512 megabytes of memory to work with. You get 16 GB of flash to store your apps, videos, music, email… If that does not cut it, you are out of luck, no other options are available and like most Windows Phone, there is no slot for an SD card. All expected sensors are present: an accelerometer, a gyroscope, a GPS (which is pretty good, but more about that later), a compass, proximity sensor, light sensor and an FM radio. The expected 3G, WiFi and Bluetooth are available as well. Also locked inside is the battery, which is not user replaceable, sadly. There has been some buzz about the battery running out to fast and Nokia has pushed out some updates to address this issue. I had no problems though, the battery drains just as fast as on any other smartphone I have: very fast. My golden rule of thumb is that it has to make the end of a long busy day and the Lumia does that.

Durability

The Lumia 800 is fairly durable as well. The Gorilla glass should be quite scratch resistant, although, to be honest: I have already found a tiny scratch on mine (after two weeks of use) and I am really careful with it. The polycarbonate is scratch resistant as well and the mate finish makes a big difference one you manage to get it scratched anyway. The only part that is a real scratch magnet is the little silvery, shiny piece of plastic around the camera. That makes me weep deep inside.

Accessories

In the box you will also find a very cute USB charger, a USB cable, headphones (which, frankly, I haven’t even tested) and a silicone cover, matching the color of your phone. Whether you like silicone covers or not, it is nice to have one included that perfectly fits your phone.
In general, the hardware is pretty standard these days, but the design is simply stunning and the build quality is excellent.

Software

Windows Phone 7

Windows Phone is a young operating system that has to compete with some pretty good software like Android and iOS. In some ways it still lags a bit behind, but it has some pretty cool and innovative features as well. Let me walk you through some of my favorites.



After hitting the power/sleep button on a Windows Phone you get to the lock screen, with a background photo of your choice. This screen shows time and date, the next item in you agenda and the number of items (calls, messages and emails). Unlocking is done by sliding this screen up.

After unlocking, you land on a screen that shows your favorite apps. You can pin apps to this screen and arrange them to your personal preference. The color of these so-called “tiles” can be changed, this accent color is used all over the OS and even in third party apps. The background is either black or white, but black works best on the ClearBlack display of the Lumia. Except for apps, you can also pin contacts, groups of contacts (“friends”, “family”…), pictures and so on to the start screen. Some of these tiles are “live tiles”, tiles that show useful content instead of just an icon. The phone tile displays the number of missed calls, the contacts tile shows some pictures of you contacts (this tile constantly changes), the Facebook tile shows the number of unread notifications, … There even is a tile about you: the “me” tile switches between your profile picture and the latest notifications on your social networks. Developers can enhance their apps by making the tiles more dynamic. In the screenshot above you can see my Mobile Vikings app showing my account balance and Niels’ UGent Resto app, showing todays menu in the university restaurants.

Swiping to the right brings you to the full list of installed apps, where you can also pin them by pressing and holding for a couple of seconds (this is the equivalent of a right click on Windows).



The build-in messages app is very interesting. It combines text messages with Facebook chat and Live Messenger. You can, for example, start a conversation on Facebook and continue via text messages. There is a button at the bottom of each conversation that allows you to switch.



To be able to chat on Facebook and Messenger, you have to add those accounts to you phone. You can also add Twitter and LinkedIn (and email accounts: Google works fine for contacts, calendar and mail, so does Exchange), but they don’t support chat. The contacts app tries to link the accounts people have all these networks and combines their information. If it was not able to do that (e.g. because differences in their name), you can link them manually.



The email app overrides the background color with white. It supports threaded conversations and does a good job in general, as you would expect from any smartphone. The calendar app combines calendars from all your accounts, including Facebook events and birthdays. The Office hub lets you open and edit Word and Excel files, open PowerPoint presentation (including the animations!) and to take notes that get synched to the cloud using OneNote. Good stuff!



The sharing feature allows you to share pictures on social networks or via mail really quick. This is also one of the menus that developers can extend, as WhatsApp has done in the screenshot. Microsoft is also active in the gaming business and the Windows Phone does a good job connecting you to your Xbox LIVE account. You can tweak your avatar, send messages to friends, compare achievements, … The little guy on the screenshot –my Xbox avatar– is actually a moving 3D model that you can interact with, he even starts dancing if you are listening to some music. To put music and video on your phone, you use the Zune application, which is very good. One of the features of Zune that I particularly like is that you can simply drag a video to your phone and it will automatically convert and resize it. That may not seem to be a big deal, but I also own an iPad and getting videos on that device is actually rather tricky (except if you buy them from Apple, of course).

This is all I wanted to share about the Windows Phone 7.5 (a.k.a. Mango) operating system, but of course there is a lot more to tell about it. The Verge has a well-balanced and more elaborate review of Mango.

Nokia apps

Nokia has made some little tweaks to the OS, they have added some ringtones and the Nokia blue color, nothing very shocking. Let’s hope that because of the partnership between both companies, someday, some of the user interface of the N9 makes into Windows Phone.



They have added some extremely nice apps though. Bluetooth contacts transfer allows you to transfer contact from your previous phone over Bluetooth. Handy! Nokia Music sells music.

Nokia Maps is like Google and Bing maps, but from Nokia. It is a good app, but nothing shocking. Nokia Drive, on the other hand, is a really adding value. A lot of it. Navigation with a 3D map, spoken instructions and downloadable maps and voices that works properly and doesn’t cost a fortune (still looking at you, TomTom for the iPhone), perfect! I have tested it next to a TomTom and it works well. The GPS receiver is very good, I have very good reception, even inside. This can mostly be attributed to the polycarbonate body, which is very transparent to radio waves, unlike aluminum or steel. A little remark: please let us download maps over 3G, instead of just WiFi, warn us that it is going to be expensive, but a least let us decide to do it anyway.

About third party apps, adoption and maturity

Just like the other two big mobile platforms, Windows Phone 7 has an application store, which they call Market-place.

Marketplace has over fifty thousand apps al-ready, but does that really matter? I would argue that it is more important to have the apps you really want instead of just thousands of crapps. To some degree the Marketplace has the apps you need the most: Facebook, Twitter, Spotify, Skype (coming soon), Angry Birds… But then, once you have installed those, it is a bit underwhelming. Some good games are available (though they are bit expensive), but I simply can’t spend hours browsing apps in the Marketplace finding new apps to get even more out of my device like I can in the Apple AppStore.

Of course, this is easy to explain: Windows Phone has virtually no market share. According to Gartner, Windows Phone has 1,5% market share (based on sales third quarter 2011). Compared to Android (52,5%) and iOS (15%) that is a bit low. So the platform is not very attractive for app developers (or at least their companies) and few apps are built.

However, I am developer myself and one of my main reasons to use a Windows Phone is that is has a very good platform for developers. Silverlight and C# are a delight compared to Apple’s Objective C. Lack of market share is the only thing that makes the platform unattractive, everything else about it is excellent for developers. I believe the Lumia 800 and the “Microkia” partnership in general may the start of a serious raise in market share and popularity of the platform.

When the first version of Windows Phone 7 was released, over a year ago, a lot of reviewers stated that it was a step in the right direction, but lacked maturity. With over 500 new features in the Mango release it has grown up and is -in my opinion- equally capable as the iPhone or Android, except for the lack of good apps.

Conclusion

The Lumia 800 is a wonderful piece of engineering. The design is unlike anything we have ever seen: plastic, but premium. It is pretty, it will not fall apart, the ergonomics are better than any other device I have ever tested. Windows Phone 7 Mango is a good operating system, it is refreshing and beautiful. Live tiles and deep integration with social networks are real timesavers.

Does it work properly?
Yes, both the software and hardware work well, only the audio quality is disappointing.

Is Windows Phone mature enough?
The operating system feels a lot more “finished” than the first version of Windows Phone 7. Having said that, the Marketplace still is a bit disappointing compared to the competition.

Should I buy it?
If you want to buy a Windows Phone, buy this one. It is the best one I have seen. If you want to buy a smartphone, well…, you might like Windows Phone, it is something different, but there are some downsides.
The Lumia hardware may even be so good that it makes you forget some of the problems with Windows Phone and ultimately allows the platform to grow and prosper.

Acknowledgements

I would like to thank Nokia Belgium for giving me the opportunity to review this device and Microsoft Belgium for recommending me to Nokia.

I have done my best to add some good quality photos to this review. For a more complete photographic overview I refer to The Verge.