Primordial Radio Data Usage

Reading Time: 3 minutes

The question of how much data allowance Primordial Radio uses has been asked a few times.

The simple answer is about 30 megabytes per hour, which means 1Gb of data will last you about 33 hours.

If you’re interested, the not so simple answer goes as follows.

Primordial are cunning, they use a 63KBit AAC stream. The bit rate is, quite literally, how much data per second the stream uses. The higher the bit rate, the higher the quality of audio that can be squeezed in. It’s a trade-off between data and quality. But there’s another factor – the technique used to encode the audio.

If Primordial used a 63Kbit MP3 stream it would sound dismal, because MP3 is actually a pretty old and inefficient audio encoding technique. Because they use AAC, they can get away with a much lower bit rate, which keeps the amount of data you need to use to listen to Primordial low and the quality acceptable.

BBC Radio 3, in comparison, have a 320Kbit AAC stream (amongst others). You can get your Classical Music fix in super-high quality, but it will munch 150 megabytes per hour.

Now, the relationship between the bit rate and the amount of data it uses isn’t entirely straightforward. In data transmission we tend to talk about bits per second and when we talk about data allowances they’re in bytes, or more likely Gigabytes.

Your broadband connection, for instance, is almost certainly specified in Megabits per second. Long story short, the reason is that the bit is the smallest thing that can be sent, so it’s most accurate to talk about the speed of a connection as bits per second.

A byte is almost always 8 bits, but some types of communication use extra bits to regulate the transmission, so it’s not always a straight 8 from bits per second to bytes. It’s close enough for a ready-reckoner though:

63 / 8 = 8 (roughly)

We need 8 kilobytes of data for one second of audio. We can then easily multiply that up.

8 *60 = 480Kbytes per minute

480 * 60 = 28800Kbytes per hour

A megabyte is 1024 kilobytes, so:

28800 / 1024 = 28Mbytes (per hour)

This, however, is always going to be optimistically low. Firstly there is the problem of the envelope. Data over The Internet is sent in billions of packets. You can think of each packet like a… um… packet. You can’t just lob a bottle of Hendricks in the postbox and expect it to get anything other than drunk by the postie. You need to wrap it up in something, put an address on it and pay postage if you want someone to actually receive it. There are similar overheads on the The Internet.

There are various different systems in use, often there are several layers of content and packets. This means that there is a lot more traffic on The Internet than just the useful data.

There is also the problem of packet loss. A small amount of data on The Internet just disappears. This is actually expected, it was designed that way because it’s easier and more resilient. What it does mean however is that a small amount of data has to be sent twice.

You can pretty much account for all this by simply adding a fudge factor. 20% is usually considered a safe margin. If we take our theoretical figure from earlier:

28 * 1.2 = 33.6MBytes per hour.

This, of course, is an estimate based on a bit of theory and some practical experience. If you don’t trust these kinds of calculations, you could just look at the speed on your router’s data rate table.

If you wanted a bit more accuracy though, you could listen to Primordial for, say, 1/4 hour, record the amount of data every packet contained and the overall length of the packet, then add them all up.

You’d have to be a right geek to do that though.

The total data received was 8150537 bytes, of which 7247617 was useful content. Those can pretty easily be multiplied up to an hour:

Total audio and related data: 27.65 megabytes per hour.

Total data exchanged: 31.1 megabytes per hour.

Naturally I can’t guarantee these figures absolutely. They’re over Wi-Fi rather than a mobile network and there will be differences. There will also be differences between different networks and even different times of day as The Internet itself changes and adapts to the traffic.

What I can say is that they should be somewhere near, within a few percent.

The Healthy Business Traveller’s Survival Guide

Reading Time: 6 minutes
Disappointing hotel room

Tonight’s bed is in a characterless chain hotel just off the M1. Like every business hotel, the bar is stuffed full of regretful corporate peons in cheap suits. It’s a club that’s far too easy to join. At first you’re only away for the odd night, so it doesn’t matter if you have a burger and a couple of pints.

It creeps up on you though, a few nights here and a few nights there and suddenly you buy and Audi A4, can’t see your feet when you’re standing up and find yourself discussing house prices with a Regional Business Development Manager from Nuneaton.

“It’s really hard to keep up the diet when you’re on the road” I hear time and time again from the person loading their plate with fried sausages and hash browns. They look down at the bowl of muesli and fruit I’m holding then briefly catch my eye again before they awkwardly shuffle off to join a table of 3 others, all with plates piled high, all wearing the same expression.

