Nick's .NET Travels

Continually looking for the yellow brick road so I can catch me a wizard....

HTC Vox Alignment

In my previous post I covered a number of the nice features of the HTC S710 (ie the HTC Vox).  I did allude to the fact that the keyboard didn't feel as balanced and as natural to use as the K-Jam keyboard.  In this post I hope to be able to explain some of this:

In this picture I have marked in a number of different "centres" and as you can see they don't really align.  Starting with the red and orange markings.  The red indicates the centre of the keyboard, based around the space key, while the orange marker is the middle of the screen.  You can see from the mis-alignment that this isn't going to be a great user experience when the eyes aren't aligned with the middle of the keyboard.

The next pair to look at is the Red and Green markers.  The Green indicates the centre of the keyboard as defined by the middle of the QWERTY style keyboard - ie between the G and H keys where the responsibility generally splits between right and left hands.  This mis-alignment, although it would seem that it is only a small amount, is IMHO enough to be a little off-putting when you come from a more balanced desktop keyboard or even other devices such as the K-Jam or JasJar keyboards.

Lastly look at the Blue markers - these are the locations of the right and left menu buttons (not really centres as such).  The annoying thing about the left button, is that it is almost in the middle of the device which means in order to press it you have to take your left hand off the edge of the device (where you would normally hold it for text entry).

The one saving grace on this keyboard are the Cap and Fn key LEDs that are bright and clearly visible when you press the Cap, Shift or Fn buttons.

In so far as the keyboard goes on this device (relative to others) it is definitely a major low point!  I think that they tried to condense the keyboard too much and have failed to really provide a good user experience.

MEDC Demo Code

See attachment for the demo code for my MEDC 2007 Australia presentation - "Building Applications to take on the road - A Guide to Microsoft Synchronisation Technologies"

WCF via Carrier Pigeons

Earlier this year the .NET Compact Framework team announced that there was going to be an implementation of WCF for Window Mobile devices.  In addition to the regular http binding they were going to put some work into an email binding that would take advantage of Direct Push and Exchange 2007 capabilities.

Today I was reminded of a great RFC entitled "A Standard for the Transmission of IP Datagrams on Avian Carriers".  I think this RFC was ahead of its time as it even includes discussion on prioritisation and worm detection. All I can say I can't imagine synchronising my offline database using Microsoft Sync Services via WCF over Carrier Pigeons!

Secret .NET Developer Business....

Ok, there are rumors starting to emerge that someone special has been oganised for next months [PerthCoP] meeting, which btw is Thursday June 7th.  My sources have informed me that the presenter is:

  • A former Microsoft employee
  • Recently ranked the #2 presenter at CodeCamp
  • Can do 2 things at a time, despite being Male....
  • Is traveling interstate to come and present

I think there should be enough clues the for you to work out who it is!

You might want to paste this into your calendar as the meeting will apparently start a little earlier than usual and be held at a yet to be disclosed venue.  This will then be followed by a community dinner where you get to throw curved balls at our guest.

Keep your eyes on the user group announcements feed for more information.

WCF, WPF - MS stop wasting your breath

This is a post where I get to vent some frustration at our attempts at [Intilecta] to build large enterprise software using the latest technologies.  Recently we have been talking about using WCF and/or WPF for parts of the application.  After spending a day looking at whether these technologies really make a difference I then realised that I should probably check out the minimum system requirements.  From the download site for the .NET Framework v3 Redistributables it is evident that the minimum requirements are WinXP SP2 and above - which necessarily precludes Win2K. 

You might ask why organisations are still running Win2K - it all comes down to cost and the ability to migrate.  The larger the organisation the harder it is for organisations to make the transition and upgrade. This is a reality in building large enterprise software and unfortunately that means no WCF or WPF for me!  MS can preach all the benefits of WCF and WPF as much as they want but until they help those large organisation migrate to Vista they are wasting their breath.

FYI even SilverLight requires WinXP SP2 and above - MS has made the decision to support non-MS clients in preference to supporting organisations that have used Win2K for almost a decade!

Weekly Coffee

I meant to post this earlier this week but only just found the photo on my HTC Vox:

The weekly coffee is a great opportunity to take a break from what ever you are working on and catch up in a social setting with other developers.  This week a number of the group are on the move it seems - with the job market really hotting up employers really need to lift their game if they want to attract top staff.

