Using XML to Reduce SQL Server Round Trips

Reading Time: 7 minutes

Round trips to SQL Server kill performance. It takes time to set up the command, get it to the SQL Server, then to parse it, search for and format the results then return them to the application. If you need lots of little pieces of information this can get extremely frustrating, especially when you get a call from your DBA about the “horrible” app that you’re developing.
Sometimes you can bring back a super-set of the data you need in one query rather than several smaller queries and you may find that filtering the data down to what you need in code is faster than hitting SQL Server with lots of small queries. It is subjective, of course. There’s always a level in database programming where the theory is fine but you don’t really know until you try it.

I found myself thinking that there must be a better way though. There are two scenarios I want to cover – let’s start with the simpler one.

My Selection Criteria is Complex – e.g. It Contains a List

Wanting to pass a list as an input parameter to SQL Server is a common problem, and one that I’m pleased to say Microsoft addressed in SQL Server 2005 with table valued parameters. Except that they didn’t implement it in Linq-to-Sql or Entity Framework which proves a bit of a headache.

Table valued parameters also need to be in the schema and that’s not always under the control of the app developer. So what do you do if you’re stuck in hard place where you can’t do it the right way?

Let’s say Northwind – Microsoft’s now ancient example company – was integrating to another system. That other system might want details of several customers. Helpfully they can provide us list of the IDs they require. This is easy if you’re typing the SQL in directly…

SELECT * FROM dbo.Customers WHERE CustomerID IN ('BERGS','GODOS','FURIB','GREAL')

You can of course build up the query text in code to be just like the above but you’d better pray that “Little Bobby Tables” never becomes a customer.

Naturally you can use a stored procedure to parse a CSV type string but whilst that’s not so open to a Sql injection attack it’s still pretty fragile.

A more robust way is to use XML. Here’s some C# with everything hardcoded so, as long as you have a Northwind somewhere, this should work via the magic of cut-and-paste (and editing the connection string).