It’s not about the diet though, it’s about the choice of lifestyle: they’ve subscribed to the road warrior lifestyle; “You’ve got to play the game, Tom, you’ve got to play the game” one of them once told me. He never could tell me why.

You can join that world if you want to. It’s kind of cool for a while, but it starts getting old very, very quickly. You don’t have to join that world. You don’t have to play that game.

Here then are my tips for not getting sucked into that cycle of drudgery.

Eliminate Unnecessary Travel


Rule 1: if you don’t need to travel, don’t travel.

The face-to-face meeting is still the default for an awful lot of people. If there’s any doubt about anything then they want to get all the people in a room and talk about it. It’s a reflex, often no more than arse-covering, but it often results in a lot of people wasting a lot of time.

Of course there are occasions when it’s the right thing to do and it’s right that you should be there. Otherwise however it’s better for both you and the business if they conference you in only for the bit where you’re actually needed.

The key point is that travel is often not the most efficient use of business resources, it’s just an assumption that you – or someone – should go. Question that: if it’s not the best use of resources put the case for why.

Choose The Right Hotel

There are many employers that give you some flexibility about the hotel you book. In which case always book a hotel with a free gym and free breakfast.

Being away on business is a good opportunity to visit the gym. Not only that but being away from home is stressful and exercise is proven to combat stress and anxiety. Remember to pack your gym kit though eh? And a water bottle is useful too.

In the morning, always choose the healthy breakfast option. Start how you mean to go on. This is where the free breakfast comes in: many hotel chains lower their room rate but don’t include breakfast, You book them thinking you’re getting a bargain and then find they’re charging £18 for breakfast. Even though you’re not paying, the idea of shelling out 18 notes for a bowl of muesli and banana irks, so if you’re not careful you head for the buffet and have a Full English.

Don’t do it. Book the more expensive hotel and have the muesli and banana.

Whilst we’re on the subject of hotels, pay attention to the distance the hotel is from the place you’re visiting. The cost to the business of having you stuck in traffic for an hour is £50 as an absolute minimum. It could be many times that. Saving £10 to spend and extra 1/2 hour in traffic isn’t worth it. I’ve justified trampling on various hotel booking policies many times this way.

Supermarkets Are Your Friends

Get control of your food. Buffet lunches these days are better than they used to be, but be careful. Work out how much you usually eat for lunch and don’t got over that. If it feels socially awkward not to have food, grab a glass of water.

Similarly if there’s a canteen, don’t get sucked into having 2 main meals that day.

If lunch isn’t laid on, make sure you bring some. Otherwise it’ll end up with someone doing a run to Joe’s cafe at 2pm for a large sausage and meatball butty.

There are some pretty good petrol stations these days with mini supermarkets in. They often have good healthy meal options. Either make your own lunch or buy your lunch in advance.

Keep some travel cutlery into your day bag. That vastly increases the amount of food you can eat.

When it comes to dinner, some hotels have good options and if you’re staying in an urban centre there can be good options there, too.

Otherwise buy some cold food from – you’ve guessed it – a supermarket. Then you can make sure that you have a balanced intake with the right amount of calories.
If you’re really inventive there are actually quite a few cooking options in a hotel room, you can do a lot more than Pot Noodle.

Don’t forget drink. I don’t usually drink as much liquid when I’m away, so I’ll buy at least a litre of flavoured water per night.

Whilst we’re here, stay away from the extra-large chai latte, from fizzy drinks and especially from energy drinks. This isn’t just a travel tip, it’s a life tip. They put you on a roller-coaster that you really don’t need to be on.

Plan Your Evenings

You’re in a disappointing room near a disappointing town in a disappointing hotel commanding disappointing views of a disappointing motorway. This is a really good time to sort out your car insurance and catch up on a couple of episodes of that TV series that you love but which your partner hates.

This requires forethought however. You need (copies of) the documents or access to them online.

Never rely on hotel WiFi. Sometimes it works brilliantly, other times you can barely get to Google. Make sure you have anything you want to watch or any substantial document on a device you have with you.

Pack a HDMI cable if you carry a laptop. Most hotel TVs have a HDMI input that you can use, whether they advertise it or not.

If you rely on a mobile device then pack a Chromecast or similar, you can put it into guest mode and stream to the room’s TV.

Plan Driving Breaks

Live traffic Sat-Navs and automated reminder services are pretty good at estimating how long it will take you to get somewhere. That time doesn’t include breaks. Driving requires concentration and that means you need breaks. It’s is, quite literally, for your health and safety.

Don’t mess with your meal times too much and, especially, never miss a meal. If you usually eat at 12:30 then try to make a break fit in around that time and have a bite. Again, stay away from burger chains and greasy spoons. There are plenty of healthy, tasty food options in service stations these days.