Unfortunately I won't be able to attend coffee next week as I'll be presenting at MEDC Oz.  Don't use this as an excuse as the usual suspects will be at Tiger Tiger, 1:30pm on Tuesday.

Subversion and the AnkhSVN Plugin

A while ago Mitch posted about the AnkhSVN plugin for [VS2005] and that he thought that it would be better than using the explorer addin, TortoiseSVN.  After using both for a couple of months now I don't quite agree.  Unfortunately while the AnkhSVN plugin does a great job of checking files in, displaying diffs etc where it fails down is keeping the solution explorer up to date.  Quite frequently I'll open up solution explorer and notice that files which I know are under subversion control aren't marked as such.  Doing a refresh on the folder or expanding to show all files is enough to trigger a refresh of the plugin so that it fixes the display.  The problem is that when I go to commit changes I typically click on the solution node and select commit - forgetting that some of the files might not be correctly picked up by the plugin.  As such there have been occasions when only part of a change have been committed.  Now I just go back to windows explorer for my commits!

One nice feature I just noticed with the plugin is that it extends the properties that are visible when you click on a file.

The first 6 properties are the standard properties that you would expect to see in the properties grid when you select a file in solution explorer.  The rest of the properties are pulled from the subversion file information.  For example you can see who was the last author to check in the file, what revision the file was at and what the uri of the subversion repository is. 

HTC Vox 1 day on

After spending a day with my brand new Vox I thought that I'd share some of my thoughts regarding this device.  In the past I have always been a Pocket PC/PDA kinda guy but when I saw the HTC S710 (aka the HTC Vox) I decided to splurge on a Smartphone device.  Of course these names are now defunct and what I have is actually a Windows Mobile 6 Standard device.  Although I have only just started on my journey into Smartphone land I still think that I'm going to need a lot of convincing that it is the way to go.  However, if you are already a Smartphone user then the Vox maybe your perfect device!  Anyhow enough talking, lets get into some images....

Thanks Expansys - looks like the packaging has remained intact!

 

HTC have gone the black look and I tell you now it looks sexy.  None of the i-mate white box (typical of geek gear) this packaging is very slick indeed.  Actually this reminds me of Hugo's OQO O2 unboxing where the packaging was awesome.

 

Inside the box is nicely presented with a funky looking manual and a "Read Me First" shortcut guide to getting started with your device.  Being a good developer I decided that I should read that last and just get on with powering up the device ;-)

Underneath the manuals are all the bits you would expect - device, usb cable, power adapter, headphones (oh, and yes it is a usb headphone/mic cable)

The device itself is very slick.  In this image you can see the external MicroSD slot (with a rubber cover) on the left and the camera button on the right.

On the other side of the device you find the volume and voice note buttons.

Sliding out the base of the unit reveals the keyboard which isn't as nice IMHO as the K-Jam keyboard I'm used to.  There are some nice aspects, like the Cap and Fn lights (top left of the keyboard) and the left/right menu buttons (top of keyboard). Unfortunately the whole keyboard isn't quite centred - if you look up from the space bar you will see that the H and U keys are immediately above it instead of the space being in the middle of the G-H and Y-U keys.  Whilst doesn't seem a big thing, when you start typing an SMS it can be really off putting and takes a while to get used to.

Getting started with this device absolutely rocks! After putting the battery into the rear of the device you don't have to open it up for anything else.  The SIM card fits into an external slot - which there is a fixed cover to ensure it isn't dislodged. 

As seen earlier the MicroSD card also goes in an external slot. 

Check out the camera - 2.0 Mega Pixels and despite no flash it seems to take really good photos even in low light.

The USB socket in the based of the device replaces the headphone/mic jack on earlier devices.  This should result in better sound quality through the headset.

From the top of the device we can see the camera button on the left and the power button on the right. 

The keypad on the front of the device is very slick - I really like the position of the home and back buttons.  This combined with the phone buttons being on the lower left and right makes for a really usable device for t9 texting etc. 

Hey, I had to go the 2Gb SanDisk MicroSD card so I could fit all that music on my device and not have to worry about lugging my iPod around. 

Pocket Controller already has a skin for this device!  The HTC homescreen layout is very slick, reducing the application icons allowing plenty of room for task and appointment notifications. 

The camera viewer is just cool - full screen with only minimal clutter to show you the zoom (top left), brightness (middle of the button) and other settings.

If you need to adjust settings it appears as an overlay of what you are currently viewing - very slick. 

