<body><script type="text/javascript"> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener('load', function(){ object[attribute] = val; }, false); } else { window.attachEvent('onload', function(){ object[attribute] = val; }); } } </script> <div id="navbar-iframe-container"></div> <script type="text/javascript" src="https://apis.google.com/js/platform.js"></script> <script type="text/javascript"> gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: 'https://www.blogger.com/navbar.g?targetBlogID\x3d35019691\x26blogName\x3dCinnamon+patrol\x26publishMode\x3dPUBLISH_MODE_BLOGSPOT\x26navbarType\x3dBLUE\x26layoutType\x3dCLASSIC\x26searchRoot\x3dhttps://cinnamonpatrol.blogspot.com/search\x26blogLocale\x3den_US\x26v\x3d2\x26homepageUrl\x3dhttp://cinnamonpatrol.blogspot.com/\x26vt\x3d-8713189439990806071', where: document.getElementById("navbar-iframe-container"), id: "navbar-iframe", messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER, messageHandlers: { 'blogger-ping': function() {} } }); } }); </script>

Cinnamon patrol

Mr and Mrs Lili Wedding

 

Sun and Software

Today summer came to Dublin. I didn't use my jacket in either of my two walks to/from home. It was actually warm, legitimately warm. Almost hot. (I had to snigger yesterday when I read an article in the newspaper about students, who are all taking there exams at the moment, "sweltering" in 23 degree heat. 23 is warm. 33 is hot. 43 is sweltering!).

Also (warning, another work-related post!) I've had one of the most satisfying work weeks ever. The project I've been working on was going to be web-based, but based somewhat (a lot I think) on my direction, we've gone for a Windows-based smartclient. Being freed from the confines of a browser is liberating enough (yes there's AJAX, but one is still pissing in the wind), but we've taken it to a new level:

We're using Infragistics controls to add loveliness. They're worth it alone for the WinSchedule control which gives an Outlook-style calendar and a lot of precanned functionality. Using these controls we managed to get a very snazzy prototype up and running in no time.

More excitingly we're trailing a very mature framework that gives us ORM, caching and everything you need for an enterprise-grade disconnected client. Working with ORM is like having all your vegetarian) curries in one go. I can't imagine life without it, and I've really only been using it for a few days.

Added to this, I've somewhat accidentally stumbled across at least 2 excellent development patterns. The first was to use UserControls. This has allowed us each to work on different parts of the application, then to assemble them dynamically at run-time (or design-time). The second, is... well I think it is... the observer pattern in tandem with MVC. Everything is event based. There's a ConnectionStateChanged event, a SearchStarted event, a SearchCompleted event and so on. This, along with anonymous delegates, makes the code very easy and straight forward to write - and it is very loosely coupled. You have no idea how satisfying it is to fire and event from your data access layer and have stuff just happen: progress bars burst into life, search results display themselves, and so on.

The net effect is, that in 4 days, we have gone from a prototype with no data at all to an application which monitors its connection status, fetches data and caches it, satisfies queries from its cache, or goes to the data source if required, prunes its cache (to limit sensitive data) and then persists it to disk, and so on.

And the pièce de résistance was running this over a 3G connection on a laptop.
And it works!!! Dodgy 3G connection and all.

 

for this post

Leave a Reply