Pragmatism For Fun and Profit, but Mostly Profit

Reading Time: 3 minutes

Power cut!
Power cut!
Beautiful design is great, but more often than not it doesn’t pay the bills. Pragmatism is one of the things I try to instil in the SEED students. There’s a time for complicated diagrams with lots of lines and boxes, there’s a time to elegantly partition the layers, but there’s also a time to ‘it it wiv an ‘ammer.

I was recently dealing with some simple comms routing. I needed to store information about an address composed of 3 parts;

  • Sector – a byte in storage this identifies the organisation to send the message to.
  • Node – 10 bits denoting the unit to send to, e.g a Fire Station or Fire Appliance (Engine)
  • Port – a byte indicating the application to send to, e.g. the printer

The information that I needed to associate with this address was actually an email address that it translated to. So it’s an obvious tree structure, right? What’s more you can use an XmlSerializer to save and load the relationships – this is important because it needs to be maintained by a human. So let’s look at the XML.

<Sectors>
  <Sector SectorNumber="0">
    <Nodes>
      <Node NodeNumber="0">
        <Ports>
          <Port PortNumber="0">
            <EmailAddresse>postmaster@localhost</EmailAddress>
          </Port>
        </Ports>
      </Node>
    </Nodes>
  </Sector>
</Sectors>

Oh dear, that’s not very good. There could easily be a couple of hundred entries which would mean that the sector you’re editing might not be in view, similarly the node. It’s all a bit untidy really.

Also lookup isn’t simple, you need to do it in 3 stages, find the Sector, then find the Node, then find the Port. So the XML is untidy and the code is untidy. But the design is good, yes?

There’s a better way. I realised that 8 bits + 10 bits + 8 bits is 26 bits and a standard csharp integer is 32 bits. So we can just have one object that has Sector, Node and Port properties but has a "lookup" value that is an int and is made up from the parts of the address.

    [XmlElement]
    public class AddressRelation
    {
        [XmlAttribute]
        public byte Sector { get; set; }
        [XmlAttribute]
        public short Node { get; set; }
        [XmlAttribute]
        public byte Port { get; set; }
        [XmlAttribute]
        public string EmailAddress { get; set; }
        
        //so that we can get a lookup code, for comparison
        public static int GetLookupCode(byte Sector,short Node,byte Port)
        {
            return Sector << 24 | Node << 8 | Port;
        }

        public int GetLookupCode()
        {
            return AddressRelation.GetLookupCode(Sector, Node, Port);
        }
       
        //this makes serialization much easier
        public static AddressRelation CreateFromLookupCode(int LookupCode,string email)
        {
            return new AddressRelation() 
                { Sector = (byte)(LookupCode >> 24), 
                    Node = (short)((LookupCode >> 8) | 0xffff), 
                    Port = (byte)(LookupCode | 0xff) };
        }
    }

That’s great. When we call “GetLookupCode()” we get an int that uniquely represents that address. We can easily compare that with other objects.
Note that I didn’t override GetHashCode() or the equality operator because although the addresses might be the same, the emails may be different.
If you’re wondering what >> and << do then you need to look up bit shifting and bit masking…

They serialize nicely, too.

<AddressRelations>
    <AddressRelarion Sector="0" Node="0" Port="0" EmailAddress="postmaster@localhost0" />
    <AddressRelarion Sector="0" Node="0" Port="1" EmailAddress="postmaster@localhost1" />
    <AddressRelarion Sector="0" Node="0" Port="2" EmailAddress="postmaster@localhost2" />
</AddressRelations>

But how do we use it? Well actually the easiest thing to do is to load it into a dictionary, which should make the uses of some of the extra methods in the data class clearer…

    [Serializable]
    [XmlRoot(Namespace = "www.tomfosdick.com/blogstuff",
     ElementName = "AddressStore",
     IsNullable = true)]
    public class AddressLookup2
    {
        [XmlArray("AddressRelations")]
        public AddressRelation[] AddressRelations
        {
            get
            {
                return addressLookup
                    .Select(x => AddressRelation.CreateFromLookupCode(x.Key, x.Value))
                    .ToArray();
            }
            set
            {
                addressLookup = value
                    .ToDictionary(k => k.GetLookupCode(), v => v.EmailAddress);
            }
        }

        private Dictionary<int, string> addressLookup = new Dictionary<int,string>();

        public string GetAddress(byte sector, short node, byte port)
        {
            string result;
            if(addressLookup.TryGetValue(AddressRelation.GetLookupCode(sector, node, port),out result))
                return result;
            return null;
        }
    }

The advantage of using a Dictionary here and of the way I’ve shuffled the parts of the address into an int means that this will always be serialized in order, Sector most significant then Node then Port. So editing the XML by human hand will be easy – even if one is added out of sequence when the file is next machine written it will be sorted again.

The code is neat, concise and fast. The design is a bit mucky, it’s not clean and elegant but in all other ways – some of which are far more important than the cleanliness of design – this wins.

Oh No, Snow!

Reading Time: 3 minutes

What to do in snow [image credits unknown]
Why does Britain – particularly England – grind to a halt at the first flake of snow?

Some of it, of course, is down to people being pathetic but the fundamental reason is clear – we’re just not set up for it. However one has to question whether we should be. Snowfall in the UK varies wildly depending on where you are but it’s a rare year that we have more than 2 weeks which are seriously disrupted by snow – 3.8% of the year. How much do we really want to invest in such a small percentage of our time?

Other (similar) countries don’t grind to halt because they have enough snow to make investment worthwhile. Finland is under snow, depending on where you are,  for between 3 and 6 months of the year.

To make this clear we’ll look at some of the cheaper and reasonable precautions one can take.

  • Get some long life / tinned / frozen food in.
  • Make sure you have a good supply of fuel – wood, coal, gas, oil etc.
  • Most people have a garden spade, it’s useful to have one in the car (whether this be the garden spade or a “travel shovel” specifically for the car).
  • Carry a couple of pieces of old carpet and perhaps planks of wood in the car. Maybe even specialist grip mats.
  • Make sure your screen wash is full and mixed up correctly for winter. You can buy concentrated screen wash at good motor factors, mix it up as per the instructions for winter.
  • Make sure you have proper boots that can cope with snow (good wellies will suffice).
  • Get some grit-salt in for your path and/or drive. It’s not expensive. You can use dishwasher salt or even table salt but they tend not to come in big bags for a couple of quid. If you haven’t got (enough) salt then sand, grit or even ash will help. It freezes into the surface making compacted snow more grippy.

These reasonable precautions won’t cost much. Motorists in Scandinavia however use Winter tyres. Even if you have a modest car that’s £300 and unless you’re going to pay someone to change them twice a year you can add the cost of a second set of wheels to that.

What’s more unless you do a lot of miles the tyres will probably perish before they run out of tread which just wastes money. They do make a real difference to driving on snow (in fact they have specific snow tyres in Scandinavia which are even better). For 4% of the year though where they make that real difference is it worth it?

That’s one simple investment we could make in our own cars but it highlights the issue rather well. Similar disproportionate investment would be required in much of our infrastructure if we were going to just carry on as normal in the snow in the same way that Scandinavian countries do. For 4% of the year it’s simply not worth us making those investments. It’s actually more cost effective for us to just to do the best we can with the limited resources available.

The key to dealing with snow in the UK is planning. We know it’s going to happen for a few days a year and the weather forecasters are rarely caught out by it, so plan in advance. Businesses should also be aware of the problems and should have plans. It’s all common sense.