Friday, December 27, 2013

My first two weeks with a Nexus 5 after a year with a Lumia 920


Two weeks ago I purchased a Nexus 5, because I wanted to try something different after a year with a Lumia 920.

I chose the Nexus 5 mainly because I wanted to try an Android for my everyday use and because the reviews are very positive of both the phone and the Kit Kat version of this operating system.

In this post I will simply write all my thoughts, love and hate after the first two weeks of use. Also I’m a total noob with android, so I’m more than open to suggestions for apps or configurations to solve my problems.

My everyday use

Before I start with the things I found useful and useless of android, I want to explain what is my everyday use, or at least till now with my Lumia. I do not use it for gaming of any sort, but just to make calls, texts, appointments, private and company emails, reading news, social activities on Twitter, Facebook and LinkedIn and, of course, as a navigator. I also use it as a test device when developing.

In these two weeks I did not rooted the device, changed firmware or rom. I wanted to use the phone “as is” and see what it has to offer out of the box. The next couple weeks I will start get my hands dirty with franco.kernel and maybe the purity rom and see how the uses and functionalities change.

The first Day

The day I received the phone (Nexus 5 32gb white) I was a little disappointed. I spent 400€ for this phone and no ear buds? really?

After turning it on, and doing the first configuration, I started moving around and get accustomed to the new interface. The first positive things I noticed were the possibility to totally crypt the device, the notification center (really cool) and the notification led. It was since my HTC diamond that I hadn’t a phone with hardware notifications.

The notification center is really cool, you can see there are notifications in the top area of the screen and swiping down with a finger let you access to the full list. If you, instead, swipe with two fingers you access all the quick menu like settings, toggling on/off Wi-Fi, Bluetooth and mobile connectivity. Really handy. With windows phone you have to use an app to create some shortcut, but you can not access all part of the settings. Another nice touch is with the Wi-Fi icon, with two little arrows it show if there is ingoing or outgoing traffic.

Another plus is the hardware led that blink white if you have new emails or texts, blue if you have new Facebook's alerts, and so on.

Now the bad things I found on the first day. I suppose some are due to the fact that I was expecting the same functionalities of windows phone or ios.

The biggest one is related to voice commands. I use them a lot when driving and, with windows phone, everything worked like a charm. When I receive a text a voice warn me and ask me if I want to have it read to me, call the sender or ignore the event. If I want to call a person by saying only the name, and not the kind of number (mobile, work place or home), the phone asks me which number to dial. It even asks me which person to call If it find multiple occurrences of the name (for example when I only say “call Daniela”). You can also specify if you want voice commands active only when using Bluetooth, Bluetooth and ear buds or always on.

With Android I was not able to find a way to replicate this behavior. If I use the call button of my ear buds it ask me to unlock the phone. Really disappointing (and it’s not safe while driving if you have to grab and look at the phone to unlock it). Another thing that show me how useless voice commands are, is when you unlock the phone and tell Google to call someone. If this person have only one number, the call start (without voice feedback of the action), but if this person has more than one number a screen appear waiting for you to click the number you want it to dial (also without voice feedback).

Believing it’s impossible that Android can not does that, especially after trying the voice recognition it sports under the hood, I started searching and posting this question on some forums (XDA is one), but with no answers. On the Google store I found an app that seems to do what I am looking for, but it is only for Motorola’s phones (here is the link).

After some experiments, I was able to have it works only for making calls using the English dictionary (I’m Italian, so using it with my contacts names is quite useless) and with the data connection on. But I can not in any way use it for the other things (there is an option to allow the hot word to works also with the phone locked, but the battery dies faster).

I found than an option to use commands with Bluetooth. I do not like Bluetooth ear buds because they usually die in the middle of a conversation and I do not want to remember every time I use my car to turn on and off the Bluetooth. Anyway I tried with two different pair of Bluetooth headphone (one Jabra and one Cellular Line that works with other phones) to see if I could solve my problem and with my surprise I could only pair them. With both of them, when I press the call button, I hear a voice saying to wait and, on the display, appear a gray screen with written “initialization” and stay there forever. Also in this case I wrote on XDA and did some searches, but no luck till now. I’m wondering how other people do. Just ignore the phone and do not use it till they reach to their destinations?