Keep a Travel Bag

One of the really annoying things about travelling is the continual packing. It helps if you have a spare set of toiletries in a bag that you can just throw in and know that you don’t have to worry about deodorant, toothbrush, etc.

It’s not just toiletries either, there are a few other things:

Buy a warm high-vis jacket and keep it in the boot. Your car is lovely and warm when it’s working, but the engine management unit has a problem with its lifestyle it can get very cold very quickly. A warm hi-vis jacket kills 2 birds with 1 stone. I got mine – and in fact most of my safety equipment – from Arco (and no, they’re not a sponsor).

Include a USB extension cable. These are surprisingly useful, not in the least because hotels have a funny habit of putting the electrical sockets as far away from the bed as possible. Your phone however you generally want to both charge and use as an alarm.

A mobile phone power bank is another good investment. You might think you’ll be near a socket all day and all night, but if you get stuck in meetings then get a particularly unfortunate room, it can get dicey.

Finally, Look After Yourself

Above all remember that you and your health are the most important things. Don’t compromise that. You don’t have to get sucked into the business travel lifestyle.

It is a profoundly unhealthy lifestyle and this is worth remembering not just for your own sake but for that of your employer. There’s a reason many employers offer private health schemes, gym memberships and other health related benefits. It’s an investment on their part, because healthy people work more effectively and more efficiently.

It’s good business sense for your employer to let – even encourage – you to keep yourself healthy.

Moreover it’s an investment by you. You only have one life and if you compromise your health now you will pay for it later, financially, physically and emotionally. When it comes down to it, it’s as simple as that.

Emergency Calls, Locations and 55: The Truth

Reading Time: 3 minutes

You may well have seen this meme going around Facebook and other places. As a general rule, unless you can trace information like this back to an actual emergency service or other reputable outlet, you should assume that it’s fake.

In this case it’s inaccurate, but it does contain some information that’s true.

The Full Fact article does a reasonably good job of explaining, but I can add little more detail from a different perspective.

When you make a 999 (emergency) call in the UK, the emergency services have access to some extra information about that call that they don’t get for other calls. This happens automatically whether you dial 55 or not.

If you call from a land-line or telephone box, the emergency service has access to the subscriber details for that line. This includes the name of the person that the line is registered to and the address.

If you call from a mobile, the situation is a little more complex. The emergency service can request the location of the mobile phone – and usually does so automatically. That request gets passed to the mobile phone company. Before the days of GPS, the mobile company would return, if it could, an estimate of the location based upon the signal strength and the location of the cell masts nearest to the phone. It can sometimes provide quite accurate results, but other times it’s not so good.

The mast information is still sent to the emergency services. Now however almost every mobile phone has GPS so new methods have been developed so that the phone can also send its location data all the way through to the emergency service control room. Not every phone can do this, so you can’t rely on it, but the more time that passes, the more phones are coming on-board.

It’s worth noting that a mobile phone’s own location data isn’t always accurate. It’s usually pretty good, within a few metres, but there are a number of factors that can throw it off, sometimes by just a few metres, but I’ve seen examples of phones thinking they’re on a different continent.

Again, to be clear, you do not need to dial 55 or perform any secret handshake to make your location available. If your phone can do it, the mobile network can do it and the emergency service can do it, then your phone’s location data gets sent to the control room. It’s all automatic. This is what I think the meme is talking about as “new technology”. Otherwise, the mast data is almost always available.

Where dialling 55 comes in is if you’re in a situation where you can’t talk. If you’re hiding from an attacker for instance you might not want to talk as it may alert the attacker to your location. The mobile operator may well ask you to dial 55 if you’re there and are in danger. That’s the point of dialling 55 – it lets the operator know that, although nobody is speaking, you have not dialled 999 by mistake.

I should point out here that the emergency services do not always respond to silent 999 calls. They have to assess each call individually and decide whether to respond, whether the person talks or not.

Ultimately then there is some truth to the meme and I suspect somewhere, underneath it all, someone knew what they were talking about. It looks however as if it’s been through a few people and by the time the meme was made some of the messages have got a bit mixed up.

To conclude:

  • The emergency services can always get your location and usually do automatically. You do not have to dial 55 to make that happen.
  • The “new” bit is that the emergency services can now get the location data direct from many smartphones, instead of having to rely on mast data.
  • Only dial 55 if you are unable to speak for some reason. The operator may ask you to do this anyway if you don’t speak. If you can speak however, do.

