Saturday, 09 August 2008 at 21:14 - Blog
My good buddy John just published a typically navel-gazing post detailing the contents of his wallet, and went on to invite readers to divulge details of their own billfolds in what I can only presume is some cunning and evil plan for mass identity-theft :-)
Well, as I said in the comments to John's post, I was surprised at the quantity of sentimental knick-knacks and memorabilia he has in there, compared to the rather prosaic and functional contents of my own wallet.
The wallet itself is a simple black leather one from Burberry, and tonight contains the following:
- £90. In case you were thinking of mugging me, you should know that I don't usually carry nearly so much.
- A bunch of receipts from the week. Come tomorrow evening the details will all have been religiously input into MS Money, and the receipts shredded.
- Four first-class stamps.
- A Starbucks card - essential for those occasional lunches with John :-)
- Three credit cards, one from each of the major providers. You can never be sure which will be accepted, and the occasional system failure or over-zealous anti-fraud software has resulted in me having to offer all three before a transaction could be processed.
- A debit card, which I mostly use this for taking cash out of ATMs. I don't see the point in using it for payments if I can help it, preferring to get the interest-free period and insurance that comes from using a credit card instead.
- My Microsoft Certified Professional card. I'm not sure what the point of carrying this is - maybe I won't put it back!
- A "Club Toyota" membership card. I don't really get the point of this one, either.
- A membership card for my local gym. This whole gym-going malarkey is a relatively new thing for me, and I'm grateful to my wifey for persuading me to join, as I feel much fitter for getting a bit of exercise a few times a week. I think having kids is a big incentive to start taking care of yourself, as you want to stick around as long as possible to share their lives.
- A Costco trade membership card. One of the nice perks of being a company director is being able to go to Costco and buy 45 toilet rolls and a gallon of Tabasco whenever I fancy!
- National Trust membership card. We find ourselves wandering round stately piles quite often, in an effort to Bentertain the one year old.
- Driving license.
- North Yorkshire County Libraries card. Libraries gave us power!
- "Loyalty" cards from Boots, Shell, WHSmith, Coop, Tesco and Nectar. I'm not very loyal, but I don't look a gift horse in the mouth.
And that's your lot. Not very interesting really, eh?
Monday, 04 August 2008 at 08:18 - Blog
'tis an odd world in which an unpublicised snapshot of some sand which I absent-mindedly took on a New South Wales beach in January 2003 can gradually become the seventh most-viewed item in my Flickr Photostream.