Another things that I do not like is how it handle contacts. With windows phone, the same person with data coming from LinkedIn, twitter or Facebook is automatically aggregated in one form. you can also handle it manually. Android don’t. I found 4 times the same contact just because the LinkedIn app or Skype added it and no way to tell the phone to group them under the same name.

Writing a status or posting a photo on more than one social network is a pain, I have to open one app for each one and post the status update or upload the photo n-times. From windows phone you got one upload and the ability to choose to which network post directly inside the OS (but it miss G+ in the list of networks). I found a couple apps for this purpose but they are not integrated into the functionalities of the phone, like from the camera to post directly after taking a shot.

The last thing that scared me a bit are the authorizations the apps want when you install them. I ended up not installing a lot of apps I wanted to try just because I did not feel right allowing them all what they ask. For example, I was looking for a flashlight app and some of them asked for access to contacts, GPS, phone id, storage and camera. The first thing I though was that it was too suspicious and  ended up not installing many apps. But I suppose the one to blame is the lazy developer that ask for everything “just to be sure” than the platform itself. And that’s why there are so many antivirus on the play store. After some digging I found out about App Ops and I am a little disappointed to have to void the warranty and root the device (I know I can relock, but it is still a beta and can break apps, or so Google say) to allow me to do what should be there since at least a couple two major release.

The other days

In the following days I found more things related to everyday use. The first one is the lock screen, totally useless, until you install a third-party app to try to behave like windows phone. At least what I expect from the lock screen is to be able, with a single glance to see the upcoming appointment, unread email, missing texts and other apps notifications. DashClock, created by an engineer at Google, a widget for the lock screen that do what I was looking for. The bad thing is that when you press the button to turn on the display, you see immediately the keyboard to insert the pin, so the information are all compressed in the top part of the screen. It would be nice to have it occupy all the screen by default and not to have to swipe down to hide the keyboard. Here are two screenshots of what I mean (taken form the app page)

lockscreen lockscreen_swiped

Another little thing I found annoying is that you can not set a background picture for the lock screen and a different one for the home screen. I saw some apps that replace the lock screen on the play store, and I guess I should try them, but using a third apps that could potentially compromise the security, for a wallpaper is a big no-no for me. So I will stick with default, thoroughly tested, one for the time being.

Another functionality that I find really cool is the notifications of the alarms. They are shown as a notification starting from an hour before they will end. So you can disable that specific alarm without having to stop and remember to reactivate them at a later time. It happened to me a gazillion times to turning off a planned alarm and forget to reactivate it later.

The possibility to remotely install an app on your phone works very well, from your pc, you choose an app from the play store, press install and five seconds later your phone starts to download and install that app. With windows phone I was never able to do the same thing. The only one that really worked for me, was to send an email with the link of the app and open the link from the phone.

The voice recognition is really awesome, fast and precise, but until you have to take the phone in your hands before using it, will remain useless for me.

Another little thing that is better on Android, is that you can not change the volume while your phone is locked. With windows phone I can and, sometimes, you accidentally mute the phone by pressing the volume buttons while in your pocket. The one thing I do not get it from Android, Windows phone and iOs, is why, with the phone locked, I can turn it off. In my opinion I should first unlock it.

One other thing I find very annoying of Android is with the calendars. I have 9 calendars and 4 of them are read-only. When you create a new appointment it show you also the read-only ones and if you do not pay attention you end up creating an appointment on the Facebook calendar. After you save it you see it in the calendar, but if you close and reopen it, it’s obviously gone. Like windows phone it should filter out the read-only one and remember the last calendar used for ease of use.

Last two things I find better on Android than on WP8 are Skype and the keyboard. Skype works as it should, while on Windows phone is already a miracle if someone write you and a toast notification appear. It’s totally random, sometimes it works, sometimes not.

