I'm now writing on Medium

After spending more time maintaining my blog's build process than writing, I've started writing new things over on Medium.


Keeping things synced between Medium and here was a pain, so older articles will continue to live here (and links won't break). One day I'll procrastinate and figure out a clean way to cross-post, but today isn't that day.

Read the new stuff

# Older posts

Pull-Request style: 100 hills to die on, 12/31/2020

Back in the early days, once we’d whittled our keyboards from blocks of granite, we’d debate tabs vs spaces. Now it's pull requests...

Read more (5 min read)


Generic names are a smell, 11/27/2020

Names are powerful. Good names are intuitive, and communicate intent and meaning to the reader. Good names help us have discussions…

Read more (6 min read)


Running a remote hack day, 4/11/2020

A couple of weeks ago we held our first Remote Hack, a free, fully-remote hack day. Here’s what we did, how it went, and how you can run one.

Read more (5 min read)


Lessons learned from the NPD Find & Explore project, 6/13/2019

Earlier this year I had the pleasure of working with the Department for Education, Nimble and Paper.

Read more (6 min read)


Invest in internal tooling, 7/31/2018

Empower colleagues to solve their problems early to retain your development velocity

Read more (5 min read)


Security is not a 'pro' feature, 6/1/2018

Sustainability in Open Source software development is hugely important, but we need to walk the path carefully.

Read more (4 min read)


A simple HTTPS proxy with Nginx on Docker, 5/19/2016

Add a lightweight nginx container to your Docker setup to test HTTPS-related things.

Read more (5 min read)


Faster dependencies with Docker, 4/28/2016

This post explains how to speed up your builds by seeding your Docker image with most of your dependencies, without resorting to data volumes.

Read more (7 min read)


Conferences aren't as accessible as we think they are, but they're getting better, 9/11/2015

Before the 2015 Full Stack Fest, I hadn't really given any thought to how accessible a conference is past whether or not it had wheelchair ramps and lifts. It turns out there's _way_ more to making an event inclusive than that.

Read more (3 min read)


Migrating user avatars to circular crops, with ImageMagick, 9/5/2015

Picture the scene: you have a few thousand users with avatars on your site. You want to change from a boring 4x3 photo to a cool and hip circular crop. You know it'll look great for new users, but we don't want to leave the existing ones behind.

Read more (4 min read)


Kitematic for boot2docker users, 8/28/2015

A while ago I switched from using boot2docker directly to the Kitematic Mac app. Although Kitematic generally makes life a bit easier when managing Docker containers, it was a bit of a pain to get it running.

Read more (2 min read)


Constraining width for LabKey WebParts and Views, 6/16/2015

Wrap your contents in a table with `table-layout: fixed; width: 100%` and the contents won't push the surrounding page to wider than the browser window.

Read more (2 min read)


Reclaiming my Saturday mornings, 3/22/2015

You hear it everywhere: 'if you want something doing well, do it yourself'. Maybe the primary source is beleaguered managers in stagnant organisations where delivering on promises is the exception rather than the rule, who knows.

Read more (5 min read)


App-wide AngularJS alerts, 3/17/2015

Generic alerts are a common requirement in most web applications, and as your Angular application grows in complexity the importance of a standardised way of feeding back to the user gains importance with it. Luckily it's quite straightforward to leverage Angular services as a system-wide alerting tool.

Read more (2 min read)


Give and tell challenge, 9/27/2014

The Ice Bucket Challenge has been a tour-de-force for charitable donations, and has raised a staggering amount of money for the undoubtedly underfunded organisations in the US and here in the UK

Read more (4 min read)


JSOxford NodeBots, August 2014, 8/27/2014

On the 23rd of August we ran the last event in the JSOxford 2014 Summer of Hacks, building JavaScript powered NodeBots. Cue maniacal cackling as we plan to take over the world.

Read more (6 min read)


Groovy SOAP clients with ws-lite, 8/21/2014

When we needed to quickly build a proof-of-concept to test a set of SOAP services I thought: 'this is perfect for Groovy, and it's DSL support will mean talking to SOAP won't require stub generation or any of that pain'. I was almost right.

Read more (4 min read)


Oxford's Summer of Hacks 2014 – Code Retreat, 8/6/2014

On Sunday the 6th of July we ran the second Oxford Code Retreat, so here's a few notes I've made about the event

Read more (7 min read)


Testing Rhino JavaScript with Eclipse, Gradle, Groovy and Spock, 3/27/2014

A colleague was wrangling with JavaScript testing, but with an unusual constraint: the code runs on the Rhino JS engine. After a bit of head-banging, I learned that continuously testing JavaScript written for Rhino needn't be arduous.

Read more (5 min read)


Disqus comment threads on a docpad homepage, 2/27/2014

I really do get on well with docpad. Adding comments to the homepage blog entry was a little tricky though, so here's the workaround I applied.

Read more (3 min read)


Using Grails respond for HTML, JSON and XML responses, 2/25/2014

This post describes a simple workaround which provides a meaningful response to a JSON/XML request as well as a user-friendly rendered 404 exception for humans

Read more (3 min read)


Cycle safely please Oxford, 2/24/2014

Cycling can be dangerous. Most of the time it's not, and it's a great, healthy, relaxing way to travel. This evening was not one of them, and I passed a cyclist who'd just collided with a car and was in a considerable amount of pain.

Read more (2 min read)


Open Data Day 2014, 2/22/2014

This was my first full-day hackathon, and although we didn't achieve everything we set out for it was a great day with great people

Read more (5 min read)


Testing double-click events using Geb, 2/6/2014

Testing basic interaction with Geb is easy, but the 'intuitive' way of doing double-clicks fails silently and without any real indication as to why. Fortunately there's a simple solution!

Read more (2 min read)


Bower dependencies with Gradle, 1/23/2014

We all know it's important to be able to build your code in one step, but when I came to build a project I'm working on at home I found it was actually a bit of a faff. Gradle came to the rescue, and in 15 minutes we made steps towards having a 1-step setup and build.

Read more (3 min read)


Preparing a Git repository for open-sourcification, 12/16/2013

There's an easy way in Git to go through your history and remove the offending articles

Read more (4 min read)


Pi-powered central heating phase 1, 12/1/2013

This post is a summary of what I've done and learned, in case I forget it all next week

Read more (13 min read)


Cycle commuting: the good, the bad and the ugly, 11/21/2013

I've been commuting to the John Radcliffe Hospital in Oxford for the last week or so, and the hugely variable quality of cyclists, motorists and pedestrians has been a bit of a shock, so this post is a collection of my notes on transitioning from being "a cyclist" in the countryside to "a cycle commuter" in the city.

Read more (15 min read)


Setting up Grails code quality tools with local Sonar, 11/21/2013

We want to be able to measure code quality for a Grails/Javascript project I've just joined. I have had good experiences with Sonar before, so set out to get the important (to me) metrics from one into the other

Read more (3 min read)


Plans for automating central heating control with a Raspberry Pi, 11/20/2013

Moving into a stone-built cottage with single glazing and bottled gas central heating has been a (good) learning experience.

Read more (5 min read)


Puppet talk, 10/2/2013

A talk I gave at Software Alliance Wales lightning lunch on the 27th of September 2013

Read more (2 min read)


Using GPG to encrypt backups, 9/12/2013

If you're doing off-site backups (and if you're not, you should), you've probably wondered how much you trust the place you're uploading to