Finally, don’t assume when you call that the emergency services do have your location. Things can go wrong, the more information you can give them over the phone, the better.


Tom Fosdick is a software engineer who is responsible for the system that several UK emergency services use to get 999 call locations.

I’m Pulling the Social Media Plug

Reading Time: 4 minutes

In the words of a certain radio station, “Social media can be a force for good, but it can also be a giant pain in the arse.”

When I wrote that First Class Post was the most rapid form of communication of which I approved I was only half joking. I recently spent two weeks in India. Rather than deal with the expense of roaming or hassle of a local SIM I just turned mobile data off. It was a surprisingly liberating experience.

It’s not like I dropped off The Internet completely: there’s free WiFi in most hotels and a few restaurants. What I found though was that having Internet access time-boxed had a far greater effect on the way I lived my life than I could ever have imagined.

I’ve spent pretty much my entire career in communications, most of it trying to improve the connectivity and communication technology used by the emergency services. I’d always kind of assumed that more connectivity and more flexible communications were a good thing.

It’s true – the increased ability to communicate can benefit us very greatly. For instance, we’re now talking about the ability for members of the public to stream video directly into an emergency service control room. That information could be hugely useful to the call-taker, in informing the member of the public, in informing the crews being sent to the scene and also providing an evidence trail for any followup action.

On the flip side however, as I’m sure you can imagine, the ability to stream video from a remote location to another, particularly via an end-to-end encrypted channel, facilitates some of the most appalling people in existence.

To a lesser extent the same is true of social media. It enables us to keep in contact with people that we would otherwise naturally lose touch with, but it also throws up conflicts that we would never otherwise have. On top of this the social media companies themselves aren’t making money unless you’re using them. They make every effort to ensure that their platform invades your life as much as possible.

Over the past year or so I’ve become utterly frustrated with this: I’ve disabled all notifications from every social media app on my phone. What India taught me however is that this isn’t enough. If I really want to take back control from social media, I have to remove myself from the social media environment and only step back into it on my terms.

Social Media is not a new thing, it existed back in the dial-up days. The difference was that to be online you had to make a phone call, and the costs could mount up if you weren’t careful. You had to set limits, for purely financial reasons (especially if you were on a trainee’s wage).

So I’m setting usage limits again.

Just before we left for India, my partner and I were in a restaurant and the couple next to us spent the entire meal on their phones. They barely talked to each other. The first rule therefore is:

No phones at the dinner table, wherever that dinner table is: in the house; in a restaurant; a picnic table in a field; etc.

If I’m out and about doing jobs or visiting people, the chances of me needing to call someone are fairly high, but the chances of me needing a smartphone are fairly low. The second rule:

Unless there is a clear reason to take the smart phone out, take the dumb phone [see above photo].

The penultimate rule I call the “Soap Opera Rule”. In many ways Social Media is like a Soap Opera, the two differences are that it deals with real people and that it’s constant, it doesn’t come in half hour chunks 3 times a week. The former is somewhat the point of Social Media. The latter is something that you have to manage and it helps if you think of it more like a Soap Opera:

Set clear daily usage limits and don’t exceed them.

Of course there are exceptions to every rule. When we’re talking about usage limits we have to consider what the purpose of usage is. If you’re organising a family meal via WhatsApp that’s not the same as reading your Twitter timeline.

The key here is be sensible and maintain perspective.

The last rule is the simplest of them all:

Talk to people.

Social media is no way to conduct a friendship. Sure, it’s a great way to allow you to find people with common interests and to keep touch with people who you would otherwise lose touch with. Those people aren’t your friends (although they may have been or may become so). Ultimately, friends are not people you broadcast status updates to. Friends are the people you have a conversation with when you have news.

So call them, invite them round for tea, go to lunch with them, go watch a film with them but interact with them directly and personally, not via timelines and group chats.

From now on I’m going to be following these rules. In reality you probably won’t notice any difference, but I think it’s going to make a big difference to me and I hope these words make a difference to other people.

Remember that it’s in the interests of the Social Media companies to create a society where it’s socially unacceptable not to be glued to your phone. Don’t sign your life over to them: take back control and always, always be true to yourself.

C# Best Practice: Why a Separate “lock” Object?

Reading Time: 4 minutesSome time about 1995 I noticed that I was writing a lot more concurrent code than the other programmers. It was almost as if someone was deliberately pushing it in my direction… That theme never really changed.

I was rather surprised then when a developer made a comment on something I’d written a few years back, because I was pretty confident I’d covered all the bases.

public class SomeServer
{
    private readonly Dictionary<KeyType, ValueType> queries = new Dictionary<KeyType, ValueType>();