The keyboard with the swipe option turned on is amazing. It still can not recognize some of my most used words as the first probable combination (if I try to write “ciao”, it end up with “chiuso” every time), but I guess it only need some good training.

For now that’s all I found. For my use, android seems like a nice platform for playing and messing around, but for the real everyday use (at least mine) at the moment I still prefer what my Lumia has to offer. The voice commands truly works and I can not think of migrating to anything that do not equal or surpass WP8 in this, I am too much dependent on it while driving. And, as a plus, the free offline navigator that Nokia give for free.

What I like best of Android is the ability to change every thing inside Android, with the risks that freedom bring. I will stick with my Nexus for at least  another month and see how I can improving it by changing the kernel and trying some custom rom that seems to include some functionalities that I’m missing. While for the Bluetooth headphones, I should be able to try a couple others before starting to think that my phone is somewhat broken. If you have some suggestions for solving the “problems” I’m facing please get in touch with me.

Sunday, September 8, 2013

First event storming experiment


A couple of months ago I tried to use Ziobrando’s event storming with some co-workers and a couple of friends who were trying to do DDD for the first time. This is my report of the experience and how everything went, nothing fancy.

The first time I tried Alberto's event storming, I was impressed on how easy he was able to let the discussion emerge about the details of the sample application to be designed and how easy was for the newbies to start doing DDD in minutes.

In our workshop, after I briefly explained the sample application to be developed (I was playing the Domain Expert) and the concepts behind Domain Events, the developers started to ask questions and cooperate as a team naturally.

I can confirm what Alberto suggest about writing the first post-it. I perceived some kind of shyness/low confidence on writing it, so I wrote the first one and the rest came in as a nice flow in relation to the questions and relative answers.

The session evolved from the commands implementation to drawing the first aggregates. People also started to talk about subdomains, bounded contexts and ACLs.

The nice thing is that you start with enough to just write events, and only after the people got their hands dirty a more complete explanation arrives. And this, in my opinion, has allowed to better understand the concepts explained.

The other nice thing, that I really appreciated, was that the participants did not realized, at first, that they designed a complex application without first thinking about database tables. And it is a lot of value in my opinion.

We did this on a Monday evening at 7 pm, but the two hours and half of the session literally flown by.

Also in the last part, where we talked about what we learned, a lot of questions still arose and, with a lot of probability, they won't have in a more classic passive session.

During the dinner the feedbacks I got was quite in line with mine impressions:

  • The fog cleared a lot on some DDD's concepts;
  • Getting the hands dirty from the beginning allowed to understand better the topics;
  • You are forced to do the things the right way;

Obviously a key ingredient was the people with their enthusiasm and will to learn.

I think event storming is a really powerful tool and should be used often. In my company I will use it for sure for the next big project I will have to work on. Thanks Ziobrando :)

Sunday, August 25, 2013

Oculus, Ar. Drone and Kinect completed

Recently I completed my experiment with the Oculus Rift and a Kinect to drive a Parrot Ar.Drone.
Using Kinect I implemented both voice commands and gestures to drive the drone. With voice commands I issue the takeoff, land, emergency and change camera commands, while with gestures I drive the drone.
The nice thing about the voice recognition of the Kinect is that it works quite well with all the noise made by the drone. As you will see in the video I raised a bit my voice, but I still find it awesome.
The gestures implemented are the following:
  • Both arms forward -> move the drone forward
  • Both hands near the shoulders -> move the drone backward
  • Left arm extended to the left and right arm along the body -> move the drone to the left
  • Left arm extended to the left and right arm forward -> move forward and to the left the drone
  • Left arm extended to the left and right hand near the right shoulder -> move backward and to the left the drone
The right movements are simply the left ones mirrored.
The Oculus, instead, was used to view the live feed of both drone’s cameras (with the stereoscopic filter applied, of course) and the head tracking to move the drone up/down and turn left/right.

Here is a video of it working. In the first part you can see the head movements, while in the second part the gestures.

It was fun to put together all these gadgets and try them out (I mean, having the drone crash everywhere :D)
Here you can find the full source code if you want to try it out.
As a disclaimer, I did this to learn something new and just for fun in my spare time, so the code is nothing to be proud of :D