Friday, 01 August 2008 at 17:20 - Blog
It occurred to me recently that I'm not getting any younger, and that sitting hunched over a keyboard for a dozen hours a day will probably lead to some form of RSI sooner or later. So I started looking for ways to improve my daily working environment.
Unlike John, I can't afford a Herman Miller chair, and even if I could, I'm a freelancer rather than a telecommuter* so I would have to regularly carry the chair on the train to client sites, where they would probably ostracise me for being a weirdo who brings his own chair to the office. So I looked for something a little more portable, and decided that perhaps it was finally time for me to try one of those fancy split ergonomic keyboards that I've always scoffed at. After reading a few review on Amazon, I plumped for the Microsoft Natural Ergonomic Keyboard 4000.
I should probably mention at this point that I've never been formally taught to type, and I don't touch-type in the traditional way, with fingers sticking loyally around the ASDF JKL: keys. I've been more of an autodidact, typing quickly but inefficiently, a few finger dancing crazily around the keys whilst the others (notably my pinkies) float lazily in the air, dreaming of the time they were once called upon to pull a wishbone or contribute to a clenched fist.
This means that initially, I found adjusting to the layout of the ergonomic keyboard quite tough - I was slowed down, and had to relearn the relative positions of the keys. For a week or so, I only used the new keyboard at home, as it would have been too slow and frustrating for workaday use. But gradually I grew accustomed to it, and found that I appreciated being able to rest my palms on the wrist-rest, with fingers dropping down towards the keys courtesy of the reverse slope.
So, I took a further plunge, and bought a second keyboard to take to the office. A few months more have passed, and now I can't imagine using anything else on a daily basis. It really is more comfortable, and my shoulders and arms feel considerably more relaxed. I'm also back up to the kind of wpm that achieved on a standard keyboard.
Other than the ergonomic design, the 4000 series boasts a few other features, some of which may appeal, depending on the kind of applications you frequently use:
Notably, all the function keys have been relabelled with additional functionality such as Undo, Redo, New, Open, Close, Spell, Save and Print. Depending on your mentality you will either find this incredibly useful or incredibly annoying (if you're in the latter camp then you'll be pleased to know that ordinary service can be resumed thanks to an "F Lock" key.
I am fond of the button which launches Calculator (one of my most often-launched applications), as well as the buttons to control volume and pause media player (which works fine with iTunes 7).
I also appreciate the additional four buttons above the numeric keypad - putting an extra equals, parentheses and backspace where you'll find them most useful when working with a spreadsheet or similar
There are also buttons to launch a web browser, email application, navigate to a search engine, open favourites, navigate back and forth, a zoom control, and five customisable buttons - but to be honest I haven't made use of any of these. YMMV.
So, in summary - having got past those difficult early "getting to know you" dates, I now foresee a long and happy relationship with the 4000 series. And I'm sure my shoulders will be happy to hear that.
* does anybody say "telecommuter" these days? It sounds very 1996...
Friday, 01 August 2008 at 15:52 - Blog
Childless people who blatantly park in the parent and child spaces:

Ooh, it makes me mad. This convertible was lucky that our Ben didn't need to "go", as I was sorely tempted to leave them one of his nappies as a present!
Perhaps if you don't have kids you don't realise what a huge benefit these spaces are to parents, enabling them to extract their little darlings from car seats without accidentally knocking the door into the car in the next space. Being closer to the store is nice (reducing the risk of the kids getting mowed down en route) but of less benefit to be honest - and in the case captured on camera above, there were plenty of normal spaces closer to the entrance, so I really don't know what this guy was thinking. Most likely he wasn't thinking at all.
Oh, and to those parents who continue parking in the P&C spaces by virtue of having a fourteen year-old kid in the car - c'mon, give me a break!
Friday, 01 August 2008 at 09:19 - Blog
A few days ago I blogged about how neat it was that when I browsed the BBC News via a GPRS/HSDPA connection, the JPEGs were all magically degraded to cause them to load quicker.
Had I stopped to think about this for a while I would have realised that it was not specific to that one site, nor could it have feasibly been implemented by the Beeb. The functionality is inserted by Vodafone, my mobile carrier, and affects all JPEGs (it just so happened that BBC News is one of the sites I often visit when out and about, and it was obvious that the usually high-quality photographs were being degraded).
Investigating a bit more, what's really neat is that the JPEGs have had their ALT tags modified, to point out that hitting Shift-R when hovering over an image will the original version to be asynchronously loaded:
After hitting Shift-R, Harriet and Gordon are considerably less "furry":
I really should have just Googled this a week ago!
http://www.google.co.uk/search?q=vodafone+image+compression
Wednesday, 30 July 2008 at 07:15 - Blog
Some thoughts that occurred to me during, or following, a week's holiday in Cornwall:
- Cornwall is a long way from Leeds, especially with a toddler in the car. Stopping over half way was a good idea.
- Driving from Leeds to Bristol on a Friday night can cause a man to develop up a mighty craving for whisky.
- There is no booze to be found at the Days Inn at the M5 J19 Gordano services.
- Nor at the nearby petrol station.
- Holidaying with a 12 month-old is a totally different experience to holidaying as a couple.
- In years to come, when The Boy reflects on the newspaper covers from the day of his first birthday, he'll either think "Wow, doesn't Obama look young!?" or "Who the hell is that guy?"
- Seeing the number of cute young ladies in Newquay makes me begin to question why I spent so much of my twenties holidaying in bothies in the remotest regions of the Scottish Highlands.
- At £8.50 for approximately 20 minutes' entertainment, the Blue Reef Aquarium in Newquay is pretty poor value. Fish fans and animal lovers get a better deal at the Scarborough Sea Life Centre, The Deep in Hull, Monterrey Bay Aquarium, the Haus des Meeres in Vienna, or even just Tropical World in dear old Leeds. Yeah, we sure visit the occasional animal house!
- Listening to the same CD of nursery rhymes too many times in succession can do strange things to the mind.
- KenKen appeals to my mindset much more than Sudoku ever did.
- Ben Elton's latest paperback, Blind Faith, is a good read - especially for those of us who spend too much time exposing ourselves on the interweb.
- A SatNav really comes into its own when holidaying in an unfamiliar area...
- ...but having updated maps loaded would have made it even more useful.
- Pervasive GPRS is great, but finding an HSDPA connection is better.
- Brocks Barn is a small but perfectly-formed barn conversion with all mod cons - highly recommended for couples or small families such as ours.
- Getting back into a work mentality after a relaxing week away is tough.
Wednesday, 30 July 2008 at 07:07 - Blog
I got home from work the other night and the wife said "Hey, Ian - watch this!" before proceeding to bash herself around the head with a bottle of wine.
"This," I thought to myself, "must be a side-effect of staying home with a toddler all day," as I began to consider how I would cope after she were inevitably sectioned.
But just as I was about to pick up the phone and call the nuthouse, I realised that the bottle was in fact plastic.
It turns out that those clever folk at Wolf Blass have begun shipping their "Green Label" plonk in lightweight recyclable PET bottles, to reduce shipping costs. Whatever next? I'd only just gotten used to screwtops.
Tuesday, 29 July 2008 at 17:20 - Blog
Tobin blogged earlier this week about how quality ORM tools like NHibernate make it easier to code to normalized schemas.
Here's a corollary for you: The use of ORM tools doesn't absolve the need to maintain good database design principles, and even NHibernate won't save you from your own stupidity.
Following an application upgrade release last night, I've spent a disproportionate amount of today trying to debug the following exception, which appeared to originate in an area of the codebase which I personally had heavily modified:
NHibernate.HibernateException: More than one row with the given identifier was found: 42806, for class: Cmec.Core.Domain.Customer
at NHibernate.Loader.Entity.AbstractEntityLoader.Load(ISessionImplementor session, Object id, Object optionalObject, Object optionalId)
at NHibernate.Loader.Entity.AbstractEntityLoader.Load(Object id, Object optionalObject, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Load(Object id, Object optionalObject, LockMode lockMode, ISessionImplementor session)
at NHibernate.Impl.SessionImpl.DoLoad(Type theClass, Object id, Object optionalObject, LockMode lockMode, Boolean checkDeleted)
at NHibernate.Impl.SessionImpl.DoLoadByClass(Type clazz, Object id, Boolean checkDeleted, Boolean allowProxyCreation)
at NHibernate.Impl.SessionImpl.InternalLoad(Type clazz, Object id, Boolean eager, Boolean isNullable)
at NHibernate.Type.EntityType.ResolveIdentifier(Object id, ISessionImplementor session, Object owner)
at NHibernate.Impl.SessionImpl.InitializeEntity(Object obj)
at NHibernate.Loader.Loader.InitializeEntitiesAndCollections(IList hydratedObjects, Object resultSetId, ISessionImplementor session)
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet querySpaces, IType[] resultTypes)
at NHibernate.Hql.Classic.QueryTranslator.List(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Impl.SessionImpl.Find(String query, QueryParameters parameters, IList results)
at NHibernate.Impl.SessionImpl.Find[T](String query, QueryParameters parameters)
at NHibernate.Impl.QueryImpl.List[T]()
at Ventura.NHibernate.Data.DaoBase`2.GetByHql(String hql, String[] _params)
at Cmec.Data.CorrespondenceRequestDao.GetCorrespondenceExtractRequests()
at Cmec.Core.Tasks.CorrespondenceExtractCreationTask.TaskProcess()
at Cmec.Core.Tasks.BaseTask.PerformTask()
at CmecService.CmecService._timer_Tick(Object state)
Got that? NHibernate is telling me that it has found two customers on the database with the same surrogate primary key, which is obviously not the case.
Trusting NHibernate as I do, and not generally being the kind of coder who assumes that the technology is to blame, I then spent literally hours digging through my amended code, trying to figure out what nonsense I could be trying to pull that was confusing NHibernate so, but found nothing.
Too late in the day, I dusted down Occam's trusty razor, and realised that whilst the main Customers table was correctly enforcing primary keys, I hadn't checked the various child tables. Lo and behold, less than a minute later I found the following reference data in an innocuous looking table of referrers:
Removing the duplicated entry for "Other", which was incorrectly using the same ID as "Website", solved my problems instantly. And needless to say, I've made a note to go add a primary key to that table at the earliest opportunity.
The moral of this cautionary tale - using an ORM makes your life as an application developer easier, makes it faster to develop a DAL, and (to a large extent) decouples your application from your choice of database. What it doesn't do is allow you to forget the tenets of good database design, in fact as Tobin points out it actually serves to encourage them.
Thursday, 24 July 2008 at 10:28 - Blog
Further to my previous post about the problems of occasionally having limited connectivity:
One site that seems to deal with this brilliantly is BBC News, which serves up degraded JPEG images when I'm connected via GPRS. How do they know? Or is this functionality implemented by Vodafone's proxy?
Either way, it's very clever and much appreciated.
Thursday, 24 July 2008 at 10:08 - Blog
When my business laptop connects to the internet, the following events occur:
- Windows checks for updates and automatically begins downloading any important ones.
- Firefox checks for updates for itself and any installed extensions.
- FoxMarks synchronises my bookmarks.
- Google Talk connects, and checks for any new emails.
- AVG checks for anti-virus updates.
- Windows Defender checks for spyware updates.
- Adobe Updater checks for updates to installed Adobe products.
- Daemon Tools checks for updates for itself.
There are probably more, but you get the idea. Generally, this is a wonderful thing, but not when I happen to be sitting in my car in Cornwall, connecting to the internet via a GPRS connection, and simply trying to check my bank balance. The traffic from all of the above automated events makes this simple task take ages. I wish there were some kind of system-wide setting so that I could prohibit such events occurring if connection speed was below a certain level. Any ideas?