I hope you have all enjoyed a Happy Christmas. Nothing technical today. I just wanted to share with you something my six-year old daughter made for me:
Monday, 26 December 2011
Tuesday, 29 November 2011
Mini Review: NHibernate 3 Beginner’s Guide
I’ve recently re-discovered the pleasure of reading in bed, thanks to my new iPad, which, with its backlit screen, allows me to snuggle under the covers with a good book without disturbing my wife. Packt Publishing kindly provided my bedtime reading for the last few nights - NHibernate 3 Beginner's Guide by Dr. Gabriel Nicolas Schenker and Aaron Cure.
This is a book I wish I’d had three years ago. Back then I was sketching designs for a database-heavy application, and I evaluated Nhibernate, but was put off by its steep learning curve, and skimpy documentation. The documentation has improved immensely in the years since, and NHibernate itself has got easier to use, but it can still appear daunting for someone just getting started.
This book makes Nhibernate approachable for the absolute beginner, even one who is relatively new to database technologies. The author explains key concepts carefully, and drives lessons home with plenty of comprehensive step-by-step tutorials.
What I particularly liked was the inclusion of the Nhibernate ecosystem: FluentNhibernate (in my opinion the best mechanism for configuring NHibernate) is given good treatment, as is NHProf, a commercial Nhibernate profiling tool. It was also nice to see an introduction to unit testing NHibernate data access layers.
One area that I did feel was a little weak was the section on setting up mappings. The author gives examples of three different ways in which mappings can be configured, but doesn't cover important aspects like cascading updates in much detail at all – something I’ve been caught out by several times, and an area on which I would have appreciated some friendly guidance when I was starting out. Have a look at NHibernate in Action if you want to dig in more deeply here.
This book definitely goes on my list to recommend to anybody starting out with NHibernate development.
Monday, 24 October 2011
XAML Magic: Turning an Ugly Silverlight Duckling into a Beautiful Photoshopped Swan
Over the last few weeks I’ve had the privilege of working with Ayende and the Hibernating Rhinos team on the new management UI for RavenDB. Never one to follow the herd (unless perhaps it consisted of Rhinos), Ayende’s bucking the trend and building it in Silverlight.
My part was to beautify the application by mimicking Photoshop designs that a designer had created for a new version of the RavenDB website. I was quite pleased with the way it turned out, and the screenshots Ayende posted on his blog got some favourable feedback.
Ayende asked me to write a blog post on the transmogrification process, and he has just published it on the company blog. Go read it, to find out how I turned this
into this
Monday, 3 October 2011
Announcing the launch of Mixed In Key 5
I’m very pleased to announce that Mixed In Key LLC, one of my clients, have just launched the product I’ve been working on for the last eight months. Mixed In Key 5.0 is for DJs who put together their DJ sets using harmonic mixing, a technique for ensuring a musically pleasing transition from one track to the next by eliminating key clashes.
How it works
Mixed In Key supplies the key ingredient to successful harmonic mixing. It analyses every song in a DJ’s collection and determines which key it is written in (by key, I mean musical key, like C#, F#, A Minor, etc.). Every song is then added to a searchable database.
The other ingredient comes from music theory, and has been cleverly codified by Mark Davis into the Camelot Wheel. This shows the relationship between each key in a diagram arranged like a clock. To build a harmonic mix, a DJ finds the key of his first song on the wheel (so E Major is at the twelve o’clock position). For his next song he should pick one in a key which is an “hour” to the left or right, or stay at the same hour but switch between major or minor keys. Mixed In Key 5.0 includes a clickable Camelot Wheel to instantly search the database for songs in a particular key.
Under the bonnet
The User Interface is all built in WPF. As I hinted in an earlier blog post, I had a great time taking the designs beautifully drawn up for us in Photoshop by our designers and mapping them into XAML. Though I have to say, it is a painstaking process, poking all those pixels into precisely the prescribed positions – I guess it took something like 5 or 6 days to polish the 4 screens in the applications.
But more important than looking gorgeous, Mixed In Key 5.0 had to be fast and responsive (we started the project many months before Windows 8 was announced, otherwise that would have been “fast and fluid”). I have to thank the Task Parallel Library in .Net 4.0 for making this really easy to achieve (though not as easy as it will be in C# 5.0, when we get our hands on the await keyword).
At the heart of the application is song analysis, which is a process with several steps. First, we read the song data using some custom DirectShow filters (DirectShow is actually rather fun to use once you’ve got the hang of it). Then we send extracts of the data off to our analysis server in the cloud for processing. Finally we have to add it to the database. Each of the steps takes a while to complete, so are ideal candidates for Tasks.
.Net 4.5 has a rather nice Dataflow library that is ideal for setting up a pipeline of tasks that need to be processed asynchronously. But that’s not out yet, so I used some extensions that Stephen Toub wrote to the current TPL library for chaining Tasks together. Here’s what our analysis pipeline looks like:
AnalyzeSongAudio(progressReporter, file) .Then(audioAnalysis => file.AudioAnalysis = audioAnalysis) .Then(_ => ReadFileTags(file)) .Then(tags => file.Tags = tags) .Then(() => SetItemStatus(file, QueuedFileStatus.DetectingKey)) .Then(_ => DetectKey(file)) .Then(result => file.SongAnalysisResult = result) .Then(_ => RewriteTags(file)) .Then(result => AddSongToCollection(file)) .Then(song => UpdateQueuedFileWithSong(file, song)) .Then(() => SetItemStatus(file, QueuedFileStatus.UpdatingFile)) .Then(() => UpdateFile(file)) .Then(() => SetItemStatus(file, QueuedFileStatus.Completed)) .OnError(task => UpdateItemWithError(file, task.Exception.InnerException), Schedulers.UIThread) .ContinueWith(t => DecrementQueuedFileCount(), TaskContinuationOptions.ExecuteSynchronously);
As an aside, do you know the best thing about using Tasks in your application? You get your free lunches back again! As PCs get more and more cores, your application will automatically scale to take advantage of them.
What a launch!
Yakov, the founder of Mixed In Key LLC, tells me that the launch has been very successful already.The Mixed In Key Twitter stream has been flooded with happy comments. Here are a few of my favourites:
Woke up without a hangover, got called off jury duty &
@MixedInKeyjust came out with version 5.0 that analyzes video!!! Start of a good day
@MixedInKey You guys did it!#MIK5 is working like a charm. Gorgeous interface, unrivaled speed, heaps new features and still easy to use!!My new
@MixedInKey purchase rocks! Firing on all 4 cores at the moment at 100% CPU, this thing is#fast! Currently scanning 3000 songs :)
@MixedInKey is very very fast! Like a thunder! The multicore processing is the best feature
So Congratulations to Yakov and the rest of the Mixed In Key team, and thanks for letting me help out on such an exciting project.
Friday, 16 September 2011
What’s new in C# 5.0 and VB.Net?
As always, Anders Hejlberg’s session at Microsoft’s Build conference was a must-see. He’s a great presenter, and he had some great things to show off.
Anders started off by laying out what’s new in C# 5.0 and VB.Net. Bear in mind that Microsoft now have a policy of language parity for C# and VB.Net. So both languages get Windows Runtime support, Asynchronous programming and a brand new feature, Caller info attributes. VB.Net plays catch-up, and finally gets support for Iterators.
Asynchronous Methods
The first demo in Anders talk was about asynchronous programming. He introduced it by reminding us how vital responsiveness is in touch applications. This was something Jensen Harris mentioned in his talk. Touch User Interfaces are visceral. If an application doesn’t respond immediately when you touch it, it feels dead, whereas using a mouse or keyboard introduces a kind of disconnect between you and the computer which makes delays feel more acceptable.
In the Windows Runtime, the designers took the decision that if an operation was going to take more than 50 milliseconds to complete, it must be implemented asynchronously. There will be no synchronous equivalent – it would make it too easy for developers to do the lazy thing. So, all of a sudden it becomes really important to be able to do asynchronous programming easily.
This is where C# shines in comparison to C++ or Javascript for writing Metro style apps. In those languages, doing asynchronous programming means callbacks, and that means turning your programming inside out. The Asynchronous Methods feature in C# allows you to do async programming in the usual, straightforward, do-this-then-that fashion.
I won’t say any more on that here. Go watch Anders demo if you haven’t groked async yet. Your future as a Windows developer depends on it!
Windows Runtime integration
In the next section of his talk (starting at 26:00), Anders demonstrated more of the deep integration that C# and .Net now has with the Windows Runtime. He showed how it is possible to take a C# “compute engine” and expose it to a HTML/Javascript meto-style app (it works just as well with C++). You can take a C# project, compile to a WinMD file, then reference it from your HTML/Javascript project. This gives you intellisense for your C# objects when you access them from your Javascript code. As Anders said, “In Javascript, you sometimes get lucky. [Beat]. Of course, in C# you get lucky always! … I’m Just saying!”
Caller Info Attributes
The aforementioned Caller info attributes came up next (see video at 32:00). Not a big feature, just a palate cleanser between demos, according to Anders.
Apparently the C# team often get asked when they’re going to introduce support for __FILE__ and __LINE__ macros, which, C++ developers will know, expand when compiled to produce a string containing the name of the current source file, and the current line, respectively. Of course, C# will only introduce support for macros over Ander’s dead body, so the team had to find another way.
Anders related that back in the days of C# 1.0 they had a design that implemented this feature using attributes, but it involved optional parameters on methods which weren’t supported at the time. Well, now C# 4.0 supports optional parameters on methods, so the team revisited the design, and, lo and behold, C# 5.0 now has the CallerFilePath, CallerLineNumber and CallerMemberName attributes.
You can write a Trace.WriteLine method like this:
public static class Trace { public static void WriteLine(string message, [CallerFilePath] string file = "", [CallerLineNumber] in line = 0, [CallerMemberName] string member = "") { var s = string.Format("{0}:{1} - {2}: {3}", file, line, member, message); Console.WriteLine(s); } }
Then, if you were to call Trace.WriteLine(“Something just happened”) the compiler would automatically fill out the optional parameters in the WriteLine method with details of where you made the call from.
This isn’t in the current developer preview, but will be in the final release. As Anders said, not a big feature, but no doubt somebody will put it to good use.
The Roslyn (Compiler APIs) Project
The last half of the talk (starting at 35:26) dealt with what comes after C# 5.0, which is what project “Roslyn” in all about (named apparently after a cute little mining town, an hours drive from Seattle). Roslyn is “the compiler re-imagined”. Anders introduced Roslyn by noting that we are increasingly addicted to IDE productivity tools which provide features like “Find Reference”, “Go to Symbol”, “Rename”, and “Extract Method”. All these need knowledge about code that is traditionally locked inside the compiler.
Roslyn is all about building compiler APIs that expose what the compiler knows about code to the IDE and to developers. It will include Syntax Tree APIs, Symbol APIs, Binding and Flow Analysis APIs and Emit APIs. The APIs are designed using modern principles. So, for example, the SyntaxTree objects are completely immutable (though you can create new ones by combing bits from old ones) and this means that they are concurrency safe. All the language services in the IDE (syntax colouring, intellisense, etc.) are going to be using Roslyn.
All this is going to be available to us starting mid October, when a CTP of Visual Studio Roslyn will be released. APIs will be available for both C# and VB.
The demos Anders gave of Roslyn are pretty impressive (starting 43:00). First up was the ScriptEngine API that allows you to parse and execute code from a string, or even get a delegate back for executing it at some later point. This led in to the demo of the C# interactive window, which will be part of Visual Studio in the future. You can select code in the editor, press Alt-Enter and have it immediately executed in the interactive window. If you then go and edit it there, you get intellisense, even for methods that you have just interactively defined.
Another demo,roundly applauded, was “Paste as VB” and “Paste as C#” which uses the Roslyn APIs to parse and translate code from the Clipboard buffer. The source code for this will be made available in the CTP.
None of this was big news, of course, because Anders first started talking about it when I was at PDC in 2008. But it’s nice to know that it’s moving on steadily, and that we’ll soon be able to have a play with it.
Windows Runtime – Dial in the right expectations before reading up
Three days on from the announcement of the Windows Runtime at Microsoft’s Build conference the marketing dust is settling and the full picture emerging. As you begin to read up what the Windows Runtime actually is you’ll need to set your expectations to the right level or you run the risk of being disappointed. But set them appropriately and I think you’ll see that an exciting developer journey lies ahead.
Leading up to the conference I was hoping for a new lean-and-mean User Interface platform for writing any kind of Windows application. But that isn’t what Windows Runtime is about. As things stand this week, Windows Runtime is about producing Metro-style applications (think Windows Phone 7) optimised for running on Tablet devices. Windows Runtime is aimed squarely at the solar plexus of iOS and Android 3.0.
Miguel de Icaza and Tim Anderson have already done a good job of writing up what has been announced so far about Windows Runtime (or WinRT). But here are the two key points to notice:
- Metro-style apps run in a sandboxed environment. As with Windows Phone 7, apps have to declare upfront, through a manifest built in at compilation time, which capabilities of your PC they intend to use. Access to APIs is monitored at runtime by the Runtime Broker, which prevents your app from doing anything naughty. Only certain parts of the .Net Base Class Libraries can be used, and even native developers are limited as to which Win32 or COM objects they call. Apps can only talk to each other through the WinRT-endorsed Contracts, which allow for Sharing, File-picking etc.
To a developer all this sounds like a horrible restriction. But it is wonderful for users, who can have much more confidence that applications they install from the new App Store will not get up to mischief.
- Metro-style apps are always full screen and immersive. Windows Runtime does not provide a general-purpose windowing system. Several presenters at the conference mentioned that support for overlapping windows have been intentionally left out. And for one simple reason: they don’t work well in a touch-centric environment.
Windows Runtime is not (at the moment) a general purpose runtime. It may get there eventually, but for the time being it is focused on building the kinds of apps and games that today you might run on the iPad, the Xoom, or (once the lawyers have finished their fisticuffs) the Galaxy Tab. Think of it as Silverlight-on-Steroids-With-Native-Extensions for Tablets and you won’t go far wrong.
As speakers at Build conceded, there are many kinds of application that would not fit the Metro-style. Visual Studio is one. Photoshop is another. Microsoft Office is (possibly) a third. For these kinds of apps, keyboard, mouse, menus, toolbars, ribbons and dialog boxes still works best.
This means Win32 and WPF are still very much alive. Though there are no sessions about it at the conference, WPF 4.5 has been announced with a number of not-insignificant new features, including the promised fix for the Win32 airspace restrictions (though nothing has been said about hosting Silverlight controls in WPF apps).
I’m no prophet, but I don’t believe this is the last we’ll hear about WPF.
Wednesday, 14 September 2011
Build Windows Day 1–and a peek a what’s to come
If you haven’t caught the news already, yesterday at Microsoft’s Build Windows conference Steven Sinofsky announced a preview of Windows 8 and a bunch of developer tools, including Visual Studio 11. You can download it here.
As predicted, Windows 8 comes with an all new development framework, the Windows Runtime (WinRT). I’ve not read enough myself to begin explaining. But here’s a picture, snapped during Steven Sinofsky’s keynote:
WinRT is an object-oriented API, consisting of 1800 objects, accessible to managed, unmanaged and JavaScript code alike. Sinofsky emphasised that this WinRT is a peer to Win32, not another abstraction layer built on top of it. As this diagram clearly shows, and Sinofsky stressed in his talk, Win32, .Net and Silverlight developers have nothing to fear, all current frameworks continue to work in Windows 8.
I’m sure to have more to say about WinRT in the coming days. In the meantime, InfoQ has a couple of articles summarising what we learned in the keynote. If you’re wanting a sneak peak at the API’s themselves, check out the preview documentation on MSDN.
The videos are the first few sessions of the conference are already up on the web:
- The Day 1 Keynote
- Jensen Harris: 8 traits of great Metro style apps
- Aleš Holeček and John Sheehan: Platform for Metro style apps
What’s next?
In other news, the session list is now up for the rest of the week. Here are a few that grab my attention.
- Anders Hejlsberg on Future directions for C# and Visual Basic. Doesn’t look like “Roslyn” (compiler-as-a-service) will make it into Visual Studio 11. But he might announce some new language features for C# 5.0.
- Mark Miller and Pracheeti Nagarkar give a Deep dive into the kernel of the .Net Framework. Sounds like they’ve done yet more work to improve code-generation and garbage collection.
- Stephen Toub, one of my favourite speakers from previous years, is doing two sessions: The zen of async: Best practices for performance (vital know-how, given that many of the new WinRT API’s will be asynchronous) and Building parallelized apps with .Net and Visual Studio (look for some announcements about new parallelization libraries).
- Harry Pierson and Jesse Kaplan are doing a talk on Using the Windows Runtime from C# and Visual Basic
- Out of curiosity, I make take a look at Daniel Moth’s Taming GPU compute with C++ AMP where he’s going to introduce new tools and language features for using the GPU within C++ solutions.
- Boris Jabes talk A lap around DirectX game development tools also piques my interest, as it promises the “most significant set of improvements for developing graphics-intensive apps in over a decade”.
And now, on with the show!
Wednesday, 7 September 2011
Microsoft’s Build Windows Conference is Next Week – What’s in Store?
It’s less than a week to go until Microsoft’s Build conference. According to tradition, about now I should be speculating on what the future holds for us faithful Microsoft developers. But there’s still no official session list. Fortunately, we do have a few official hints, and a couple of very unofficial leaks to whet our appetites for what’s in store.
Windows 8
Read the Build homepage, and you’ll see that the conference is focused very clearly on Windows 8. We’ve already had a preview of the new touch-centric, Windows Phone 7-like UI. And over on the Building 8 blog, Steven Sinofsky and others on the Windows team have started announcing some of the to-be-expected features like USB 3.0 support.
Here are some of the other things that we know already:
- Windows 8 will support ARM processors, and System on a Chip architectures. Look out for a slew of Windows 8 based tablets to compete with the iPad and Galaxy Tab. Indeed, there is a rumour doing the rounds that Microsoft will be giving away a Windows 8 tablet to all Build attendees.
- The Windows Desktop is being demoted to just another application, that some users (think Tablet users) may never see. Instead they’ll live in the new immersive Metro environment.
- Windows Explorer is being Ribbonified, and the File Copy/Move experience given an overhaul.
- It’s goodbye to Virtual CloneDrive and friends, as Windows 8 gains the ability to mount ISO files, and also simplifies mounting of VHD files.
- Windows 8 will be getting its own App Store.
And now comes the controversial part. Those of you who have not entirely delegated their memories to Google will recall that when Microsoft first showed the new Metro desktop for Windows 8, they announced that developers would be able to use HTML5 and JavaScript for building these new-fangled immersive apps. But they said nothing about the presence of .Net, WPF or Silverlight in this brave new world, stirring up an instant furore in the blogosphere.
But there’s no need to panic. It’s all under control. I think.
Direct UI
This is where we turn to the leaks. Leaked Windows 8 builds, that is.
According to Peter Bright over on Ars Technica, Microsoft are creating a new Windows Runtime (or WinRT), which is intended to be the successor to the Win32 API. It will be a native-code API, but shaped in a way that is pleasing to the eye of a managed-code developer, and what is more, said .Net developers will be able to access WinRT through a new (hopefully painless) version of COM for which support is being built into .Net 4.5.
Included in WinRT is a new UI framework called Direct UI which appears to be a lean-and-mean version of WPF/Silverlight (and also uses XAML – remember how part of the XAML team got moved to the Windows division!). With the official details coming out in less than a week, there’s little point on me elaborating further here, but you can get a taster of the new APIs by reading these two forum threads which dissect some of the leaked Windows 8 builds.
What I look forward to hearing is where WPF fits into the picture. One thing we know with a high degree of confidence, given Microsoft’s backwards-compatibility track record: current WPF applications will continue to work. The question is: will there be further development to WPF? As I reported last year, we know there are some new features coming, including fixing the airspace issues when hosting Hwnds inside WPF controls, and enabling hosting of Silverlight controls. But will there be anything beyond that? And will there be interop between WPF and Direct UI? Watch this space.
Silverlight
Remember that Microsoft stirred up another firestorm at PDC 2010 by staying mum about Silverlight? They put that right a few weeks later by announcing Silverlight 5, which was quite distinctly not a maintenance release, since it included a whole raft of new features like a 3d API, vector printing support, and P/Invoke for Trusted Applications. They’ve now made good on that, with the Silverlight 5 Release Candidate coming out just last week. It will be interesting to learn Microsoft’s vision for how Silverlight, WPF and Direct UI align.
C# 5.0
We already know the headline feature for C# 5: asynchronous methods. We’ve had a CTP. Here’s hoping for a beta release during the conference. One thing Anders did say at his talk last year is that async won’t be the only new feature in C# 5.0. So I wonder what else he has up his sleeves? It would be nice if it was the Roslyn project (Compiler as a Service).
Visual Studio
It sounds like Microsoft are preparing to release a new preview build of Visual Studio at Build. Many of the features that were previously released as PowerToys for VS 2010 are going to part of vNext. But the more interesting news to me is that Microsoft have been taking note of data coming back from PerfWatson to make some big performance improvements. Visual Studio vNext is going to make more use of multi-core machines, and will reduce memory usage in some cases by doing builds out-of-process for C# projects.
Stay Tuned
My new boss has kindly given me some time next week to follow the Build conference from the comfort of my office. And as in previous years, I’ll be reporting back the choicest titbits as I find them. Follow me on twitter to hear it as it happens.
Now, over to you. What are you looking forward to? Have you heard any rumours that I’ve not picked up on?
Wednesday, 10 August 2011
Nice touch of humour in VirtualBox’s Clone Dialog
Oracle may have taken over Sun, and with it, the excellent VirtualBox. But it looks like the VirtualBox team, at least, have managed to retain their sense of humour.
Tuesday, 12 July 2011
How to create Inner Shadow Effects in WPF and Silverlight
A new experience for me this week: I was handed a Photoshop file containing the new UI design for the app I’m currently working on, and asked to implement it in WPF. Easy, I thought: Expression Blend has a Photoshop Import feature.
Not so fast!
Whilst Blend does a pretty good job of importing simple Photoshop files, it struggles when asked to convert the little flourishes with which designers like to top off their masterpieces. Like inner shadows.
Thus the inspiration for another first: my first ever Code Project article, Creating Inner Shadow Effects for WPF and Silverlight, which went live this afternoon.
If you’ve ever wanted to render something like this in WPF, go read the article.
Tuesday, 21 June 2011
WPF Training, anyone?
The team over at Framework Training approached me recently about putting together a training course for WPF and possibly UI Automation. I’ve been giving it some thought, but I need your help.
What would you like to see in a WPF course? Or perhaps, more to the point, what do you think your non-blog-reading colleagues would benefit from hearing about? Are there any areas you can think of that are not covered by existing courses?
I’m guessing that the world doesn’t need another WPF 101. But people might like some help on more advanced topics, such as using the MVVM pattern, extending the declarative powers of WPF with Triggers and Behaviors, or even learning how to write robust tests against their UI using the UIAutomation API.
So, over to you. The comment box is open … now!
And if you think the world doesn’t need another WPF training course, tell me what you would like to see. And feel free to give me the benefit of your wisdom on how training course in general should or should not be run.
Perhaps an incentive would help you put fingers to keyboard? I’ll give a £25 Amazon voucher to the person who (in my judgement) leaves the most helpful suggestions.
Update: My thanks (and, more concretely, a £25 gift voucher!) go to Jedrzej Sztompka who emailed in a copious list of suggestions. But don’t let that put you off: I’ll keep the offer open for anybody else who gets in touch with significant useful ideas.
Thursday, 16 June 2011
Resharper 6 XAML Tip: Intellisense for your Databindings
Anybody who has installed the Resharper 6 Beta (and that should be all of you – it’s awesome, and no major problems that I can see) will find in it a feature I’ve been wanting ever since WPF was first released: intellisense for databindings.
Mark up your Xaml so that Resharper knows the type of your DataContext and it will tell you what properties you can bind to, and warn you if it doesn’t recognize what you’ve typed. I’m always switching back and forth between my Views and ViewModels to make sure I get my property names right, so this will be a real time-saver.
There are lots of places where Resharper can already deduce the type of the DataContext – within DataTemplates where you’ve specified a DataType, for example. In other cases, there's just one thing you have to do to enable this awesome feature.
At the root of your file, you need to add the d:DataContext attribute and set it to the type of you Datacontext. Here’s an example:
<UserControl x:Class="MyApp.Views.MyView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:ViewModels="clr-namespace:MyApp.ViewModels" mc:Ignorable="d" d:DataContext="{d:DesignInstance ViewModels:MyViewModel, IsDesignTimeCreatable=False}">
Now if you press Ctrl-Space within a binding element, you’ll get lovely intellisense:
Friday, 10 June 2011
XmlSerializerFormat is NOT supported by WCF Rest 4.0 in Medium Trust
Here’s one for you googlers (or bingites): Using the XmlSerializerFormat attribute on methods that you expose over WCF Rest (i.e. services using the webHttpBinding) is not supported if your service is running in Medium Trust (as it most likely is if you’re using Shared Hosting, like Rackspace Cloud Sites).
This is contrary to what you might expect from reading documents like this, which say that XmlSerializer is supported in partial trust. I guess they forgot to test the webHttpBinding scenario. I should be clear: webHttpBinding itself works fine in Medium Trust: it’s using XmlSerializerFormat with webHttpBinding that will give you problems.
That’s the short story.
Here’s the amplified version.
How I learned: the hard way
I’m building a web service that my friends running MacOSX want to be able to use. Out in the Apple orchards they’re not so keen on SOAP as we are who sit behind Windows. So I turned to WCF Web Http, now part of .Net 4.0, which lets you take control of your urls and keep your messages to the bare necessities.
With WCF REST you have the choice of XML or JSON. I chose XML, and by default WCF will use the DataContractSerializer. That produces reasonably clean XML, but it is picky about ordering of elements within messages, it annotates elements with type attributes that are often unnecessary, and it has a rather clunky syntax for serializing arrays.
Then I read about the XmlSerializerFormat attribute. If you apply that to your Operation Contracts, it switches to using the XmlSerializer, and then, by decorating your data contracts with the appropriate attributes, you can take complete control of the xml which gets written to the wire.
All well and good – while the service was running on my machine. But when I pushed the bits to our web host, who run all websites under Medium Trust, it was a different story. All the calls to the service threw a ProtocolException with the helpful message: “(400) Bad Request”.
Turning on includeExceptionDetailInFaults, then spying on the interaction using Fiddler shed more light on the situation. I was getting back a stack trace with this at the top:
at System.ServiceModel.Dispatcher.UnwrappedTypesXmlSerializerManager.BuildSerializers()
at System.ServiceModel.Dispatcher.UnwrappedTypesXmlSerializerManager.GetOperationSerializers(Object key)
at System.ServiceModel.Dispatcher.SingleBodyParameterXmlSerializerMessageFormatter.EnsureSerializers()
at System.ServiceModel.Dispatcher.SingleBodyParameterXmlSerializerMessageFormatter.GetInputSerializers()
at System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.ReadObject(Message message)
at System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest(Message message, Object[] parameters)
A bit of hunting around using Reflector revealed that the BuildSerializers method always calls XmlSerializer.FromMappings, and if you check that out on MSDN, you’ll see that it requires Full Trust.
So there’s no getting away from it. You can’t use XmlSerializer together with WebHttpBinding under Medium Trust. I did try the usual work-around for getting XmlSerializer to work in Medium Trust – pre-generating the serialization assemblies at build time: but that was before Reflector showed me the clinching evidence that my efforts were futile.
So what are your options? Either stick with DataContractSerializer, or switch to JSON1. Or, if time is on your side, wait for the next version of WCF which has a new extensible Web API specially designed to let you take complete control of your message formats and such like.
- Decorate your methods like this to switch to JSON format:
[ServiceContract()] public interface IService { [OperationContract] [WebInvoke(UriTemplate = "/MyOperation", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] Response MyOperation(Dto dto); }
Wednesday, 8 June 2011
Book Review: Brilliant Freelancer
I had a pleasant surprise last Tuesday: an email from Leif Kendall congratulating me on winning a copy of his book, Brilliant Freelancer.
The vividly coloured volume duly arrived on Saturday, and on Monday kept me pleasantly occupied on a journey from Birmingham up to London, and part of the way home again, leaving me with enough time to jot down my impressions before getting off the train.
I’d recommend this book to anyone hesitating on the brink of a freelance career, or those who have just taken the plunge. If, like me, you’ve hitherto been consumed by coding, or whatever it is that specialists in your field do, Brilliant Freelancer will open your eyes to everything else that is involved in running a micro-business. But it will turn up the lights gently so you don’t get scared off the prospect for good.
The books starts by helping you think through your suitability to be a freelancer, then talks you through making the transition from employment to being your own boss. It gives advice on how to find work through sales and marketing (including chapters on blogging and networking), how to price your work, and how to manage clients when you’ve got them.
You may be be asking yourself how you’ll get anything done without a boss to crack the whip – and Leif has thoughtfully included a chapter on Motivation. If you have the opposite problem, and can’t get enough of the drug called work, Dr Kendall is there to remind you (in a chapter entitled Healthy Body, Healthy mind) that “You’re selling you, so look after your product”.
Don't think of 'marketing' as a nefarious activity conducted by spivs and double-glazing companies. Marketing means to take your goods to market. You would not consider farmers evil for taking their wares to the market, so don't consider yourself evil for doing the same.
Leif Kendall, Brilliant Freelancer
There’s one part of the book that I feel could be expanded, and that is in the financial department. Book-keeping, after all, is the one part of every business that’s mandated by law. Brilliant Freelancer does little more than skim the surface here, and at the very least could do with some recommendations for further reading.
With his easy-going style, no-nonsense advice, and flashes of humour, Leif presents himself as the wise friend who has seen it all before. He’s not afraid to point out where you’ll find the going tough, but he’s equally quick to highlight the potential rewards.
Perhaps you’ve been thinking about setting up on your own? If so, this book is for you. Check out the website (you can read a chapter for free), or buy the book on Amazon.
Monday, 16 May 2011
Say hello to a hatchling: Seaturtle Software Ltd is born
Two months ago I handed in my notice. One month later, Seaturtle Software Ltd was hatched. I shepherded its dash to the ocean. And now I hold the reigns as it begins a journey in the vast ocean that is the international software industry.
To put it another way, I now own a software start-up.
And what a surprise that is. Three years ago I was in negotiations with my boss looking for a way to escape the slippery slide into management. Today I’m a business owner.
What changed?
Recession, and a radical restructuring changed the landscape at the company where I worked. Of all the former employees, I was the only one remaining. I stayed to make a last-ditch attempt to launch the product we’d been working on for two years. But it was not to be.
The directors and I explored several avenues for re-building the business. Eight happy and fulfilling years I’d worked for them, starting two weeks after I completed my Degree (my honeymoon occupied the interval). In that time they’ve given me fantastic opportunities to grow as a person and a software developer. I was hesitant to move on from a relationship that has blessed me so well for so long. But in the last couple of months I’ve come to realise that I have the skills to go it alone. And I’ve discovered that my taste in challenges has diversified beyond the merely technical.
Most importantly, I learned that starting and running a business is not as scary as you might think. Creating a company is just a legal formality (you can do it online for much less than £100). There are clever websites backed by smart accountants who will handle your book-keeping and tax returns for a very reasonable fee. The wonders of cloud computing provide infrastructure on demand.
All I need is a quiet room, a desk, a PC – and some bright ideas.
So Seaturtle Software is open for business.
Consulting will be my initial line of work, specialising in the things you know me for here on Functional Fun. So if you have a knotty WPF problem to solve, a tricky algorithm to implement, or simply want a leg-up with your UI Automation testing strategy, get in touch.
Thursday, 12 May 2011
Congratulations to the Winners of the WP7 Competition
So after a delay of more than a month, and some speculation that the judges might have taken the 3 x $10,000 kitty and done a runner, Red Gate have finally announced the winners of the Windows Phone 7 App Competition.
Sadly, Simon Squared, my little puzzle game wasn’t amongst the finalists.
But congratulations to Richard Fennell, Simon McKenzie, and Mark Rendle who scooped a prize each.
I was particular impressed with Mark Rendle’s app, Pocket C# which lets you write code on your phone (syntax highlighting and all), then uses a Windows Azure back-end to compile and run it. Perfect for racking up your StackOverflow rep on the move.
Tuesday, 15 March 2011
Let’s synchronize our watches: Determining Clock Skew with Christian’s Algorithm and the Reactive Framework
In every playground race, there’s always one child who sets off somewhere between “On your marks” and “Get set”, gaining an unfair advantage over the honest ones who wait for “Go!”. I faced a similar problem in the design of my Windows Phone 7 multi-player game, Simon Squared, though it was unsynchronized clocks and network latency that were to blame rather than cheats.
The multi-player mode in the game relies on puzzles being shown to all players at the same time, and players race to complete them. Since some puzzles can be solved in a matter of seconds, players who get to see them even slightly sooner than their competitors stand a good chance of getting to the solution first. So I needed a plan for avoiding the digital equivalent of playground squabbles.
Any such plan has to take into account network latency: an unpredictable amount of time can elapse between the server shouting “Go!”, and the phones hearing the message. So I got my server to send out a message announcing that it would shout “Go!” at time T, where T is 4 seconds on from the time on the server’s clock (and broadcast in UTC obviously). This gives even the most far-flung phone plenty of time to receive the message, check its own clock, and then start a count-down.
Bet you’ve spotted the flaw in that straight-away! What if the server’s clock and the phones’ clocks are out of sync?
An Overview of Christian’s Algorithm
That’s where Christian’s algorithm comes in. It gives us a simple method of broadcasting the time at the server to a client whilst allowing for network latency. It works like this:
- Client sends a message to the server: “What’s the time?” [adding ‘Mr. Wolf’ is optional]. Crucially, it notes the time that it sent the message (call it Tsent)
- Server responds as quick as it can, giving the time according to its own clock, Tserver.
- When Client gets the message, it notes the time of receipt (call it Treceived). Then it does some maths: the round-trip time, RTT, is Treceived – Tsent . So assuming that the server responded instantly, and that the network latency was the same in both directions, that means that the server actually sent the message RTT/2 seconds ago. Thus, at the instant Client receives the message, the time at the server is Tserver + RTT/2. Then the Client can compare with its own clock and determine the difference – the clock skew.
Since network latency can vary with each request we can get an improved result by trying the whole exercise several times then cherry picking the result which had the shortest round trip time, since that minimises the error in our estimate of the network latency.
So what does that look like in code?
The Server Side – with WCF REST
Well first we need the server to be able to serve up the time:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] [ServiceContract] public class TimeService { [WebGet(UriTemplate = "/?timeAtClient={clientReportedTime}")] public TimeCheck GetTime(string clientReportedTime) { return new TimeCheck() { ClientReportedTime = DateTimeOffset.Parse(clientReportedTime, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal), TimeAtServer = DateTimeOffset.UtcNow, }; } }
This is making use of WCF 4’s REST capabilities. Notice the WebGet attribute on the method, with it’s UriTemplate. If I add the appropriate route to my Global.ascx file,
routes.Add(new ServiceRoute("Time", new WebServiceHostFactory(), typeof(FeedbackService)));
that will ensure that HTTP GET requests like http://localhost/MyApp/Time/?timeAtClient=2011-03-17T20:19:30.2196972Z get routed to the CheckTime method with the appropriate part of the query string passed into the clientReportedTime parameter.
So that's the server side done.
RestSharp and Rx for Asynchronous Web Requests
Then the client needs to be able to call the server. I’ve been making use of the excellent RestSharp library here:
_restClient = new RestClient(ServerUrl); ... private IObservable<TimeCheck> GetServerTime() { var request = new RestRequest("Time?timeAtClient={timeNow}"); request.AddUrlSegment("timeNow", DateTime.UtcNow.ToString("O")); return ExecuteRequest<TimeCheck>(request); } private IObservable<TResult> ExecuteRequest<TResult>(RestRequest restRequest) where TResult : new() { var subject = new AsyncSubject<TResult>(); _restClient.ExecuteAsync<TResult>(restRequest, response => HandleResponse(response, subject)); return subject; } private void HandleResponse<T>(RestResponse<T> response, AsyncSubject<T> subject) { subject.OnNext(response.Data); subject.OnCompleted(); }
This is where things start hotting up. The first part of GetServerTime is obvious enough: in lines 7-8 I’m constructing a RestRequest consisting of a url and the appropriate query string parameter. Then I Execute it. Now since we’re talking Windows Phone here, I can’t make synchronous web requests – the phone UI has to remain responsive. So I can’t wait and then return the response from the method.
Instead I return an IObservable, an interface you might not be familiar with. This creature is the brain-child of the clever folks on the Reactive Framework team. They like to call IObservable the mathematical dual of IEnumerable. And what they mean is this: IEnumerable is used when you want to pull elements one by one out of a collection. IObservable is used when you want elements to be pushed one by one to you. You can think of an IObservable as being a stream of events. And just like you can build queries on top of IEnumerable, using Where and Select, so you can build queries on top of IObservable.
Here I’m using an IObservable as the channel to push back the result of the Web request when it becomes available – you can see that happening in the HandleResponse method, which is the callback that RestRequest calls when it gets a response back from the web server.
Finally – the Algorithm
Finally we get to the implementation of the algorithm itself: and with the underpinnings in place, it turns out to be one big LINQ query:
public IObservable<TimeSpan> DetermineClockSkew() { var timeOffset = (from tick in Observable.Interval(TimeSpan.FromMilliseconds(100)).Take(5) from timeCheck in GetServerTime().Timestamp() let estimatedOneWayLatency = (timeCheck.Timestamp.UtcDateTime - timeCheck.Value.ClientReportedTime). TotalMilliseconds/2 let estimatedTimeAtServer = timeCheck.Value.TimeAtServer + TimeSpan.FromMilliseconds(estimatedOneWayLatency) let predictedClockSkew = estimatedTimeAtServer - timeCheck.Timestamp select new {predictedClockSkew, estimatedOneWayLatency}) .MinBy(p => p.estimatedOneWayLatency) .Select(p => p.predictedClockSkew); return timeOffset; }
Let's step through this line by line:
- Line 1: We start things off by generating a stream of 5 tick events, at 100 millisecond intervals – we’re going to ping the server 5 times, and use the result with the shortest round trip time
- Line 2: Each time we hear a tick we fire off a what’s-the-time request to the server using GetServerTime which we discussed above. The Timestamp() method will stamp each response that we get back from the server with the time at which we received it.
- Line 3: For each response we get back from the server we estimate the one-way latency from server to client by taking half of the round-trip time (when we send a request to the server we send our own time, and the server echoes this back in the ClientReportedTime property of the message)
- Line 4: Now that we have an estimate of how long the message took to get from the server, we can estimate the time at the server at this precise moment.
- Line 5: We can now figure out the difference between the clock on the phone and the server’s clock by comparing the time at which we received the server’s response with our estimate of the server’s time at that moment.
- Line 6: We stash our estimate of the latency, and the estimate of the clock skew into an anonymous type
- Line 7 - 8: We look over all 5 attempts at estimating the clock skew, and we take the one which had the smallest latency. Notice how MinBy returns an IObservable rather than an actual value as it might in good old Linq-to-Objects: it has to be this way, otherwise the whole method would block waiting for all the web requests to complete, rather defeating the our use of asynchronous calls elsewher.
So there you have it: thanks to Christian, the WCF REST framework and the Rx team, a neat and elegant way of determining clock skew between server and phone.
See it in Action
Remember, for a limited time only you can see this in action by downloading my game to your phone or Emulator (for free!) and playing with your friends. Full source code to the whole game is also available.
Finally, judging for the Windows Phone 7 app contest finishes on March 31st, so make sure you check out the entries, and be sure to tell Red Gate what you think of mine!
Monday, 14 March 2011
Developers: try out Simon Squared, my multi-player Windows Phone 7 game, for free
If usage is like oxygen for ideas, then my Windows Phone 7 game, Simon Squared, must be pretty blue in the face right now. It’s not on the Marketplace yet, you see. Sure, nearly 25 people have download the source code. But how many of them will have bothered to compile it? Well, as of now, I’m demolishing your excuses: here is the Xap file - so you developers out there with unlocked phones can deploy the game and try it out.
Remember, the game has a multi-phone multi-player mode: and I’ve pre-configured the Xap file to run against our Windows Azure hosted server. So challenge your office mates! It doesn’t matter where in the world they are.
Let me know what you think – but don’t do it here: write your comments on the Simon Squared competition entry page so Red Gate can see what you think.
A reminder: Deploying Xap files to your phone
Building a project in Visual Studio and having it deployed to your phone is straightforward enough. Deploying a Xap file by itself is not quite so obvious, so here’s a reminder of how it’s done:
- Remember to fire up the Zune software
- Browse to C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.0\Tools\XAP Deployment – drop the (x86) if you’re not on Windows 64-bit
- Load the XapDeploy tool, select Windows Phone 7 Device as the target, browse for the Xap file, then hit deploy.
Thursday, 3 March 2011
Unpacking Simon Squared: My mini framework-independent animation library
Animation is the trick a computer uses to make math come alive. Our minds are wired to see movement. A video game where the characters and props jumped instantly between the positions where the math says they ought to be would be incomprehensible and unplayable. Which explains why I spent a good part of the few precious days I had building Simon Squared on developing a little animation framework.
I’m pretty pleased with the result. It’s by no means polished or complete, but it makes it very easy to implement one-off animations, and to schedule groups of animations together. Best of all, it’s not tied to the XNA framework – you could use it to implement animation in Windows Forms if you so desired!
Fluent Animations
Here’s one example:
_storyboard.Plan() .AfterDelay(TimeSpan.FromSeconds(0.5)) .Begin(b => b.Animate(this, (Shape target, float value) => target.RotationY = value) .From(RotationY) .To(RotationY + MathHelper.Pi) .In(TimeSpan.FromSeconds(MovementAnimationTime)));
This shows off several aspects of the framework.
First, the Storyboard class. This is responsible for keeping track of all the animations that are currently in flight, or scheduled for later on. In my Game’s Update method I call
_storyboard.AdvanceTimeTo(gameTime.TotalGameTime);and that takes care of updating all the animations that are in progress.
The Plan() method returns a StoryboardPlanner which is used to schedule animations using a fluent interface. No prizes for guessing what AfterDelay does: it leaves a gap of what ever duration you specify before starting subsequent animations. These animations are scheduled using the Begin method: you pass it a function which uses the AnimationFactory it supplies to fabricate animations to your exact specifications.
Most important of all is the Animate method. In the definition of the Animate is the secret sauce that makes this animation framework independent of whatever framework it is you’re trying to animate. It works like this:
- you set up an animation, RotationY goes from Pi to Pi/2 in 2 seconds, for example;
- the animation framework calculates values as the animation progresses;
- every time it calculates a new value, it calls the lambda function that you’ve provided, so that you can update the appropriate object with the new value.
The first parameter I’m passing to Animate is the object that has the property I want to animation, RotationY. Then I pass in a lambda function that receives both the target object, and the value that should be assigned to the target property or field1.
How the animations work
When it comes to the actual animations, I’ve abstracted the majority of the animation logic into a couple of base classes, which makes it very easy to add animations for different types.
Here are the critical parts of the Animation base class:
public abstract class Animation { // snip public void UpdateForTime(TimeSpan currentElapsedTime) { var normalisedTime = GetNormalisedTimeInAnimation(currentElapsedTime); if (normalisedTime.HasValue) { SetValueForTime(normalisedTime.Value); } } protected abstract void SetValueForTime(double normalisedTime); protected double? GetNormalisedTimeInAnimation(TimeSpan currentElapsedTime) { var normalisedPosition = 0.0; var millisecondsAfterStart = currentElapsedTime.TotalMilliseconds - StartTime.TotalMilliseconds; if (millisecondsAfterStart < 0) { return null; } else if (millisecondsAfterStart > Duration.TotalMilliseconds && RepeatMode == RepeatMode.None) { return 1; } else { var quotient = millisecondsAfterStart / Duration.TotalMilliseconds; var integerPart = Math.Floor(quotient); normalisedPosition = quotient - integerPart; if (AutoReverse && (integerPart % 2) == 1) { normalisedPosition = 1 - normalisedPosition; } } return normalisedPosition; } }
Start at the top: UpdateForTime is called by the Storyboard on every frame, to inform the animation of the time, and to give it an opportunity to update its target.
The first thing Animation does then is to work out the normalised time – that is a value between 0 and 1 indicating the progress through the animation. If the clock says that we’re bang on the animation’s start time then we return 0; halfway through (however long the animation lasts), and the normalised time is 0.5; and a clock time of StartTime + Duration gets a normalised time of 1. All this is calculated by GetNormalisedTimeInAnimation. Notice from the code how it is also smart enough to handle animations that repeat over and over, and animations that cycle - repeating, but reversing when they get to the end value.
Once the normalised value has been calculated it is passed to SetValueForTime which is an abstract method on the Animation base class.
Next level down in the hierarchy we have SetterInvokingAnimation:
public abstract class SetterInvokingAnimation<TValue, TTarget> : Animation where TTarget : class { public TValue StartValue { get; set; } public TValue EndValue { get; set; } private WeakReference _target; private readonly Action<TTarget, TValue> _setter; public SetterInvokingAnimation(TTarget target, Action<TTarget, TValue> setter) { _setter = setter; _target = new WeakReference(target); } protected override void SetValueForTime(double normalisedTime) { var value = GetValueForNormalisedTime(normalisedTime); var target = _target.Target as TTarget; if (target != null) { _setter(target, value); } } protected abstract TValue GetValueForNormalisedTime(double normalisedTime); }
This is the class that takes care of pushing calculated values to the target - though it doesn't actually calculate any values itself – it leaves that to derived classes, by way of the GetValueForNormalisedTime abstract method.
And here is one of those derived class, FloatAnimation. Since it is descended from some hard-working ancestors, there’s little it has to do – just a simple mathematical interpolation between the StartValue and EndValue of the animation:
public class FloatAnimation<TTarget> : SetterInvokingAnimation<float,TTarget> where TTarget : class { public FloatAnimation(TTarget target, Action<TTarget, float> propertySetter) : base(target, propertySetter) { } protected override float GetValueForNormalisedTime(double normalisedTime) { var delta = EndValue - StartValue; var value = StartValue + delta * normalisedTime; return (float)value; } }
So there you have it: a whistle-stop tour of my mini-animation framework.
See it for yourself
You can see the full source code - in use - in my Simon Squared game up on Codeplex. And if you shout loud enough, I might pull it out of there and stick it in a NuGet for easy consumption in your own games.
Go check it out – and then make sure you tell Red Gate how much you love it, over on my Simon Squared competition entry page!
-
I could have defined Animate like this:
Animate(value => this.RotationY = value);
which would have looked a lot neater. But that has the downside of capturing a reference to my target object in a closure and smuggling it down into the animations which are held by the Storyboard; and since my Storyboard is longer-lived than many of the objects that I’m animating, this would have had the effect of keeping my target objects alive when they would otherwise have been Garbage Collection. So I pass in the target object separately so that I can hold it using a WeakReference, and then I use a lambda function that is, in effect, a static method.Another way, of course, would be to remove animations from the Storyboard explicitly (and it does support that). But I'm lazy, and it's much easier to use this fire-and-forget approach!
Tuesday, 1 March 2011
Want to see inside a Windows Phone 7 game? I’ve opened-sourced Simon Squared
The deed is done: I’ve thrown my hat into the ring. Simon Squared is now officially standing for election as the App developers will love most. Go and vote for it here.
Why does it deserve your vote? Because, not only is it a thoroughly addictive little puzzle game, with a multi-phone-multi-player mode that will have you coming back for more, but I’ve just released the source code! It’s all there on CodePlex, released under the GPL v2 license. Build it, try it out, and let me know what you think.
Over the next little while I’m intending to publish some posts highlighting the points of interest in the source code. In the meantime:
- Take a look at my mini animation framework, under Flatlings/Flatlings/Animation – I’m quite fond of that fluent interface
- See how I implemented Christian’s algorithm using the Reactive Framework: Flatlings/Flatlings/GameServerClient.cs – DetermineClockSkew()
- Discover how easy it is to fix the WCF HTTP CTP so that it uses the DataContractSerializer: FlatlingsServer/Infrastructure/ DataContractXmlProcessor.cs
If you visit my blog, you’ll find a new page dedicated to Simon Squared. I’ll be updating that as I blog about the source code; and I’ve also indexed all the posts I made during development – bookmark it, because I’m sure you’ll want to go back and re-live those hectic days!
It only remains for me to thank everyone who has spurred me on over the last few months with comments, tweets and links, and to remind you all to go and exercise your democratic right.
Friday, 25 February 2011
Simon Squared – We have Multi-player: Days 4, 5 and (ahem!) 6
OK. So you let me have one more day, and I took 3. But I got it working. After 6 days of work, I can show you Simon Squared in all its Windows Azure powered multi-player glory:
So what took me so long? Surely after getting the Windows Phone 7 emulator to talk to the Windows Azure emulator, finding a UI library for XNA and enabling multiple instances of the WP7 emulator to run at once, everything else should have been easy? If only!
Here’s what happened.
Day 4
9:00 Start by setting up a Windows Azure subscription, making use of my MSDN subscription benefits: it's pretty generous: 750 hours/month of Compute Time, 10 GB storage, 7/14 GB traffic in/out.
I get a little worried when the sign up screen tells me that I'll receive an activation email "within 24 hours" - but I'm relieved to see that within a couple of minutes of being redirected to the Azure management console (very swish Silverlight app) my subscription appears, and I can start creating deployments.
10:11 Got side-tracked into a discussion with my boss about possibilities for future products and offerings based on the work we've been doing here
12:45 Implemented the phone side behaviour for running the count down to the games beginning. Making heavy use of the Reactive Framework (which comes built into WP7) for hiding away the messiness of asynchronous calls.
13:45 Problem with WCF REST: if I return a derived type of message from my operation, the client only receives the properties defined on the base type. This is the problem that the KnownType attribute solves elsewhere in WCF, but it doesn’t seem to be working for WCF REST.
15:22 Discovered that WCF REST uses XmlSerializer by default rather than DataContractSerializer - so KnownTypes woudn't work. Also discovered that RestSharp is using XmlSerializer when sending data to the server, so not serializing inherited types in the way that DCS is expecting.
15:39 Now got inherited message types passing correctly: WCF Rest and RestSharp are both pretty pluggable, so I was able to implement a custom ISerializer in RestSharp, and a custom MediaTypeProcessor in WCF Rest, both using DataContractSerializer instead of XmlSerializer
17:30 Caught out by Http response caching. The symptom was that I’d launch a fresh HttpWebRequest, but get back stale data. Investigation showed that the requests weren’t ever leaving the phone – it never showed up in Fiddler. I spent ages prodding my Reactive Framework query, convinced that it wasn’t issuing the requests properly. Then I remembered Http Caching. In my haste, and newbie-ness, I solved the problem by putting a NoCache on all the responses on the server side. A better way would probably have been to set the WebRequest.CachePolicy.
Day 5
09:00 Thought occurs to me that I might get on faster if I don't have to keep waiting for the Azure Emulator to start up and shut down every time I build my server. Why not just run my server project directly in IIS? I try it – and WCF Http stops working. I eventually discover that the CTP bits I’m using don’t yet support HTTPS, and I had a HTTPs binding configured on my default Website in IIS.
10:30 Fortunately Cassini works - why did it take me an hour and half to discover that!
10:43 Start work on refactoring puzzle generation, so I can do it on the server side. The goal is that the server will generate rounds of 5 puzzles, and send them out to all the players in advance. Within a round, the server will send out a message saying “start puzzle X at Time T” – and thus synchronize the experience of each of the players
12:00 Working on updating the Phone side to play the puzzles that server sends out.
13:16 Finished refactoring the Game screen so that it is backed by a GameController - allowing me to implement a SinglePlayerGameController and MultiPlayerGameController.
17:20 Got some simple state machines working on the client and server. It looks something like this:
17:40 With two instances of the emulator running, I can now see the same puzzles displayed on each. The problem is, they’re horribly out of sync – player 1 might get the puzzle two seconds ahead of player 2, which for small puzzles means he’s certain to win!
Day 6
09:21 Implemented Christian’s algorithm to estimate the clock skew between server and phone. The implementation is pretty straight-forward using the Reactive Framework, and quite elegant, if I do say so myself. Remind me to show you, sometime.
10:33 Couldn’t figure out why changes I was making in the code weren’t having any effect when I ran the game. Then discovered that Visual Studio had some how set itself to “Never Build on Run”.
12:00 It’s working! Multiple players now receive the puzzles beautifully in sync, one after another. As soon as one player completes a puzzle, it vanishes from all the other players screens, and the count-down to the next puzzle begins
13:20 Implemented a scoreboard to show the position at the end of each round
14:30 Having deployed the game to my phone, I challenge Vinod to a dual – me on the emulator, him on the phone. I now discover a serious downside to being a games developer: once a game reaches playability, you inevitably get sucked into playing when you should just be testing.
15:35 Use Expression Design 4 to recreate a game logo that Neil designed using Word. What do you think?
17:05 Spitting and polishing. Tidying up the various screens. I might not have time to make them pretty, but at least I can make the buttons big enough to touch. That’s the downside of testing with an emulator using a mouse – it doesn’t alert you to the imprecision of fat fingers!
17:30 Waiting for Windows Azure to deploy the server. Visual Studio 2010 is supposed to be able to package and deploy your project straight into the cloud, but I couldn’t get that to work (something about it not being able to resolve the URL of my storage account). Instead, I uploaded the package manually.
17:45 Still waiting for Windows Azure to start up my role instance. Give up and go home.
21:00 Wife gives me permission to interrupt our traditional Thursday evening film (The Prestige last night, – recommended) to see whether the Azure role has started up yet. It hasn’t, so in the time-honoured way I tell it to reboot – and that fixes it. A few minutes later, she’s thrashing me – mainly because she’s using the phone, and I’m using the emulator over Remote Desktop (my laptop is old, and doesn’t support XNA games in the emulator) – in that setup the emulator doesn’t respond to my mouse moves!
What I need is another phone.
Ah, what’s this I see – the Windows Phone Marketplace Developer Newsletter, announcing Windows Phone 7 Handsets for Developers. The Newsletter says that local evangelists have codes for free phones to give away. I think Mike Ormond is the WP7 evangelist for the UK …
Friday, 11 February 2011
Multi-player enabling my Windows Phone 7 game: Day 3 – The Server Side
I’m building a game to enter in Red Gate’s Windows Phone 7 App competition. I built the core of the game in 3 days from a standing start. Now I’ve challenged myself to make the game multi-player in 3 days, using Windows Azure for the server side. Day 1 was spent getting up to speed with Windows Azure and networking on WP7. On Day 2 I got the UI sketched out. Here’s Day 3:
8:30 Begin the day with excellent news. With barely any badgering at all Red Badger have kindly offered me an non-expiring build of their XPF UI library for XNA. Thanks chaps!
And thanks to everyone who's shown support by tweeting the last couple of blog posts. I can't tell you how motivating it is as I set to work again this morning.
8:45 Microsoft have released the January 2011 Update to the Windows Phone Developer Tools (on the 4th of February mind, but I'll let that pass). This is the one that brings the promised Copy-Paste support and some performance updates. Being the good boy I am, I install it before beginning anything else.
9:32 Staring work on the server. I've never designed anything RESTful before, so I've taken a quick look at a couple of articles: one at quite a high level, and one in a little more detail. A logical place to begin is starting a game. So what I think I need to do is define a /Game resource on my server, and make it respond to POST requests.
11:45 Hooked up AutoFac on the server so that I can inject dependencies into my REST services.
12:00 A good chunk of the day gone, and I still haven't implemented starting a game. WCF isn't playing nice at the moment: I can't get it to respond to the POST request I'm making to my Service.
12:01 Writing the above fixed the problem! Well, not quite. As soon as I had written that, I thought of fiddling with the UriTemplate on the WebInvoke attribute. Since I was posting a request to the /Games resource, and I had registered my Games service using routes.AddServiceRoute<GamesService>("Games", serviceConfiguration) I thought I could get away without specifying a value for UriTemplate on WebInvoke. Turned out I needed to specify "/"!
12:05 Next: list all available games, so that a player can choose one to join.
12:45 Done! I can now create several games through the Start a Game screen, and see them all listed on the Join a Game screen.
16:15 The afternoon passes in a blur. I’ve added several operations to my service, so that the basic game setup screens are working. This is what I’ve got on the server side:
Resource | Http Method | Meaning |
/Games | POST | Start a Game |
/Games | GET | List existing games |
/Games/{id}/Players | POST | Join a game |
/Games/{id}/Players | GET | List players belonging to a game |
Notice any conspicuous absences? That’s right: there are no operations to support actually playing a game. Where has the time gone? But before I can move on, I should at least check that this service works if multiple devices connect to it.
16:25 Fustrated: the Microsoft Windows Phone 7 emulator is single-instance. How can I test a multi-player game if I can only run one copy of it?! I’ve got to find a way round this.
17:30 Eureka! After a journey deep into the bowels of the Microsoft.SmartDevice.Connectivity API and its associated XML datastore I’ve found a way to have multiple instances of the emulator running at once, and even debug them simultaneously.
Hey! Hang on just a minute: there’s already a post on my blog about that – is someone with a time machine playing around with me here?
But never mind that. My 3 days are up, and all I’ve got to show for it are the game sign-up screens. So where do we go from here? Well, I’m going to make my excuses and plead for an extra day – just one more day, and I’m sure I can get it working!
My excuses:
- It took me ages to get the Windows Phone 7 emulator talking to the Windows Azure emulator: the good folks at Microsoft haven’t connected the dots here.
- A good two hours or more of my first day was taken up with the hunt for a working UI library for XNA. Thanks to Red Badger for saving me further frustrating hours.
- Running multiple instances of the emulator really shouldn’t be that hard.
So what do you think? Can I have another day?