This is a simple summary, but, if you’re interested, I will make some posts about the code of every part involved (gestures, voice commands, head tracking)

Saturday, July 27, 2013

Experiments with Ar.Drone, Oculus Rift and Kinect

Recently, thanks to my friends at Digitalmind, I was able to put my hands on an Oculus rift's developer kit and an Ar.Drone.

I wanted to start by simply streaming the video feed of the parrot to the Oculus.
Initially, I thought of putting the video on a wall of a 3d room so I started from a project in XNA with the idea to convert it to MonoGame later.

The first problems arised quite immediately. Streaming and handling the video, at least for me, was something totally new, so I spent the some hours searching on how to handle a stream in h264 with C#. FFmpeg was the answer.
Once downloaded and decompressed in a folder, to connect to the parrot, you simply open a command prompt and type:

ffplay tcp://

A window will pop up with the video signal, so far so good.
Next step was to find a decent wrapper for FFmpeg in C#. There are some projects out there, but I found them a little too young/unstable. After more digging I found this wrapper, and, with a little modification to the file names of the DLLs imported, worked like a charm. I took the class with all the invoke and imported it in my project. The guy who implemented the wrapper is also developing a Parrot client in C#. I learned a lot from him.

Once I had my video working, and mapped to a texture2d, I just needed to implement the stereoscopic view for the Oculus.

To do that, I wrote a shader to apply to the final frame. With SetRenderTarget I created my frame with everything (video and some text) and than rendered it with the shader:

RenderTarget2D renderTarget;
Texture2D videoTexture;
Texture2D renderTexture;

protected override void LoadContent()
   renderTarget = new RenderTarget2D(GraphicsDevice, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
   videoTexture = new Texture2D(GraphicsDevice, 640, 360, false, SurfaceFormat.Color);


private Rectangle leftSize;
private Rectangle rightSize;
private int viewportWidth;
private int viewportHeight;

private void UpdateSize()
  //if the window size is not changed, I do not need to do the math again
  if (viewportWidth != GraphicsDevice.Viewport.Width || viewportHeight != GraphicsDevice.Viewport.Height)
    viewportWidth = GraphicsDevice.Viewport.Width;
    viewportHeight = GraphicsDevice.Viewport.Height;
    leftSize = new Rectangle(0, 0, viewportWidth / 2, viewportHeight);
    rightSize = new Rectangle(viewportWidth / 2, 0, viewportWidth / 2, viewportHeight);

Effect oculusRiftShader;
protected override void Draw(GameTime gameTime)
  //Here I draw everything needed
  spriteBatch.Draw(videoTexture, new Vector2(0, 40), Color.White);//1280x720 centered on 1280x800
  //create rudimentary HUD and draw some text

  renderTexture = (Texture2D)renderTarget;

  //Then I pass the texture to the shader
  spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, null, null, null, oculusRiftShader);
  spriteBatch.Draw(renderTexture, leftSize, Color.White);
  spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, null, null, null, oculusRiftShader);
  spriteBatch.Draw(renderTexture, rightSize, Color.White);


From the Oculus's SDK you get all the info needed to create the shader.

Here my test with the video.

After about a week, I have added some new functionalities:
  • Takeoff and Land with voice commands via Kinect. 
  • The parrot turn left or right when I turn my head left or right.
Here is a video of my progress

Now I'm working on implementing a face tracking on what the Parrot is seeing, (Maybe I can write some code to have the parrot follow a specific face) and I'm still not sure if using Kinect gestures to handle the others commands of the parrot or using the Razer Hydra for a better handling of the Parrot.

When my code will be enough decent and clean (now is a total mess of trials and errors) I will post it on Github.

Sunday, July 7, 2013

MVC paging extension with scrolling page numbers

In a project I worked on recently I got the request to page the results of a search without showing all the page numbers, but only a limited set. I had to show only 10 pages and let them scroll forward if the user clicked a page in the right half (6 to 10) or backward if the click was in the left half (1 to 5).