    //stuff

    public void PerformLookup(string someQueryTerm)
    {
        //some logic...
        lock(queries)
        {
            //some more logic
        }
    }
}

The comment was:

Please use a separate lock object. e.g. private readonly object _queriesLock = new Object();

Eh? What?

OK, hands up I missed this. I learnt to use basic concurrency tools way before C# existed. For me C#’s ‘lock’ construct was great because it allowed me a very clear and concise way to use a monitor. As far as I was concerned there was no downside. Why on earth would I want to use a separate lock object?

There are 2 things you need to be really careful about when using a lock in this way.

You must carefully manage the lifetime of the locked object.

Imagine above if ‘queries’ were not a readonly object created at instance initialisation. Imagine if someone did…

lock(queries)
{
    //stuff
    queries = new Dictionary<KeyType, ValueType>();
}

You have to make sure that the locked object is instantiated before the fist lock is taken out and you must make sure that it is not reassigned in any way until after the last lock has been exited.
If you don’t it leads to all different flavours of bad.

If you instantiate a separate lock object at object initialisation, an object that has no purpose other than as a lock, then you know it’s there at the start and the chances of someone messing with it before the end of the last lock are very significantly reduced.

You must be careful not to expose the locked object externally

C# allows an implicit monitor to be created on any object. You can use that monitor by wrapping the object in a ‘lock’ statement.

If you wrote the class to use, say a mutex explicitly rather than the implicit monitor there’s no way you consider making the mutex externally accessible…

public class SomeServer
{
    private readonly Dictionary<KeyType, ValueType> queries = new Dictionary<KeyType, ValueType>();
    public Mutex _queryLock = new Mutex();

    //stuff

    public void PerformLookup(string someQueryTerm)
    {
        //some logic...
        _queryLock.WaitOne();
        try
        {
            //some more logic
        }
        finally
        {
            _queryLock.ReleaseMutex();
        }
    }
}

That’s complete madness – any other class can mess directly with the lock and cause all sorts of unwanted behaviour. Deadlocks are a particular hazard here and compound deadlocks can be really tough to debug.

If you’re using the implicit monitor via the ‘lock’ construct however and you expose the locked object beyond the scope of the class, you are effectively also sharing the monitor.

public class SomeServer
{
    public Dictionary<KeyType, ValueType> queries {get; private set;} = new Dictionary<KeyType, ValueType>();

    //stuff

    public void PerformLookup(string someQueryTerm)
    {
        //some logic...
        lock(queries)
        {
            //some more logic
        }
    }
}

public class SomeOtherClass
{
    private SomeServer myServer=new SomeServer();

    public void SomeMethod()
    {
        lock(myServer.Queries)
        {
            //some logic
        }

        //or worse...
        Monitor.Enter(myServer.Queries)
        //and the Monitor.Exit is in another method that might not get called
    }
}

If you use a separate lock object that you know is private and will always be private then you don’t have to worry about this.

Having written this pattern many, many times in many different languages I’m not likely to fall into either trap. That’s not all that being a good developer is about though.

HwacheonCentreLathe 460x1000

Now, this might seem like a strange tangent but bear with me. I learnt to use an industrial [machine] lathe when I was a kid. They teacher drummed 2 things into us.

  1. Do not wear any loose clothing (e.g. a tie)
  2. Do not leave the chuck key in when starting the lathe

The reason these 2 things in particular were so important was because the lathe I learnt to use had no guard. Either of those 2 mistakes could be fatal.

I’m glad I learnt that, but given the choice would I use the lathe with a guard or the one without? It’s a no-brainer.

We have the same situation here. Unless we’re writing something very specific where memory is absolutely critical, there’s no harm in creating an extra lock object. It provides a useful safeguard against a couple of gotchas that could cause real headaches in production.

Software development purists will be wringing their hands, but they’re not what commercial software development is about. It’s about writing code that does the job in a simple, safe and maintainable way. That’s why using a separate lock object is C# best practice and that’s why I fully support it.

First Class Post

Reading Time: 2 minutes

Someone recently accused me of replying too slowly on WhatsApp. “First Class post” I replied, “is the most rapid form of communication of which I approve.” I wasn’t joking.

The fact that you’re not going to get a reply for at least 24 hours, if not the best part of a week, tends to rather focus the mind. You have to concentrate on exactly what you want to say, no more, no less and ensure that your communication is complete. There’s no “soz, not what I meant lol” if you botch what you were trying to say.

Writing someone a letter makes you value the communication.