Read more (4 min read)


I've moved, 8/24/2013

After a long deliberation, I've finally moved my blog away from Wordpress

Read more (1 min read)


Simple Rsnapshot backup over FTPS, 8/22/2013

In this post I'll walk you through setting up a simple backup solution using Rsnapshot and CurlFTPfs to retrieve files from an FTP/FTPS server. The result is a flexible backup solution with multiple retrieval points.

Read more (7 min read)


Some notes on backup, 8/18/2013

Small business backups are a minefield. Here are some thoughts on how to come up with a strategy that won't leave you at a loss.

Read more (8 min read)


Refactoring a directory into a git submodule, 8/16/2013

To release the Rsnapshot Puppet module I needed to extract the module directory from our entire Puppet configuration Git repository

Read more (2 min read)


Rsnapshot Puppet module, 8/15/2013

Over the past couple of weeks I've been building a full-fledged Rsnapshot module for Puppet. What started as a simple puppet-isation of an install turned into a labour of love to build my first publishable Puppet module.

Read more (3 min read)


Managing sudoers with Puppet, 8/13/2013

Managing the sudoers file of the puppetmaster with Puppet is like playing with fire while drenched in petrol. If you must do it be really *really* careful!

Read more (4 min read)


Testing Octopress and Heroku, 8/11/2013