Here are the steps I followed to have it done.

First of all, what we need are the total records, the records per page and the page number we are actually showing to the user.

Let's assume we are working with a class named Product with these properties

namespace Domain.Entities
  public abstract class AggregateRoot
    public Guid Id { get; private set; }

    public AggregateRoot()
      Id = Guid.NewGuid();

  public class Product : AggregateRoot
    public string Title { get; private set; }
    public decimal Price { get; private set; }

    public Product(string title, decimal price)
      Title = title;
      Price = price;

And a very simple layer for the queries. In the constructor we also create some sample records
  public interface IQueries<T> where T : AggregateRoot
    IList<T> GetAll(int pageIndex, int pageSize, out int totalRecords);
    IList<T> GetAll(Expression<Func<T, bool>> where, int pageIndex, int pageSize, out int totalRecords);

  public class ProductQueries : IQueries<Product>
    private IList<Product> products;
    public ProductQueries()
      products = new List<Product>();
      for (int i = 0; i < 200; i++)
        products.Add(new Product(String.Format("product{0}", i), i * 1.75M));

    public IList<Product> GetAll(int pageIndex, int pageSize, out int totalRecords)
      return GetAll(null, pageIndex, pageSize, out totalRecords);

    public IList<Product> GetAll(Expression<Func<Product, bool>> where, int pageIndex, int pageSize, out int totalRecords)
      if (pageIndex < 0)
        pageIndex = 0;
      totalRecords = 0;
      IList<Product> result = new List<Product>();
      var query = products.AsQueryable();
      if (where != null)
        query = query.Where(where);
      totalRecords = query.Count();
      if (pageSize > 0)
        result = query.Skip(pageIndex * pageSize).Take(pageSize).ToList();
        result = query.ToList();
      return result;

Now that we have a super simple infrastructure, that will give us the total records, we can concentrate on the helper. As stated before, we need the page size, page index and total records to do the math, but we also need the URL to render for each page. Something like "products/page1", "products/page2" and so on. The solution is to pass a function with the Url.Action with where to put the page number

  public static class PageHelper
    public static MvcHtmlString PageLinks(this HtmlHelper html, int totalItems, int itemsPerPage, int currentPage, string cssActive, int scrollPages, Func<int, string> pageUrl)
      if (totalItems == 0)
        return MvcHtmlString.Create("");
      if (currentPage < 1)
        currentPage = 1;
      var totalPages = (int)Math.Ceiling((decimal)totalItems / itemsPerPage);
      var startIndex = 1;
      var endIndex = totalPages;
var result = new StringBuilder();
      for (var i = startIndex; i <= endIndex; i++)
        var liTag = new TagBuilder("li");
        var tag = new TagBuilder("a");
        tag.MergeAttribute("href", pageUrl(i));
        tag.InnerHtml = i.ToString();
        if (i == currentPage && !String.IsNullOrEmpty(cssActive))
        liTag.InnerHtml = tag.ToString();
      return MvcHtmlString.Create(result.ToString());}

The use of this helper will be like this:

@Html.PageLinks(Model.TotalRecords, Model.PageSize, Model.Page, "active", 10, x => Url.Action("Index", "Home", new { page = x }))

The missing piece is just the algorithm to show only a certain number of pages based on the page index.
What we must take into account, is the event the pages to show are a odd number, for example 5.
The question is, if a user click the 3, what will happen? Should we go forward or backward? My choice is to do nothing and stay put.

Here are the bits with the solution I came up to

 if (scrollPages > 0)
   bool isOdd = scrollPages % 2 != 0;
   int countRef = (int)Math.Ceiling((decimal)(((isOdd) ? scrollPages - 1 : scrollPages) / 2));
   if (isOdd)
   if (currentPage > countRef)
     startIndex = currentPage - countRef + 1;
     if (isOdd)
     endIndex = currentPage + countRef;
     startIndex = 1;
     endIndex = scrollPages;
   if (endIndex > totalPages)
     endIndex = totalPages;
     startIndex = totalPages - scrollPages + 1;
   if (startIndex < 0)
     currentPage = 1;
     startIndex = 1;