I’ve never been comfortable with the telephone, I consider it a step too far. A letter arrives on your doormat. You might pick it up and open it immediately, or put it aside for later. It’s your choice. You can then think about your reply whilst you’re cooking or re-glazing the east wing.

The telephone however screams “STOP!” when it rings, “whatever you are doing cease it now! Someone wants to talk to you!” It’s just plain rude. On top of that it might not even be a conversation that you wanted to have at that time.

No, the telephone is an abomination and the mobile phone doubly so. There are numerous reasons why one might not answer a house telephone. There is no escape from the mobile, it’s there, in your pocket, constantly buzzing, continually demanding attention.

We now have so many ways of near-instant communication that we have lost all respect for the privilege that technology has brought us. Instead we spend every waking minute in cataclysm of indistinct missives trying to make sense of a world projected into our hands by people who are at best as misinformed as we are.

Don’t get me wrong, I’ve spent the past 20 years delivering ever-improving communication technology into the hands of our emergency services. I’m very much in favour of the technology.

I am more that happy that I have in my pocket a device that lets me communicate in a variety of ways with almost all of my family and friends, with businesses, government and even write articles like this that will be read by complete strangers.

I however respect the fact that I don’t know what the intended recipient of my communication is doing at that moment. I respect the fact that they may not want to reply immediately. I don’t believe it’s asking too much for that respect to be mutual.

One From The Vaults: Testing

Reading Time: 3 minutes

Looking for Rhino (real ones, not mocks)

Whilst I was looking for something else I found an explanation I wrote years ago to try to explain to senior management how testing had changed and become critical in the Agile environment. It’s not the easiest thing to try to get across: the business wants features that it can sell. I don’t think I did a bad job, so here it is.

Having now spent a few months with this project I’m very conscious that, at the moment, we don’t have much of a testing strategy. It looks as if we’re trying to offload all responsibility for testing onto the testing department.
This rather implies that our primary testing strategy is manual system testing.
Failed system tests are expensive – and if they impact promised delivery dates they can be a major problem. It would be better if we could have a good idea before we entered a system test whether or not it’s going to pass and that is a software quality management problem.

(Technical) testing should start in the software design. The questions the developers should be asking are;

  1. How am I going to achieve this task?
  2. How am I going to test it?

As an example, user interfaces are notoriously difficult to test, but if one of the MVC style design patterns is used it means that the view (the actual UI) can be separated from the rest of the code. This means you can write a program to test the logic behind the UI without having to try to actually click buttons programmatically.

There are any number of places within the design of software where adding a little thought to how it can be (easily or preferably automatically) tested is of significant advantage.
The more automated testing we can get in the better. If we can get to a position where a substantial portion of the code is automatically built and tested every night that would be great. It means that we, as developers, get continuous feedback about the state of the software.
We can then go into a system testing phase with a much higher level of confidence that it will pass.

This does mean however that we need to start investing in testing, which can be a difficult message to get across. If we don’t however then as the software and the functionality grows and the code-base becomes more difficult to maintain we will be taking ever increasing risks with the future of the product.

It’s a good idea to get this baked in now.

I would suggest that a feature is not finished unless the issue of how it is going to be tested is solved – and that means the automated tests and / or the manual tests written. If there’s no automated testing there needs to be an explanation of why.

The more bodges, work-arounds and spaghetti code there is, the harder it becomes to maintain and the longer it takes to develop each new feature. A product which leads the market can very quickly fall behind because every time someone tries to do something they have to try to unravel all the spaghetti, they then inevitably end up piling on more spaghetti just to make it work and making it worse for the next edit. Technical debt snowballs.

As with all things there’s a balance, I’m conscious we need to get features to market fast, but as the product matures the importance of testing will increase. Automated unit testing ensures that each building block of the project actually does what we think it should do. It’s not a silver bullet for solving all technical debt, but it’s a good starting point. Making code testable enforces certain good behaviours that will increase the longevity of the product.

I do not believe that the current development strategy is sustainable. I am therefore intending to phase in a plan that will, in time, see all new development covered by automated testing and will start to retrofit automated testing into the existing code-base. Inevitably this will slow down the speed we can get features to market, by a known and controllable overhead. Our business model is based on repeat business. If we fail to get a grip of technical debt the competition will overtake us in the mid term and it will invalidate that model.

Stop! Thief!

Reading Time: 2 minutes“That image looks awfully familiar” I found myself thinking when reading an article on vinyl record run-out groove etchings. Then it clicked, it was one of my images, reproduced in someone else’s article without my permission and with no recognition that it was my image.

Image of Vinyl Factory 29 Dec 2017