The device also comes with Audio Manager so you can organise all that music.

Of course viewing the [Intilecta] website rocks using Deepfish on this device.

My favourite application of the moment, Skype, seems to run quite well on this device.  Particularly since this is one of the few smartphones that has wireless.  Although there isn't a specific HTC S710 link on the Skype page you can download the application for the WM5 smartphone instead.

Skype also integrates into the home screen (although it got rid of the HTC home screen which I wasn't so happy about) showing your connectivity status. 

Alternatively you can customise Windows Live (ie Live Messenger for Windows Mobile 6) to take up real estate on your home screen.  This is particularly useful if you do a bit of searching and want to stay logged into Messenger on your device.  The left and right arrows allow you to easily cycle through Windows Live functionality.

Bookmark: Applications for hosting CD/DVD ISO Images

For the most part burning the 5+Gb DVD ISO image of Visual Studio Orcas Beta 1 to DVD is not only a waste of time, it's also difficult on low end DVD burners.  This is where applications that are capable of hosting an ISO image as an additional drive on your computer come in handy.  As a bookmark for my future reference two such products (both free) that have recently been recommended to me are:

Update: Apparently according to Bill Virtual CloneDrive won't actually work with the Orcas B1 image, but I've left the link here as they might fix the issue for future versions.

Are UMPCs/Tablet PCs going to succeed?

With a week full of conferences behind us (MEDC(US), MIX07(US) and CeBIT(AU)) it is worth reflecting on a particular device that has got a fair bit of attention from the likes of Hugo, jkOnTheRun, GottaBeMobile and probably one of the best reviews done at The Gadgeteer, which is the OQO O2.

I must confess that although this device might look like every device-junkie's dream come true I remain very skeptical around the form factor of this device.  I think have to agree with Wolfgang that at least the current breed of devices are so far from being ideal I don't think I would recommend purchasing one.

Lets take the OQO for example - here is a device that doesn't appear to be much larger than the JasJar and yet offers all the richness of a fully fledged laptop.  Is this form factor going to work? I think that despite Hugo's attempt to convince us that he can get by an entire day using this device for blogging, doing email etc, I think that if you were to focus in on such a small screen for 8 hours a day, every day, your eyes would definitely complain.  Whilst this device is small enough to be easily carried between meetings, it is still heavy and bulky compared to a Windows Mobile pocket pc device.

But you might say that I should be comparing apples with apples - ie compare the OQO to UMPCs, Tablet PCs or Laptops.  Agreed, when put alongside those devices the form factor is quite compelling as it's small enough to not take centre stage in a meeting (unlike laptops that act as a barrier between participants in a meeting). However I would imagine that even taking handwritten notes in a meeting would be quite a hassle given the small screen size.

One of the main reasons that there has been a lot of interest in UMPC devices in contrast to the new form factors of Windows Mobile devices is in my opinion to do with the operating system.  Unlike WM devices, both UMPCs and Tablet PCs run full versions of Windows.  This means that if you have an application that is written for Windows, even if it doesn't have explicit Tablet PC support, it will still run on these devices.  This immediately makes them a more appealing option when an enterprise is looking at "going mobile" as they don't need to reengineer any of their applications.

The downside of running a full version of Windows is that you need to have similar hardware to a laptop/desktop machine - typically 30-60Gb HDD, lots of RAM - both of which reduce the battery life of the device, implicitly making you less mobile.  Do we really need to carry around 30Gb of data when we are going into meetings?

In the second half of Wolfgang's article he starts talking about Mobile Internet Devices (MID) - ie devices that are (nearly) always connected.  It appears that Intel are working on new processors and that there are devices in the pipeline that will not support a full Windows operating system.  Unfortunately this might leave Microsoft in a tight spot as Windows is inherently not modular (not to be confused with Windows CE which was designed to be modular). 

I think it has to be said though that the capabilities of a MID doesn't go much beyond what a current Windows Mobile Pocket PC does today - I challenged Hugo after reading his article on using the OQO for a day to really sell me on where I would use an OQO in preference to my K-Jam!  All the hype around the iPhone is really just the cross section of the functionality offered by the Windows Mobile platform and Apples ability to fit a nice user experience (something which Microsoft is still struggling with).

Having used a laptop for doing all my development work for the last couple of years I'm not exactly sure what my ideal supplementary device would look like.  I was originally taken with the idea of a UMPC style device for going to meetings with but since using my K-Jam extensively for the last year or so I am starting to rethink my position on this.  Once mobile data becomes fix cost (similar to what has recently been announced in the UK) I suspect that I will use my K-Jam (or even my new HTC S710 smartphone) in meetings. Of course the last point worth mentioning is that Windows Mobile devices are a fraction of the price of a UMPC device - especially if you are looking at one with a solid state drive!

So, what does your ideal supplementary device look like?

What .NET Framework Version am I running?

Someone on the Stanski mailing list recently asked about a particular version of the .NET Framework (v1.1.4322.2379 which seems to almost be MIA and almost no useful information on Google).  What came out of the conversation are a couple of applications/tools. 

The first is a free .NET version checking utility which the guys across at TMG Development have built.  On their download site they also have a quite comprehensive list of the different framework versions (although the mysterious version is missing from that list too).

Early this afternoon I also came across a Microsoft site that will inspect the current version of a dll and provide you with information about what the dll is, when it was shipped and in which packages it was included - this might some day be useful so I figured I'd keep a reference to it here.

Perth IT Action

Just a reminder about a couple of events:

Today:

Perth .NET Community of Practice has its monthly meeting at the Excom Training Centre @ 5:30pm - Don't miss Stephen Price talking about the Expression Suite.  Also, if you haven't already, make sure you subscribe to the user group announcements feed here.  We will continue to send out email reminders prior to each monthly event but this feed will contain other information about what's going on in Perth etc.

Slides for Dave sessions are now available here

Tomorrow:

The Australian Computer Society Young IT (WA) committee  are hosting an "IT in the Pub" event from 6pm tomorrow evening.  Check out my earlier post for more information.

Every week:

Don't forget the weekly coffee fix on Tuesdays, 1:30pm @ Tiger Tiger - come and share your experiences, frustration with your peers.  The food, coffee and service is fantastic and there is free wireless to boot!

MEDC Australia:

The Mobile and Embedded DevCon is hitting Sydney next week (15th May).  If you are in the neighboorhood I suggest you register today

TechEd 2007 Australia:

Early Bird (until 21st May) registrations are now open.  This is definitely an event not to miss.  If you haven't already booked this in your calendar I'd suggest that you register now.

Single Instance by default with OneCare

Today has been incredibly frustrating.  With Bill's help I was able to work out some of the issues I was facing yesterday with regards to using the Single Instance Application feature in the VB Application Framework.  Turns out that they use a secure channel and if you attempt to use an unsecure channel (ok, I know I should have been securing it but it was a prototype!) it fails.

The next problem I encountered was that the first time you attempt to establish a connection, OneCare (my current firewall product) would prompt you to say whether it should be allowed, blocked or just blocked this time.  The ironic thing was that in the meantime the app had crashed in the background.

Going back to what the VB team did in building their single instance feature I created a very simple application (ie create new project -> Windows Application (VB)).  I then enabled the single instance feature and ran the application.  From the bin folder I tried to run the application again and BANG there goes OneCare again:

That I could live with but a second later (before I had a chance to select an option) I noticed:

Urgh - I'm not sure whether this is a bug/feature of OneCare or the VB Application Framework but I'm so not happy!  Pretty sure this is an issue with OneCare as it shouldn't be rejecting the connecting application until the user has selected whether the accept or block the application.

Funnily enough if you select to "Block for now and ask me again later" if you try to run the application again it just crashes without the OneCare prompt.  I guess this is to be expected with a v1 product!

Update: Looks like this is definitely a problem with OneCare (and perhaps other firewall products).  I disabled the OneCare firewall and instead enabled the standard Windows Firewall.  The Single Instance test app works fine without prompting or failing.  Although it is great that OneCare protects more than the standard Windows Firewall there is an issue (aka bug) that it is causing the client application to fail prior to the security prompt being dismissed!

Good job I own a Window Mobile phone!

As Brian posted there is a Microsoft for Partner Roadshow coming to Perth next week.  Being a Microsoft partner [Intilecta] decided to go along to see what all the fuss was about.... Of course, this meant going through the online registration process.  Interestingly it prompts you to enter the type of mobile phone you have:

But hang on, where are all the Windows Mobile devices?  I know that the registration process is run by Info Salons but honestly Microsoft should really audit their service providers to ensure people who have invested in their technologies don't feel like they have been left out of the loop. 

My Remote Pain

Actually it wasn't that remote but it was to do with .NET Remoting.  I wasn't trying to do anything difficult yet getting a simple scenario to work resulted in a number of hours of tearing hair out.  In a test application the remoting call would work fine but when I embedded the exact same code into the main application it would fail stating:

No connection could be made because the target machine actively refused it

You'd think this was some security issue but I tried everything I could think of (and a few more thanks to Google) and to no avail.  In the end I ripped the solution apart - it turned out to be something wrong in the .suo file.  Delete this file and I was good to go - ARGH!

The next issue I came up against was when I had changed a few things in the client application (the app that was going to call into the server application where the remote object had been instantiated).  All of a sudden I was getting the following:

An existing connection was forcibly closed by the remote host

Now someone else has previously experienced this same issue and it turns out it might have something to do with the way that the VB team uses remoting to provide "single instance application" support in their application framework. 

Building a simple send (ie client) and a simple receive (ie server) style application (which I had done earlier when trying to resolve the first issue) I tried enabling and disabling the "single instance application" feature on both sides.  Turns out that it was only when I enabled this feature on the client application did I run into issues.  This time I got the following exception information:

Authentication failure

Inner Exception: "Unable to read data from the transport connection: The connection was closed."

I haven't had a chance to work out exactly is conflicting between this feature and the ability to use tcpchannel remoting.  Hopefully when I have time I'll get to the bottom of it.

Linq To Entities Walkthrough

This post follows on from my previous comments on the Orcas Beta 1

The first thing you will need to do if you want to work with the Entity designer in Orcas Beta 1 is to download and install the fix (see my previous post).  This does NOT appear to include the drag-n-drog design surface that will enable you to redesign your entities but does at least provide a UI interface to the EDM tool. 

The first step in building an application that uses Entities to pull data too and from the database is to add a Data Model to your project.  You can do this via the usual Add New Item dialog:

Add New Item - ADO.NET Entity Data Model 

Select Generate from Database, Unless you want to code everything by hand! 

Using the familiar New Connection button you can set up a connection to your database  

Next, choose the database object you want to import as entities. 

You will notice it adds three model files and a generated code file

Although the individual class files don't exist, you now have a series of classes defined that map to the database objects you previously selected.  If you open up the Class View window you will see them.

The next thing to do is to setup the databinding and the UI.  In the same way as you could add an object binding source in [VS2005] you can do the same thing via the Add Data Source item on the Data Menu.  Selecting Object as the data source will present you will a list of objects to choose from.

Notice the entity classes are all in a generated namespace.  In our case we have selected the Manufacturers class.  The Entity generator still doesn't cater well for moving between singular and plural names!

Once we have added an Object Data Source we can use the Data Sources window to drag-n-drop either a grid or details onto our form.

Select the Data Grid View

Tidy up the form and remove unwanted columns - To remove these out of the entity model is a bit of a mission as you have to remove them from the 3 model files.

Next we need to add a little bit of code to the Load event of the form so that we can populate the data grid:

Public Class ManufacturersForm
    Private dc As New MobileEntities   
(1)

    Private Sub ManufacturersForm_Load(ByVal sender As System.Object, _
                                                              ByVal e As System.EventArgs) Handles MyBase.Load

        Dim mans = dc.Manufacturers.ToArray     (4)

        Dim manufacturers = From manufacturer In mans _              (2)
                                          Where manufacturer.MAN_Name.Length > 5 _
                                          Select manufacturer.MAN_Name, manufacturer.MAN_URL

        Me.ManufacturersBindingSource.DataSource = manufacturers           (3)
    End Sub
End Class

  1. In order to work with our entities we need a data context (think of this as a data manager that is responsible for loading, refreshing and saving your data).
  2. Lets use a bit of Linq to select Manufacturers with Names with a length greater than 5.  Note that we are projecting only the Name and Url fields from the Manufacturer class
  3. Now apply the data to the binding source.  Note that although we built the binding using the full Manufacturer class because we only use the Name and Url fields in the grid we can get away with binding to the anonymous type projected in the previous linq statement
  4. Unfortunately Linq to Entities is still relatively broken and on occasions you will have to force a pre-evaluation of the query in order for the following query to execute!

We now have a working sample - How easy was that!

This shows you the very basics of how to bind (single-direction) entity data to a ui grid.   

Prada pPhone

So it's not really called the pPhone because that would be just too stupid (no comment on the iPhone name) but the Prada Phone might be a hit with all those fashion conscious people out there!