As you can see, I simply check if the number of pages to render is odd and act accordingly.
Last, from the controller, you just populate a ViewModel and pass it over to the View
    public ActionResult Index(int? page)
      var model = new ProductsViewModel();
      model.Page = page ?? 0;
      int total = 0;
      model.Products = productQueries.GetAll(model.Page, model.PageSize, out total);
      model.TotalRecords = total;
      return View(model);

The route rule I used is as follow
routes.MapRoute("", "products/page{page}", new { controller = "Home", action = "Index", page = 0 }, new { page = @"\d+" }); 

The last part of the rule, use a RegEx to ensure that the parameter passed is only a number.
I hope this can give you some hints on how to solve a common problem. As usual you can find a working sample with the relevant tests on my GitHub at this url.
Happy coding :)

Monday, May 20, 2013

An update on my use of the Surface Pro after two months of use

After two months of intense use of my Surface Pro, I must say that I will not turn back to my old configuration. There are some cons, obviously, but after two months, in which I forced myself to only use it as my main device, when out of office, I can confirm quite everything I wrote in my last post.

One thing I appreciate more than before, is the weight. Going around with 900 grams in the backpack or just with it in my hand, make a big difference compared to going around with my 15" laptop. And having the same functionalities (the surface pro sports a i5 CPU), do not let you miss anything.

The cons I found are the screen size and coding with it. For some, having a resolution of 1920x1080 can feel too small, in my case, it's not the size, but the angle of the screen while laying on the table. It's too low, the angle seems it was studied for small people. I am 1.86 meter tall and, while at the table, it's really uncomfortable. Every time, I tend to lower my shoulders and head, to pair the viewing angle. So I ended up attaching some rubber bumbers on the bottom of my surface and using the nylon sleeve as a mount. Much better working with it laying down.

For the coding part, as I say in my previous post, the touch cover is not a viable solution at least for me, so, after some digging, I purchased a Logitech's bluetooth keyboard. This keyboard is really nice. First of all you can invert function keys, it's back lit, does not use batteries, but you can recharge it by plugging it to a usb port and it's compact. It also has a proximity sensor that will light up the keyboard automatically when you come close. In the end it is a bit expensive, but it's worth it in my opinion. I then purchased an economic bluetooth mouse. I barely use it, while coding.

The new configuration of my backpack, is much lighter than before without missing productivity. Maybe I am a little more productive, because now I write notes or quick fixes also in places where my notebook did not fit well or was uncomfortable to use.

Here is the back with the rubber bumpers:

My nylon sleeve to keep it in the right angle (at least for me)

Monday, April 1, 2013

My thoughts on the Surface Pro

A couple of weeks ago I've been in Miami and had the chance to buy a Surface Pro 128gb.
Surface Pro case

Till now I used an eBook reader, an iPad and a notebook to get things done. In the last weeks I forced myself to use the Surface Pro as my primary device and see if it can fit my needs and I can ditch both the notebook and the iPad.

Step 1, replacing the notebook and the iPad
The first limitation I found was in replacing my notebook, at the office I have a docking station with 3 monitors, and once you're used to it, it's impossible to go back. At least for me. So I ended up leaving my notebook in the office, doing the job of a desktop one, and using the Surface Pro as my new device for travels, taking notes and developing at home. Dropping the iPad was quite easy, because I just use it for browsing the Internet, reading PDFs and a game or two sometimes, nothing much. I tried, without success, to use the iPad for note taking or writing blog posts, but the on screen keyboard, for this kind of operations, is not for me.

The second thing I found limiting is the battery life. If you think of the Surface Pro as a notebook, than the battery life is amazing and the weight for the power inside this little thing is also very good. It can last 4 hours with no CPU intensive tasks and low screen light. And that's more than my actual notebook (it's an Intel i7, but two hours are not so much). If I think of the Surface Pro as a tablet, than the weight and the battery life are not even comparable to whatever tablet on the market.