private void GetCustomersByID(List<string> list)
{
    //make an XML document listing the customer IDs
    XElement doc = new XElement("customers");
    list.ForEach(customer =>
        doc.Add(new XElement("customer", new XAttribute("CustomerID", customer))));

    //Connect to the SQL Server
    using (SqlConnection connection = new SqlConnection(@"Server=(localdb)\v11.0;Integrated Security=true;Initial Catalog=Northwind"))
    {
        connection.Open();
        using (SqlCommand getCustomers = connection.CreateCommand())
        {
            getCustomers.CommandType = System.Data.CommandType.Text;
            //Command text uses the XML document to join to the target table as a way of selecting rows
            //(there are other, probably better ways)
            getCustomers.CommandText =
                "DECLARE @hdoc INT " +
                "EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml " +
                "SELECT [dbo].[Customers].[CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], [City], " +
                        "[Region], [PostalCode], [Country], [Phone], [Fax] FROM [dbo].[Customers]" +
                    "INNER JOIN OPENXML(@hdoc,'/customers/customer',1) WITH (CustomerID  nchar(5)) req " +
                    "ON req.CustomerID = dbo.Customers.CustomerID " +
                "exec sp_xml_removedocument @hdoc";
            getCustomers.Parameters.AddWithValue("@xml", doc.ToString());

            //bring the results back and display them
            using (SqlDataReader resultsReader = getCustomers.ExecuteReader())
            {
                while (resultsReader.Read())
                {
                    object[] values = new object[resultsReader.FieldCount];
                    resultsReader.GetValues(values);
                    Console.WriteLine(String.Join(", ", values.Select(x => x.ToString())));
                }
            }
        }
    }

So we make an XML document in C# – there are any number of ways of doing this, I chose LINQ’s XElement – and passed it to the SQL Command as a parameter. We then use OPENXML to open it as a rowset and inner join it to the target table, allowing us to bring back only the rows we want.
Of course there is an overhead in constructing the XML and parsing it in SQL Server and we must be aware of that, but this little trick does allow one to neatly work around some quite common problems.

Of course this example is a little trivial. It’ really only to demonstrate a technique. Where XML particularly wins – even over Table Valued Parameters – is that XML does not need to be a list of the same type. You could even specify groups of parameters or a complex structure enabling the SQL Server to make some informed choices about the data to return without having to issue multiple queries and incur unnecessary round-trip overhead.

I Want to Return Complex Information Made From Many Fragments of Data

This usually manifests itself when you need data from several tables where there isn’t a one-to-one relationship.

If the relationship is simple sometimes it’s quickest to use a join and just throw away the duplicated sections of the row. e.g. you might want a the customer details and their 50 most recent orders – you can accomplish this with a join but you’ll get a copy of the customer’s details with every order details so that’ll be 49 copies of the customer’s details that you don’t need. It may be faster than using 2 separate queries.

You can also return multiple result sets from a query or stored procedure. Scott Gu covers that quite adequately in LINQ-to-SQL Part 6. In the above example you could return two result sets, one containing the customers and the other containing the orders. You’d then have to link them in code, but provided there aren’t too many rows this can be a quick option.

If it’s details of just one customer that you need you could return one result set (the orders) and use OUT parameters in the query – that’s another option.

I mention these options first because XML may not be the right way to go, I’m really just presenting it as an option that you could take. To that end let’s look again at the Northwind database – perhaps we want to bring back a lot of information about a customer, maybe the orders they’ve placed and what was in those orders. This is a hierarchical data set, of course we could do this with multiple result sets but we’d have to join them up on the client side and that could get messy. Instead we can use SQL Server’s ability to output XML. Of course batting XML around the place instead of nice binary types is going to incur a significant overhead and that should be taken into account, but there is potential here.

SELECT [CustomerID]
      ,[CompanyName]
      ,[ContactName]
      ,[ContactTitle]
      ,[Address]
      ,[City]
      ,[Region]
      ,[PostalCode]
      ,[Country]
      ,[Phone]
      ,[Fax]
	  ,(SELECT [OrderID]
		  ,[CustomerID]
		  ,[EmployeeID]
		  ,[OrderDate]
		  ,[RequiredDate]
		  ,[ShippedDate]
		  ,[ShipVia]
		  ,[Freight]
		  ,[ShipName]
		  ,[ShipAddress]
		  ,[ShipCity]
		  ,[ShipRegion]
		  ,[ShipPostalCode]
		  ,[ShipCountry]
		  ,(SELECT [OrderID]
				,d.[ProductID]
				,[Quantity]
				,[Discount]
				,[ProductName]
				,[SupplierID]
				,[CategoryID]
				,[QuantityPerUnit]
				,d.[UnitPrice] [OrderUnitPrice]
				,p.[UnitPrice] [ProductUnitPrice]
				,[UnitsInStock]
				,[UnitsOnOrder]
				,[ReorderLevel]
				,[Discontinued]
		FROM [dbo].[Products] p INNER JOIN [dbo].[Order Details] d ON p.ProductID=d.ProductID 
		WHERE d.OrderID=o.OrderId FOR XML PATH('OrderDetail'),ROOT('OrderDetails'),TYPE)
	  FROM [dbo].[Orders] o WHERE o.CustomerID=c.CustomerID FOR XML PATH('Order'),ROOT('Orders'),TYPE) 
  FROM [dbo].[Customers] c FOR XML PATH('Customer'),ROOT('Customers')
GO

The cunning bit here is using SQL Server’s subquery ability to produce a hierarchical XML dataset.
The root node is “Customers” containing multiple instances of “Customer”. Each Customer contains an “OrderDetails” element which is a list containing multiple instances of “OrderDetail”. This in turn has a “Products” element which is a list of “Product” items.
I won’t go into SQL Server’s ability to produce XML in any great deal suffice to say that it’s come a long way since 2005 and it’s now really quite powerful. I also accept that there may be better ways of achieving the above.

What I do need to mention is how to get this back to a C# app – don’t be tempted to use ExecuteScalar() – it will truncate long xml.

The following uses XmlReader which is in turn used with an XmlDocument. This is the asynchronous model which allows a little more responsiveness in the GUI, but does mean a lot of Dispatcher.Invoke().

        private void ReceiveCustomerDetail(IAsyncResult result)
        {
            SqlCommand command = (SqlCommand)result.AsyncState;
            try
            {
                XmlDocument doc = new XmlDocument();
                using (XmlReader resultsReader = command.EndExecuteXmlReader(result))
                {
                    doc.Load(resultsReader);
                }
                Dispatcher.Invoke(() =>
                {
                    CustomerDetails.XPath = "/Customers/Customer";
                    CustomerDetails.Document = doc;
                });
            }
            finally
            {
                command.Dispose();
            }
        }

What I did with the above was to bring it back straight into a WPF GUI and use WPF’s ability to databind directly to XML. Then curiosity got the better of me. I copied the app and produced a version that was almost identical, but used Linq-to-Sql and bound directly to the object model.

SQL to XML Example App
SQL to XML Example App

In use there doesn’t appear to be too much difference between them. I think the XML version is slightly faster but I accept that I may be biased. We’re dealing with a very small data set on a local server however so it’s not really surprising that there’s no immediately obvious difference. To get some results we have to look at SQL Server Profiler.

So I made sure that I did the same repeatable action – I first loaded a list of all the customers and then I selected just one customer, Seven Seas, for display. The differences are remarkable.

Profile of Data Retrieval Using XML

SQL Server Profiler of XML Retrieval
SQL Server Profiler of XML Retrieval

Profile of Data Retrieval Using LINQ

SQL Profile of LINQ Retrieval
SQL Profile of LINQ Retrieval

What we can see here is Linq-To-Sql issuing a rash of tiny queries to pick up lots of individual pieces of information.

Conclusion

The real conclusion is that I probably didn’t pick a great example. It’s clear however that the approach of Linq-to-Sql and my XML based method are polar opposites, the former hitting Sql Server with a rash of small queries, the latter with fewer, much larger ones. Even on local servers round trips cost and I suspect that as the number of users increased and the size of the data increased the performance of the Linq-to-Sql version would start dipping much faster than that of the XML based version.

In the production environment I tend to use multiple result sets because it generally works out cheap to rejoin them on the client side. It’s nice to know however that XML is sitting there in my back pocket, giving me an alternative.

The Death of Apps

Reading Time: 4 minutes

Tweetcaster spam
Tweetcaster spam

It appears that Tweetcaster has just become Spamcaster – it threw a message up on my phone telling me that I had 13 Virus[sic]. I deleted the application immediately and as a precaution checked that it was the only application from “One Louder Apps” that I had.

I’m very disappointed with “One Louder Apps”. I appreciate that all software houses have to make money (hell, we do) and I’m fine with that. I’m fine with free apps being supported by advertising. What I’m not fine with is allowing an application to be hijacked by a con. My phone does not have any viruses and the site / software I was being linked to would almost certainly install malware rather than removing it.

Anyway enough ranting. This got me thinking though about some of the less desirable near inevitabilities of app development.

In the software industry we love the app stores because the barriers to entry to this market are small. You don’t need to be a huge software house with massive resources to write some really clever and useful apps.
There’s a flip side to this coin though, if the barriers to entry for you are low then the barriers to entry for your competitors are also low. Consider the following (rather simplified) story.

You and a mate have a really cool idea for an app. You start coding it in your spare time and release an early version to the market place. It starts getting noticed. At the same time it’s noticed by customers it’s also noticed by potential competitors. They start designing similar apps, ones that have all the features yours does and a few more on top, but it’ll be a while before they get to market. So you have a golden window to make your app the best you can and get the cash in before there’s any real competition.

You’re making a bit of money out of it now though which means you can hire a couple of extra coders. So you all start hacking in features as fast as you can and the app rises in the charts, the revenue rises and everything is looking good. You buy a Porsche.

The code is suffering however from all the hacking and soon you notice that you’re having to do a lot of rework to add a feature. What’s more when you add a new person to the team your output doesn’t seem to increase by one person’s worth, more like half of a person. This is because you’re finding that you’re having to introduce procedures for things, and do documentation and all that overhead that you didn’t have to do when it was just 2 of you. But hey, the money’s flowing in, everything is rosy.

No actually, because if at this point you’re not well on the way to implementing the next killer feature then you’re screwed. Those apps that were designed after yours came to market are going to start coming online. What’s more because they designed in features that you had to hack in later they’re going to be more swish and because their code is still fresh they’re going to be able to implement new features with much less effort than you.

Even if you have got that next feature lined up you’re still in a race that you’re unlikely to win in the log run. You can’t recover your initial velocity, it’s just not possible with a hacked-to-bits code base. It’s always going to cost you more to develop anything than the newcomers to the market. With revenue falling as your market share decreases you can’t afford to throw enough people at the project to brute-force your way back to the top.

Unless you can find some way of drastically increasing your income stream it’s time to put your head between your legs and kiss your Porsche goodbye.

It’s not all doom and gloom though, there are a few ways you can combat this. Not every app / software house crashes and burns quite so pathetically.

For games especially you can release alternative versions – “in space”, “Star Wars edition” etc. that are basically the same code with a few visual tweaks. I could name several game franchises that have been able to do this very well indeed. You can even release “new” games that are substantially the same code as the old and hence don’t need that much development.

If you can use the ascent and some of the initial revenue of the first application to get a second one off the ground then as long as you keep having good ideas for apps you can keep a flow of applications. As one dies the next will become your major revenue earner.

If you use more formal development techniques from day 1 then you’re never really going to have that big burst of activity in the early phase but you’ll be able to build on what you’ve done and maintain your velocity. Competitors will come and go, your app will fluctuate in the marketplace but you stand a reasonable chance of keeping it near the top for a long period of time.

It’s quite fun to look at the successful apps and app developers in the market place and try to work out which they’re doing. Clearly the likes of Microsoft, Google, Facebook etc. are so big they’re largely irrelevant. They need to have the apps, they don’t necessarily need to make money directly from them and they can hurl seemingly unlimited resources at them if needs be.
Most of the smaller firms though you can see quite clearly what their business strategy is.

Visual Studio’s Solution Explorer “Search”

Reading Time: 2 minutes

I’m taking a leaf out of Rob Miles’ book and blogging something I found useful.

It’s perfectly simple – in Visual Studio 2013 (and I’ve noticed in 2012 also) the solution explorer has a “Search Solution Explorer” function. Initially I assumed it just found files but no, it quite happily finds properties, methods, all sorts.

Visual Studio Solution Explorer Search
VS Solution Explorer Search

There are currently 32 projects in our Command and Control solution, as I wrote much of it I know pretty much where everything is but sometimes even I get a bit lost. For new people coming onto the project it must be a real struggle. This could help enormously.

Of course, one could fire up a copy of Cygwin and grep for it, but that’s really not the point!

    find -name \*.cs -exec grep -H MessageSource "{}" \; | less

This is one of the hazards of being in the industry – the Solution Explorer in VS2005 was pretty useless (so everyone used an alternative version). At some point I will have upgraded VS and noticed that the Solution Explorer in the new version was now quite usable. I will have scanned the media on the latest VS release but either I missed or didn’t appreciate the significance of the news about the search function.

Every now and again this happens in the industry – something useful just goes flying past and you don’t realise until months or even years later.

C#’s Missing Switch(typeof(x)) and Lookup Tables of Actions

Reading Time: 3 minutes

…or how to switch on a type in C#.

There’s a method in one of Seed’s controller type classes that’s nearly 1000 lines long. How did it get like that? Well basically it’s one big if-then-else construct because C# can’t switch on the type of an object.

Steady on old chap! This article was written many years ago, as from C# version 7 it can switch on type. That doesn’t mean this technique isn’t still valuable, but it’s no longer necessary for a simple switch on type.

So that old Seed method looked pretty much like this:

if(curryObject is MasalaDosa)
{
    //a few lines of code
}else if (curryObject is VegetableThali)
{
    //a few lines of code
}else if (curryObject is TandooriMas)
{
    //a few lines of code
}
//etc. etc.

The real problem with it isn’t the fact that it’s one giant if-then-else structure it’s that each few lines of code is a few too many. It should really be more of the form:

if(curryObject is MasalaDosa)
    HandleMasalaDosa((MasalaDosa)curryObject);
else if (curryObject is VegetableThali)
    HandleVegetableThali((VegetableThali)curryObject);
else if (curryObject is TandooriMas)
    HandleTandooriMas((TandooriMas)curryObject);
//etc. etc.

Naturally you’d think you could use polymorphism to get around the problem;

HandleCurry(MasalaDosa curryObject)
{}
HandleCurry(VegetableThali curryObject)
{}
HandleCurry(TandooriMas curryObject)
{}
//etc. etc.

In reality though sometimes you can’t or sometimes it’s just more practical to use a switch type of affair. As mentioned earlier though you can’t switch on the type of an object in C# you can only switch on type if you’re using C~ version 7 or later. Alternatively you can use a lookup table (actually a dictionary in this case);

class CurryHandler
{
    Dictionary<type, action<curry="">> actionTable;</type,>

    public CurryHandler()
    {
        actionTable = new Dictionary<type, action<curry="">>
        {
            {typeof(MasalaDosa), new Action(HandleMasalaDosa)},
            {typeof(VegetableThali), new Action(HandleVegetableThali)},
            {typeof(TandooriMas), new Action(HandleTandooriMas)}
        };
    }</type,>

    public void HandleCurry(Curry curry)
    {
        actionTable[curry.GetType()](curry);
    }
    //etc. etc.

In C#, Action is a generic type that represents a method, thus Action<Curry> is a type that represents a method that takes a “Curry” as a parameter. So what we’re doing here is constructing a dictionary that links a Type to an Action.
So when we call actionTable[curry.GetType()](curry); what we’re really saying is; get the type of “curry” and look that up in the dictionary, then take the associated Action and call that method with the “curry” object as its parameter.

I rather like this pattern, once you understand it I think it’s very clear, more so than a switch statement actually because it gives you a simple reference from Type to Action, you don’t have to wade through a ton of case whatever: do_something(); break; or worse if(whatever is someType)…else if (whatever is someOtherType)…
Naturally you don’t have to use a Type as the key, you could use any object as the lookup. You can also use lambda expressions rather than declaring a bunch of new Action… but it’s all too tempting then to write code in the definition of the lookup table and make things messy and unreadable.

It’s not without problems though. As coded above though there’s no protection. If I add a new type of Curry, say DhalMakhani and call HandleCurry with that a KeyNotFoundException will be thrown. We can avoid this easily though and mimic the default: behaviour of the switch statement;

public void HandleCurry(Curry curry)
{
    Action curryAction;
    if(actionTable.TryGetValue(curry.GetType(), out curryAction))
        curryAction(curry);
    //else
    //do whatever we'd do in default:
}

//etc. etc.

I’ve also never checked how fast it is. It could be much slower than the equivalent if-then-else construct.

One possibly advantageous side effect however is that the logic has been moved out of the programming space into the data space. What do I mean by that? Well actionTable is a variable, you can change it. You can add Actions, take them away or change them at run time. This allows you to do some really clever things but should also be ringing some rather large warning bells. With great power comes great responsibility and the temptation to write code that is simply horrible to read and debug must be avoided, even if what it’s doing is really, really cool.

No doubt this is a clever technique, but it’s far from new. For my next trick I’ll explain how this basic technique can be traced back several decades into early digital electronics.

The Revenge of the Sprout

Reading Time: 2 minutes

Sprouts!
Sprouts!

Like any sane and right minded individual, since a young age a good portion of my Christmas lunch time has been dedicated to avoiding the terror of the Brussels Sprout. Tiny pockets of horrible the little green blighters stalk dinner tables up and down the land at this time of year. Leave just a tiny space on your plate and they mount a full assault, screaming their war cry, “Do you want any sprouts oh go on have one oops that was seven oh well they’re good for you!”

This situation is exacerbated considerably in my case. Living in a rural area has some great advantages, but it has its hazards to. In particular there is the danger of knowing a sprout farmer, which I indeed do. So for me not only is there the danger of copping a sprout grenade at a friend or relative’s house I’ve got two enormous stalks of green ghastliness sat in my pantry staring at me.

A little while ago though a good friend of mine took me aside and whispered in my ear. The trick”, he said, “is to cut them in half and roast them with butter and ginger – lovely!”

I didn’t have any butter but I did have some extra virgin olive oil and some ginger paste, so I put a good glug of oil on a baking tray and mixed in half a teaspoon of ginger paste. After taking the outer leaves off the sprouts I then halved them and put them cut-side-down on the baking tray, threw a pinch of salt over the top and chucked them in the (fan) oven at 180 Celsius for 10 minutes.

As promised they were indeed lovely – the outer leaves a little crispy and slightly sweet and the inner full of ginger-laden flavour.

Like many things the problem with sprouts is not the sprout itself, it’s the fact that many people have no idea how to cook them in a way that I like.

Ghostbusting the Central Heating

Reading Time: 5 minutes

Mr Pump
Mr Pump

I lost last weekend, although not in a hotel in Amsterdam[1]
I lost the weekend trying to find out what was wrong with my central heating system. What follows is one of the most bizarre journeys of home maintenance that I’ve ever been on.

It all started when I was woken on Friday by a nasty groinching noise – the sort of groinching nose that an expensive electro-mechanical device makes shortly before it relieves you of the contents of your wallet. Worryingly the only two candidates in the next room were the central heating pump and diverter valve, both of which definitely fall into the category of expensive.

I crossed my fingers that some sort of airlock was responsible so bled the pump and a couple of nearby radiators. Hey presto the system burst back into life so I went back to bed.

On Friday night however, whilst I was cooking, I heard a very similar nasty groinching sound coming from the boiler. My wallet yelped, then ran away and hid. Praying to the gods of home maintenance that I wasn’t going to need to call a plumber I hoped that the boiler was simply resonating a sound that came from somewhere else. Regardless, the system was clearly unhappy so I went upstairs and turned the central heating off, but for some reason I can’t quite fathom left the hot water on.

It’s at this point I need to mention that we have a Y-Plan system – the water that the boiler heats can either be used to heat the hot water tank or the radiators depending on the position of the mid-position (diverter) valve.

What happened next surprised me slightly. The boiler fired up and the pump started running – no nasty sounds. So the problem was clearly not the pump and I started to look very suspiciously at the diverter valve. Motor valves are notorious for failing, jamming and just generally going wrong. So I grabbed the “manual” lever and waggled it about. It moved freely but something else interesting happened – the boiler stayed running no matter whether the diverter valve was sending water to the hot water cylinder or round the central heating circuit.
So I left the valve in the mid-position sending hot water to both circuits and we had heat in the radiators. Until the hot water cylinder got up to temperature, which was rather too soon for my liking.

It’s times like this I’m glad that I have a chunky wood burner.

I had things to do on the Saturday but I did manage to get rather a lot of reading done – service manuals for everything in the system and at the end of it all everything was still as clear as mud. One thing that did occur to me though was to measure the boiler input voltage. When the system thought it was heating hot water – regardless of what it was actually heating – there was a something around 240V at the boiler.
If I switched it to central heating it dropped to 150V. So the nasty groinching sound – the sound like something failing to start was probably not because of a mechanical failure but because of a lack of juice.

I breathed a sigh of relief – the fault was electrical. The only component unique to the central heating circuit was the room thermostat my beady eye of suspicion fell upon it. Basically a thermostat is just a temperature controlled switch so I decided to bypass it, just to test. In theory this was a perfectly valid thing to do – if the central heating worked with the thermostat bypassed it would point very strong indeed at the thermostat being at fault. The problem was that the central heating control circuitry is a mixture of two different manufacturer’s wiring instructions and I misinterpreted. So instead of bypassing the thermostat I actually shorted out the output of the programmer. I had a pretty good idea what I’d done when I flipped the “On” switch and heard the almost instant clank of the trip switch flipping “Off”. I may have sworn. Quite a lot. This is because I’m a trained and apprenticed electronic technician and as such this kind of control circuitry is as much, if not more my domain of expertise as an electrician. So making this sort of cock-up is highly embarrassing. I swore some more, to make sure there was enough swearing to communicate just how annoyed with myself I was.

Then I removed the erroneous link wire and prayed once again to the Gods of home maintenance, hoping this time that my stupid mistake hadn’t fried anything expensive. After checking the circuity and components for any physical signs of damage I crossed my fingers and flipped the switch back on again. Initially I did think I’d got away with it. Nothing fizzed, popped or banged, there were no strange smells and nothing appeared to be getting hotter than it should. Nothing that is apart from the boiler which was merrily heating water and the pump was happily whirring away. This was odd because both the central heating and the hot water were turned off at the time.

At least I knew I didn’t need a plumber. I knew who to call; Ghostbusters.

Now I’ve never been particularly frightened by the paranormal so I thought I’d take this opportunity to do some investigation. If I turned the thermostat up to 30 degrees the boiler stopped. If I turned it down to 10 degrees and the boiler started again – the boiler, pump and thermostat were working perfectly.

The real issue though was that I’d made matters worse. Not only did I have the problem of the nasty groinching sound to solve but my central heating was now being operated from beyond the veil. So I grabbed a plastic colander, put it on my head[2] and began my journey into the supernatural. I’d recently short-circuited the output of the programmer and now there was a switching malfunction. I had a pretty good idea what the problem was. Inside the Danfoss CP75 programmer are two relays, one for the hot water circuit and one for the heating. With it all safely isolated I popped the case off the central heating relay and found precisely what I expected – a miniature poltergeist with a teeny-tiny arc welder had mischievously welded the contacts together.
The real explanation is a little more mundane – this is not unusual for a relay that had been massively, but only momentarily, overloaded (say by some idiot shorting the output). As the contacts meet the sheer amount of power melts the surface and they weld together. The breaker then cuts out and prevents further damage. If you’re lucky the damage is only superficial and a little tap will break the weld.

I was lucky. What I did notice however was how much crud there was around the contacts. A few minutes with some fine grade wet-and-dry soon had them looking like new.

I put the programmer back and hey presto the system now works perfectly both for hot water and heating. Apparently so much crud had built up on the relay contacts for the central heating circuit that it was no longer making proper contact at all.

Danfoss CP75
Danfoss CP75

A good result in the end. Sure calling a “heating engineer” might have saved me quite a lot of time – someone with experience would probably have identified the programmer much more quickly than me. But then I wouldn’t have got to run around the house with a kitchen utensil on my head singing old Dean Martin tracks[2]
They’re also unlikely to have identified the output relay directly. Those programmers are no longer made so not only would a “heating engineer” be charging me a premium for a new programmer I’d be facing a substantial bill for wiring it in, too.


[1] If you don’t get the reference search for Lloyd Cole & The Commotions – Lost Weekend
[2] Insert “as is the tradition of my people” or “as my faith demands” as you choose.

Null-Coalescing Naughtiness

Reading Time: 2 minutes

The Cat's Favourite Spot on a Dark Morning.
The Cat’s Favourite Spot on a Dark Morning.
Something struck me yesterday. Something Evil. It comes out of the fact that you can use C#’s Null-Coalescing operator – that’s ?? to most people – with reference types as well as nullable (value) types.

Most C# devs I dare say will be familiar with C#’s nullable types. They’re really System.Nullable<T> but C# allows you to use the nice shortcut of just putting a ? after the type declaration…

    class ExampleClass
    {
        int? exampleField;
        System.Nullable<int> isTheSameAsExampleField;
    }

You quite often see ?? used with examples of nullable types but it can actually be used with any reference type too. String is the most obvious[1]. For instance there’s a very common gotcha of performing some operation on a string that could actually be null. For instance,

    if(someObject.someString.Contains("SOME TEXT"))
    {

If someString is NULL (as opposed to "") this will throw a NullReferenceException

One might use C#’s guaranteed short-circuit evaluation and left-to-right evaluation to get round this

    if(someObject.someString != null && someObject.someString.Contains("SOME TEXT"))
    {

(yes I could also use String.IsNullOrWhiteSpace etc)

But it’s also possible to use the ?? operator

    if( (someObject.someString ?? "" ).Contains("SOME TEXT"))
    {

Note that although the logical result of these two options is the same the way it accomplishes that result is subtly different. In the first example if the string is null the Contains will never be executed. In the second it will be executed against the "" object (which clearly doesn’t contain "SOME TEXT"). The result in both cases is that the if condition as a whole evaluates to false, but it does so for different reasons.

…and so now here’s a way you can use these powers for evil. Let’s say you need to add something to a list, the problem is that you don’t know if the list has been instantiated yet, but if it hasn’t you need to instantiate it. This type of situation actually happens quite a lot and this solution works, ho-hum.

    List<string> list = null;
    ...some code...
    (list ?? (list = new List<string>()) ).Add("blah");

It works because C#’s assignment operator (single =) produces a result, the result is the value that was assigned. So this code says "if list is instantiated then use it for the Add. If not then instantiate a new List<string> and assign the value to list then take the result of that assignment (the newly instantiated object) and use that for the Add".

In summary then, you can use ?? against any type that could have a null value, not just System.Nullable<T>, but be careful with it because it’s a power than can be easily abused.


[1] string is actually a reference type, but it behaves like a value type

The Accidental Feature Hazard

Reading Time: 3 minutes

Plainly Not a Racing Car...
Plainly Not a Racing Car…

An accidental feature has just bitten us in the butt. I thought it worth a quick mention because it’s one of those things that happens quite often in the software industry and it’s more complex than it might first appear.

In this case it’s the ordering of a list – the customer had noticed that the list was always in a particular order. They wrote their training notes and indeed their operational procedures based around the fact that this list was always in that order.

We didn’t explicitly program the list to be in that order, we didn’t declare it as a feature that it’d be in that order, nevertheless it so happened that it was. Then we fixed a bug and as a result the ordering of the list changed slightly.

Now we have a bug report complaining that we’ve broken the list.

There are certain elements of the software development world that now would be waving their in-depth specifications at us crowing about how bad Agile is at this kind of thing and how if we’d “done it properly” then it would have been clear from the start that the list was in no guaranteed order.

They would be mockingly waving those specification documents if a) they could move them without a fork-lift and b) they hadn’t been put out of business years ago by Agile software houses like Seed.

Would it really have helped though? Perhaps – maybe the customer wouldn’t have relied on the ordering of the list or maybe they’d have spotted that it wasn’t ordered and asked for a change in the specification before the initial delivery.
Actually that isn’t so likely. Such specifications are often so complex and confusing that they never get much distribution within the customer organisation and if they do the number of people who understand them is limited (often to zero). The likelihood that the people who needed to know that the list was not in a guaranteed order actually knowing this is rather far from 100%.
Naturally there is also the risk that no matter how detailed the specification that particular detail was omitted.

So it is by no means certain that having an in-depth specification would have prevented this from happening. The only thing it is likely to do is make the contractual situation unequivocal.

That’s not the real question though, what we have to consider is what the result of us batting it back to the customer with the comment “well we never said it would do that in the first place” would be. Even with a water-tight contract such a response would have to be carefully considered.

The software industry today relies on good customer relations, repeat business and reputation. We want the customers that are using our software to continue using our software, not least because they pay an annual licence fee. Even if you’re an app developer for smartphones you have to be careful – if you annoy your customers they post bad reviews and there’s only so many bad reviews you can face down before you app dies in favour of someone else’s that has better reviews.

From a purist software development point of view this list ordering is a feature request, indeed that’s what we’ll call it internally. The relationship with the customer however is a far more complex matter – every customer tries to get at least some of their feature requests through as bugs in the hope that they’ll either get them for free or that they’ll be treated with a higher priority. If you let the customer walk all over you then you’ll be in trouble. On the other hand the age of profiteering has long passed and if the customer thinks your trying to charge them unjustly to fix genuine bugs then you could find your reputation damaged and your business will suffer as a result.

We may think of Computer Science as a logical, scientific profession but the reality of being a good software developer is that you not only need to understand logic, but you need a good grasp of politics too.

Behind the Scenes – Internet and the Office Roof

Reading Time: 7 minutesThere’s almost a throw-away comment in my last article, The Internet and the Office Roof “I was prepared”. We all knew about the St Jude storm and we knew fairly well when it was going to hit. But what does “prepared” mean? What did I do and what do I have that made me well prepared?

In many ways that story is far more important than me jumping on and off the office roof trying to find some mobile Internet. There’s some kit I have that’s useful but let’s start here because it’s simpler;

Things I Did Before the Storm

Loose objects outside are problematic. They can get blown around and damage themselves, other things or simply get blown away. So the day before the storm I had a wander around. Bins are a classic problem but ours have a little pen they live in and I thought them safe.

Garden furniture is another problem but ours is folding, so I collapsed it all and weighted it down. It’s quite heavy so in that state I was confident it wouldn’t budge.

I also surveyed the structures around the house – the decking, the fencing, the bin pen, the Wendy house. Were these in good condition? Were there any parts loose or vulnerable that might need fixing down?

Water Container
Water Container

I took the time to draw some water into the camping container. Some large scale power outages were possible and there are a lot of electric pumps in the water network. Although we didn’t lose water there were disruptions nearby.

Rechargeable devices are great, but useless if they’re not charged. So the day before the storm I made sure that everything that I use and all out battery packs were on charge well in time for the storm.

I had a good look at the house too – did everything look in good order? Again anything loose or vulnerable could cause big problems. Chimney pots for instance are pretty big and heavy, you don’t want a loose one crashing through your roof.

Things I Have that Might Help

An “A” rated freezer like mine is a far better place to store cold food – even if it’s turned off – than a cool  box. However the greater the thermal mass in the freezer the longer it will remain frozen. If you have a load of cool blocks it’s worth chucking them in the freezer a day or two before the storm (which I did).

I always keep a stock of tinned and packet food in as well because this is the country and things happen. A few days worth of relatively nonperishable food is a good thing to have regardless. I make sure that I always have rice, lentils, dried egg noodles, soy sauce and spices. You can make a stir-fry with all sorts of things, most notable vegetables which you can store for a good period of time without a fridge and you can always make lentil curry.

I have a lot of camping gear – stove, lights etc. I made sure they were all easily accessible. It’s nice to have a kettle rather than just boil water in a saucepan, but it’s by no means essential!

Batteries
Batteries

A lot of camping things are battery powered rather than rechargeable so I make sure that I always have a small stock of (the right) batteries.

 

Three of my favourite (portable) lights are these.

Nightsearcher Trio
Nightsearcher Trio

The NightSearcher Trio is available from a number of places. It’s a rechargeable LED torch and it’s exceedingly bright. It has a big handle that’s easy to grab and a flat bottom which means that it can be placed upright – pointed at the ceiling. In that mode it will happily light an average sized room. It claims to work for up to 23 hours. I can’t vouch for that but I can vouch for the fact it lasts many hours indeed.

 

UltraFire Torch
UltraFire Torch

The Ultrafire Q5 is another torch, but it’s a pencil variety. It can run off its own special battery (expensive) or a pair of AAs. It’s nothing like as bright as the Nightsearcher but is pretty impressive for the size.

 

Tilley Lamp
Tilley Lamp

A Tilley Lamp – this is a pressurised paraffin lamp so you really need to know what you’re doing to use (and maintain) one of these safely. It throws off a reasonable light and will last several hours on a tank of paraffin (kerosene). Its big advantage is that it also throws off a lot of heat as well so if you’re stuck with neither light nor heat it’s ideal.
The most dangerous thing about these is getting one lit. After that – with reasonable caution – they’re safe to use indoors.

 

Powergen
Powergen

The Powergen is a mobile phone power pack. It’s essentially just a battery with 3 USB ports on it that provide power. It also has a LED torch on it. It’s good for about 4 charges of a modern smartphone.

 

Old Corded Phone
Old Corded Phone

A corded telephone – when the electricity fails generally a cordless phone base station stops working. The resilience of the UK Telephone network is actually quite good and the chances are that even if the power is out the phone will actually still work – as long as you have a phone that doesn’t need any power other than from the phone line itself. This particular phone lived in a workshop for years, hence the sawdust.

 

Nokia 6310i
Nokia 6310i

A Nokia 6310i. It’s an old, stupid mobile phone but from a disaster-coping view it stands out in 2 ways.

  1. The transmitter and receiver on this model were particularly good.
  2. It has a genuine 3 week standby time.

This gives me a pretty good chance of being able to communicate even if everything else goes wrong – and for some time too. Although I still have to sit on the office roof (or walk up the nearby hill) to use it.

 

Tea Light
Tea Light

Tea Lights – small self-contained candles that apparently can last up to 8 hours. They last 4, but they’re cheap and can be used relatively safely without the need for candle-sticks.

 

12V Power Pack
12V Power Pack

A 12V power pack. These are actually designed to start cars that have a flat battery but they come with a range of accessories, notably torches and car accessory sockets. We have one primarily to keep our smart-phones topped up for a week or so when we’re camping well away from power. There are a lot of things you can run from a car accessory socket. Some power packs even have inverters so you can use normal household appliances with them (although probably not for long).

 

Pure One Portable Radio
Pure One Portable Radio

A battery powered radio – in this case actually a DAB and FM / AM radio. Local radio is often the most reliable source of information when all other forms of communication are failing.

 

Bombay Sapphire
Bombay Sapphire

Gin – it’s good for cleaning wounds and in dire circumstances it can be used as fuel. Apparently some people drink it, too.

 

Work Related Things

Half of your county might be without power but the rest of the world doesn’t stop. You’ve got to try to continue to work as best you can. Naturally I have back-up plans.

My main machine is a high-end laptop with an SSD that I normally use docked. This has two advantages.

  1. It’s effectively its own UPS.
  2. I’m mobile. I can work anywhere I can put the laptop down without having to move a lot of stuff.

I have a good quality laptop backpack bag. This means I can cycle easily with my laptop – useful if for whatever reason the car in unavailable or, let’s say, the local roads are strewn with broken branches, fallen trees and other debris.

I did consider getting a mobile broadband deal but I end up without Internet / WiFi so infrequently that it just makes no sense. For the amount that I need it I can tether my phone instead.

My parents-in-law are in easy cycling distance and they’re on a different telephone exchange and use a different ISP which means that the chances of the Internet failing in both locations is fairly small. There are also (actually) a few WiFi hotspots in the local town and there’s another town that’s not too far away that has loads.

I have a SIP phone which means that I have a telephone – the same telephone – wherever I can find some Internet with half reasonable bandwidth.

The Internet and the Office Roof

Reading Time: 6 minutesI thought I’d got away without any ill effects from the “St Jude” storm on Monday – not so. My Internet failed yesterday morning; I felt like I’d had an arm cut off.

I’m a remote worker – have been for 2 years (a fact that I really should blog more about). I knew the lack of Internet was going to cause problems but I didn’t realise exactly how much.

Tom on the office roof
Some Internet, at least!

The first thing I had to do was call the ISP to find out what was up. What’s their phone number? Well it used to be on a piece of paper under the router along with all the technical (but not security) details of the connection. The paper was missing. There’s no mobile phone signal at my address so the next image I would like to present to you is me, stood on the roof of the office at the end of the garden waving my phone in the air because if you’re really lucky on a clear day you can get some mobile signal there. Eventually I got enough mobile Internet packets to find their phone number.
Apparently the Internet problem is due to local power problems and they can’t give me a fix time because the power company won’t give them one.

No problem I say to myself – my team know what they’re doing they can survive without me as long as it’s not days. I’ll just let them know. Precisely how am I going to do this then? I’m usually pretty easy to contact, Email, Skype, MS Lync, Google Talk, SIP phone, none of which are going to work. I don’t even have any of the team’s mobile numbers. Telephone again then. The next problem is that I never actually call the Departmental Office so I don’t know the number.
That’s me on the roof of my office again waving a mobile phone around for 10 minutes trying to find the number before I realise that although Outlook won’t connect I will still have my email and the office number will be in someone’s signature – sorted.

Now down to business and for the first time I’m ahead of the game. I know I won’t be able to connect to the Team Foundation Server so I take a back-up of the source tree and then open the solution offline. The problem I’m working on is a complex one, the code didn’t make much sense – I mean I understood what it did, but what it did didn’t seem logical. I needed some context so I wondered if it had always been done like this. Usually I’d look at the module history, but that’s all in the Team Foundation Server that I don’t currently have access to.

Never mind I think, I’ll tackle a different problem, one that’s SQL Server based. Quickly I realise that I can’t remember the syntax for the OVER / PARTITION aggregate functionality. So I have a go, get it wrong and then hit F1 for some help. Which is online, so that’s a non-starter.
But I do have a book on SQL Server that I can refer to. In Safari, the online book system. That’s not going to work either.

Clearly this lack of Internet is becoming quite a problem. I am inventive though and I’ve got a spare satellite TV dish. I wonder to myself if perhaps I mount my mobile phone at the focal point of the dish and direct it at the most line-of-sight phone mast I might just get enough signal strength to tether the phone. I suspect that the answer is a strong no but maybe there is something sensible and practical I can do to improve the signal. I’ll just Google… oh wait, no I won’t.

Small scale disaster planning though is something I blogged about a while ago so I should be on top of this right? The primary backup plan for power / internet loss is to go to my in-law’s house in the nearby town. The problem is that they’re at work. My wife has a key but she’s away on business. To be honest this kind of suits me because I find laptop screens rather limiting, I far prefer the large pair of monitors I have in my office so if I can manage without Internet that’s better for me.

Nevertheless it would be good for me to get some Internet at some point, check emails, make sure the team are OK etc. The secondary backup plan is to find some public WiFi. There’s none in the village (and it wouldn’t work even if there was) so I ponder popping into the local town for lunch – the car is also away with my wife on business but the weather looks OK and I have a bicycle and a laptop backpack bag. I wonder what the weather forecast will be for later though – I’ll just look that up on the Internet… erm, no. Oh well, I can risk it, I have wet weather gear. I’m certainly not going to risk it though unless I can guarantee a cafe or coffee shop that has WiFi and I don’t remember seeing any adverts when I was last there. I’ll just Google… oh no, wait, no I won’t.

Just as I’m thinking this something pops into the back of my mind – I’m sure I remember reading when I signed up for my broadband Internet access that they had a backup dial-in option. The details of that will also be on that missing piece of paper but I remember printing it out from an email. So it’s back onto the office roof for me searching through my email history to find the details. They do indeed, but sadly it’s a national call rate number which means it would get expensive very quickly – but it was enough just to check my email.

At about 9:30pm the situation got even worse, I lost electricity as well. I live in the country where there is no street lighting. I was on the stairs and it suddenly went dark. I was prepared for this – there were torches at strategic points around the house and I got the candles and lighter out so I could find them in the dark.

What I wasn’t quite prepared for was how dark it was, it was pitch black. So I sat down with a view to waiting until my eyes picked up some light. Unusually for the house however I had my mobile phone in my pocket so a few seconds later I was carefully making my way down the stairs to one of the torches.

Electricity is another strange thing – it’s easy to overlook how important it has become to our lives.

The freezer was defrosting. As I had no idea how long I’d be without power the only thing I could do was put some towels under it and hope it wasn’t too long.

The central heating is gas, but of course the pump and all the controls are electric. Fortunately I have a multi-fuel stove which is definitely not electric in any way at all and being honest it wasn’t that cold.

Fortunately the cooker is dual-fuel, which means that the gas rings still work. It does leave me without a grill or oven though which limits what I can cook.

The house phone is a cordless model – the handset might work but the base station won’t. I keep an old fashioned corded handset just for this, so I was able to plug that in. It is worth noting that you shouldn’t assume that if you’ve got no power the phone won’t work. In reality it usually does – in the UK at least.

My alarm clock is a Lumie Bodyclock – it’s great most of the time but it is very definitely mains powered. I don’t have a mechanical alarm clock, but I do have a mobile phone so there was a solution there.

The weirdest thing though was this – it was night and I didn’t know which of the house lights were turned on and which off. This meant that if the power came back on at say 3am (which it did) some of the house lights would turn on, possibly without me knowing.

This morning I had power but still no Internet, so I’m currently sat at my in-law’s dining room table borrowing their Internet and just having to deal with the tiny laptop screen and horrid keyboard.

Being well prepared was definitely worth it – clearly I knew that losing electricity would be a serious inconvenience but just how much I rely on the Internet surprised me considerably.