I’m not a professional photographer, it’s true I do know which end of a camera is the sharp one, but trying to make money out of photos is just more hassle than it would be worth to me. Consequently I’m quite happy for my images to be reused for non-commercial purposes provided that I’m given due credit.

What I do mind however is when my images get re-used on commercial, for profit sites without even so much as an acknowledgement. Even on commercial sites it’s really not worth me pursuing them for revenue (although I reserve the right to do so), what I mind is the fact that it’s downright rude not to credit the original artist.

There’s really no excuse for this – even if someone found the image on a different site a Google reverse image search will very quickly identify its origin. Consequently I have no hesitation in naming and shaming places where I’ve found my images used without my permission and without any recognition.

Original Article Rip Off
A Porky Prime Cut Vinyl Factory
And Twitter
A Porky Prime Cut Two Good Ears
A Porky Prime Cut jack.canalplus.fr
IP Webcam MSN / Auntie Acid
(image and factual content)
IP Webcam Auntie Acid
(image and factual content)
IP Webcam estisuperba.ro

And again (different article)

IP Webcam smalljoys.tv
Goodwood Cobra (racing) conboy.us
Goodwood Cobra (crash) conboy.us
Goodwood Cobra (crash) armeniabirding.info
Goodwood Jaguar D Type (racing) 165.227.181.117
Goodwood Jaguar D Type (rear) 165.227.181.117
Grand Rosela Hotel, adelynndesign.us

Entity Framework Double PK Overwrite Gotcha

Reading Time: 2 minutesI was writing some unit tests: largely out of completeness I wanted to test that you couldn’t insert two records with the same primary key. The code is simple enough.

    var car = db.Cars.OrderBy(g => Guid.NewGuid()).First();
    var pool1 = db.Pools.OrderBy(g => Guid.NewGuid()).First();
    var driverName1 = Guid.NewGuid().ToString().Trim('{', '}');
    var created1 = PoolAllocatedCar.Create(car, pool1, driverName1);
    db.PoolAllocatedCars.Add(created1);

    var pool2 = db.Pools.OrderBy(g => Guid.NewGuid()).First();
    var driverName2 = Guid.NewGuid().ToString().Trim('{', '}');
    var created2 = PoolAllocatedCar.Create(car, pool2, driverName2);
    db.PoolAllocatedCars.Add(created2);

    Assert.Catch<Exception>(()=> db.SaveChanges());

Car Id is the sole primary key of the PoolAllocatedCars table.

Being bit lazy I guessed it was quicker for me to run the code and find out what exception SaveChanges() it threw rather than trawl through the docs and work out what it should be.

The problem: it didn’t throw an exception. So I added some debug to find out what happened, the result is disappointing to say the least.

---===*** FAILED TO NOTICE PK CLASH ***===---

In Memory:
    Car Id [24] Pool Id [49] Driver [bda1d05c-8dae-4648-ab42-736eb8c44b71]
    Car Id [24] Pool Id [08] Driver [9dae73a0-5b8d-45bc-9d0a-f8b73141aa2c]

In Database:
    Car Id [24] Pool Id [08] Driver [9dae73a0-5b8d-45bc-9d0a-f8b73141aa2c]

It would appear that Entity Framework simply overwrote the first record with the second without giving any indication that there was ever a primary key clash.

Now I’m sure that somewhere in the documentation there’s a warning or a note about this but I haven’t found it yet…

Update: It Gets Worse

I was taken aback by the above, that it could be deemed acceptable to treat the explicit addition of a second object with the same primary key as an implicit update with no warning to the user.

I guess then I shouldn’t have been surprised that it even does this after an explicit call to SaveChanges()

The following test gives exactly the same result as the first. This is a massive gotcha.

    var car = db.Cars.OrderBy(g => Guid.NewGuid()).First();
    var pool1 = db.Pools.OrderBy(g => Guid.NewGuid()).First();
    var driverName1 = Guid.NewGuid().ToString().Trim('{', '}');
    var created1 = PoolAllocatedCar.Create(car, pool1, driverName1);
    db.PoolAllocatedCars.Add(created1);

    db.SaveChanges();

    var pool2 = db.Pools.OrderBy(g => Guid.NewGuid()).First();
    var driverName2 = Guid.NewGuid().ToString().Trim('{', '}');
    var created2 = PoolAllocatedCar.Create(car, pool2, driverName2);
    db.PoolAllocatedCars.Add(created2);

    Assert.Catch<Exception>(()=> db.SaveChanges());

The good news is that if you use a different DbContext it throws an exception :- in fact on the Add, not the SaveChanges.