Step 2 installing the everyday applications
This is the big problem, there are no apps on the store and the majority that I tried felt like some superficial work just to push something on the store and hope to get some money. Fortunately, the marketplace let you try the apps before you buy them and I think it's a big plus. The famous apps, like Twitter, Facebook, Good reader, Zite or Instapaper, are way behind they counterpart on other stores or, worst, they are not even there (an official Facebook app is still missing, seriously). I really miss Zite and did not found a replacement yet. I wrote to Zite asking if they will release a Windows 8 version, but no answer yet.

So, after some digging I found a decent client for Instapaper (but I still prefer the one for iPad) and a nice news reader. One Note, fortunately, it's there and is better than ever. For the Good reader replacement, at the moment I am using the built in PDF viewer. I found this one, but it has no trial version and seems to miss some elementary features like copy and paste. So I am sticking with the default reader until a more mature product come to light. 
Something not related to work, but to relax is the video player. The one bundled with Windows it's ridiculous and also are the other players you can find on the marketplace. A couple of them can play video files with external subtitles, but with one of them you have to select the ".srt" file manually every time you play a video. None of them, at the time of this article, can can play a full HD Matroska decently.
So no player to use with your fingers, but, at least, the desktop come to the rescue with plenty of choices (not finger friendly, of course, but I can live with it).

Everyday use with the Type Cover
The Type Cover is amazing. Writing with it, once you get accustomed to the keys layout, is flawless. I can write with the Surface Pro on my lap without problems. The on screen keyboard is better than the iPad's one, but in my opinion is still not enough for writing long portion of text or code. One thing I found annoying are the function keys, every time you need to press one, you also need to press the "Fn" key. I was not able to enter the Bios and find an option to invert the behaviour, like any notebooks on the market. For now the solutions to serious coding, is to get a BT keyboard or using the ANTSOFT Key manager.
Last thing I found messy, is the track pad while coding. Too often I touch it with my palm and move the cursor. So after 5 minutes digging I found a solution developed by Microsoft itself. Do not ask me why they do not talk about it anywhere. Anyway, after setting the track pad to my needs, everything works like a charm.

Everyday use with the Stylus
Taking note with the stylus is fantastic, the feel of it while writing and the handling of pressure is really something. I was happy like a kid when I discovered that for erasing something it was enough to turn the pen and erase just like a pencil with the eraser on its end. Using One Note with the pen for note taking, while talking to the customer, or in train to just note down some drawing, finally allow me to leave at home my notebook.
Another advantage, is the integration between apps vie the Charm bar. With a simple swipe from right to left, you can immediately send via email a copy of the notes just written. With Sky Drive integration is also easy to share the notes with a group of people for modifying them or simply give to some of them read-only access. I just suggest to calibrate the pen before using it for optimal performance.

Everyday use with the apps

What I noticed immediately while surfing the web, is when I want to download a file for later use. For example to copy it to another PC or open it later, because I do not have the correct application yet. I can simply download it wherever I want, do whatever I want and when I want. With the iPad I was forced to send me a link so I can download it from my notebook.
Another good thing is that I have the Office 2013 installed, so no  more trouble opening that PowerPoint for showing to the customer and discovering that all the animations are gone. I can finally handle all my Word and Excel files without compromise. I purchased an office suite for the iPad (for $15.99) but Office 2013 wins hands down. But there is still a lot of work to do to better support touch. Outlook is usable for quick mail checking and replies, but nothing more without a keyboard.
The USB 3.0 port is awesome, I transfered a 8GB file from an external HD in less than 1 minute and half. (about 102MByte/s). The mini display port is also convenient, with a 30/50$ adapter you can handle an external HDMI, DVI or VGA port.


In the end the Surface Pro is the tablet/notebook I was looking for. Lightweight with a battery duration acceptable for what it gives you and a nice tool for note taking that do not let me miss paper and pen.
I can write code nicely and with its i5 dual core processor, I can compile with Visual Studio or Delphi without trouble. I also use the Kinect for my development with no problem at all.
The only thing that would be nice now is that the rumors about a keyboard wich extend the battery is really in development.