Octopress is a tool for building static websites and blogs from plain text files, and allows local development before pushing to your live blog. Best of all, it's designed with Git in mind.

Read more (3 min read)


Setting up OS X Mountain Lion, 6/10/2013

Last month I installed a second internal drive on my Macbook Pro to increase the capacity to nearly a terabyte. Foolishly forgetting that every time I reinstall the OS all the little tweaks from the past n months are forgotten

Read more (3 min read)


First ski of 2013, 1/20/2013

Granted, by alpine or even Scottish standards our trip was short, but you can't beat getting out and skiing without the flights and faff

Read more (2 min read)


Winter wonderland, 1/18/2013

So the snow has come to North Wales! Panic ensues, as people abandon their cars all over the place

Read more (1 min read)


How do you backup a book?, 1/2/2013

I'm a big fan of paper books because they're just so easy to borrow and lend, but I've hit a bit of a problem: persistence. I noticed the other day that the wall was damp next to the bookcase

Read more (2 min read)


Maven sonar:sonar failure for multi-module projects, 8/16/2012

After refactoring a small project to manage subversion auth information into multiple Maven modules I started running into what I assume is a fairly common problem: trying to build a child module which depends on an edit applied to a different module which hasn't been built yet

Read more (2 min read)


Using JIRA to manage a skills registry, 4/5/2012

Maybe my search-foo isn't what it used to be, but it seems that there's no standard method for recording employee's skills and training requirements against a central skill set. Our ISO 17025 accreditation requires our skills matrix to be audited, and we need to use it to prove that everyone has the necessary skills to carry out the tasks they're assigned

Read more (2 min read)


Cleaning up if-else regex matches in Perl with given-when, 4/5/2012

One of our applications written in Perl parses large text files to collect information about it. We've ended up applying it (over time) to various different areas, and we're now in a position where we create new versions regularly

Read more (2 min read)


Blogging about software using Textmate, 4/4/2012

I'm trying to force myself to be a better contributor to the software development community, and part of that is writing up my rough notes each time I solve an interesting technical problem

Read more (2 min read)


Downloading TV series with BitTorrent: getting The Daily Show and The Colbert Report in the UK, 3/31/2012

For anyone with a basic knowledge of the Unix terminal, here’s a quick guide to getting the Daily Show with John Stewart and The Colbert Report onto your computer

Read more (6 min read)


pfSense and VirtualBox, 6/27/2011

Thinking of installing pfSense on VirtualBox to test out the functionality. Great idea!

Read more (1 min read)


Smaller (scaled) logos for Mythweb's Elkin theme, 12/5/2010

I really do like MythTV, mostly because I like fiddling with things for hours to make them 'just so'

Read more (2 min read)


Checking an annotated field is an enum, 11/24/2010

Whilst building an annotation processor for a Seam/Wicket project I'm working on I needed to do a specific action if the annotated field was an `enum`

Read more (2 min read)


Mythtv Remote X10, 8/19/2010

I have an ATI Remote Wonder remote, which I've been quite happy with for the last couple of years. Not that happy though (or maybe I just like tinkering), because I set about trying to make the remote more responsive

Read more (1 min read)


Posting syntax highlighted source code to Wordpress, 7/17/2010

Syntax highlighting in Wordpress is actually pretty easy

Read more (1 min read)


The beginning, and the end of blogging, 7/15/2010

For a moment, I thought writing about code in Wordpress was hard

Read more (1 min read)