I’m having trouble getting my head around this: I can’t see the logic. If you thought there was a chance that you’d want to update an object after you’d added it to the table then you should keep your own reference to it. If that’s a problem because of scope then your design is probably wrong.

The Jet Set

Reading Time: 4 minutesI really genuinely hate air travel. I will do pretty much anything I can to avoid it. I’ve taken a 16 hour train journey from Suffolk to Barcelona to avoid a 3 hour flight. It’s not that I’m afraid of flying, there’s just something about the whole experience that I find fundamentally unpleasant.

South Africa however is a bit of a trek. Personally I’m completely up for a McGregor/Boorman type epic, but there are certain logistical problems. Mainly not having anything like the spare cash that Ewan McGregor has. Or time. He does seem to have a lot of spare time.

Consequently I’m currently sat on a plane and I’ve been here a while…

There’s never anything on the entertainment system that I want to watch. I have no idea why. It could have my favourite show on there and I still wouldn’t want to watch it. I’ve gone through it all, pawed the duty free catalogue, scanned the in flight magazine and read the safety instructions twice. It’s half past midnight and I am still quite unreasonably awake. It’s at times like this when I conclude that it’s a good idea to listen to Pink Floyd’s Atom Heart Mother.

I’m almost coming to terms with “Alan’s Psychedelic Breakfast” when I suddenly become aware of something plasticky in front of me. I’m just about to “put it over my mouth and breathe normally” when my nose informs me that it’s curry. I conclude that I could in fact eat, not because I’m hungry but because I’m bored and I’m hoping that redirecting some of the blood supply from brain to stomach might help me at least doze.

To this end I order wine too, “Cabernet Sauvingon?”, I enquire. “No, but we’ve got Sauvingon Blanc”, comes the reply. “No thanks,” I interject, “Cabernet Sauvignon is a red” but it’s too late and an open mini bottle of white wine lands on my tray table. I note that is a Marlborough and decide that it’s better the devil you know.

Nevertheless my plan works and half an hour later I’m in the land of nod.

I awake to the rather uncomfortable realisation that I ordered Asian Vegetarian food on this flight. I usually do because it seems more difficult for airlines to murder curry then it does any other type of food. Unfortunately breakfasts can get interesting as I’m about to find out when I’m served bland, generic cheese, coleslaw and sort of bread that tastes like dehydrated semolina pudding.

On the bright side I conclude that breakfast service must mean that I got a good few hours sleep and that there can’t be that much time left on the clock. I don’t dare look however.

I fire up my music player and decide to give the Amaranthe album I curiously downloaded on Spotify a listen. The first track is good, but I very quickly conclude that although Euphoric Dance / Death Metal crossover might sound like an interesting and challenging concept, right here, right now it’s just very, very annoying.

Thankfully the entertainment system has some Chopin and my eyelids are starting to feel heavy again.

There’s an eerie silence when I wake and another strong smell of curry. Chopin has finished and my noise cancelling headphones are busy cancelling out the drone of 4 enormous GP7000 series jet engines.

I lift the lid on the tray in front of me: the airline chefs have surpassed themselves this time and reached a whole new level of achievement. Somehow they have managed to screw up a paneer curry.

Fortunately there are enough other dishes to make a meal. There’s even some spare cheese, just in case cheese in lightly spiced cream sauce wasn’t enough dairy for one meal.

By the time I’ve obtained a cup of tea I’m feeling brave. I’ve had two good sleeps and three bad meals. We must be nearly there, right?

3 hours to go. There’s nothing out the window but cloud. The aircraft cameras are showing nothing but cloud.

Now all we need is some… whoa! Where’s the floor gone? Is that kind of jolt within the tolerances this plane was designed for? “A bit bumpy”, why yes Captain I think we’ve all noticed that. There was a small hint in that if I hadn’t been wearing my seatbelt I’d be sitting in the overhead locker right now.
I then spend the next few moments marvelling at how, firstly, relatively minor atmospheric conditions can hurl a 500 tonne plane about like a piece of confetti and secondly what a superb piece of engineering it is that a 500 tonne plane can be hurled around like a piece of confetti without the wings falling off.
Now however the baby is screaming and the bloke next to me is pale as a ghost and clinging on to the arm rest for grim death.

I try to think of some words that might be of comfort to him, but everything I can think of either makes me sound like a smug git or contains the word “plummet”. I do however make a note to stop jokingly referring to our destination – a well known London airport – as “Splatwick”.

Still more than 2 hours to go but on the positive side, I’m starting to wonder if there’s some mileage in trying to write a blog article about why I hate flying so much…