Last updated: March 31, 2020 10:22 AM (All times are UTC.)

March 28, 2020

As I’m self-isolating with my vegan daughter, I’ve been trying to cook healthy vegan meals. We had a couple of leeks in the fridge which needed to be used up, so I invented this leek and potato soup, which was pretty delicious.

Lovely soup


  • leeks
  • potatoes
  • medium onion
  • A stick of celery
  • 2 Veg stock cubes
  • Marmite
  • chilli flakes
  • Dried herbs (mine was a mix of basil, oregano, parsley, marjoram, sage and thyme according to the packet)

Peel and chop potatoes into cubes around 1cm. Chop the leeks into chunks about 1cm wide. Chop the onion finely. Fry it in a little oil. until it’s translucent. Add the potatoes and fry for a few minutes. Dissolve the stock cubes in around 2 litres of boiling water. Add the liquid to the pan. Add the leeks. Let it bubble. Chop the celery, and add to the pot. Add a tablespoon of marmite, 2-3 tablespoons of the mixed herbs and some chilli flakes. Stir it all up. Simmer for about 15 minutes. Enjoy!

March 27, 2020

In designing a relational database schema, many people will automatically create a column id integer primary key for every table, using their database’s automatic increment feature to assign a new value to each row they insert. My assertion is that this choice of primary key should be the last resort, not the first.

A database schema is a design artifact, describing the data we want to store and the relationships between records (rows) in those data. It is also meta-design, because the schema constrains us in designing the queries we use to work with the data. Using the same, minimal-effort primary key type for every table then avoids communicating information about the structure and meaning of the data in that table and imposes irrelevant features in the queries we design.

The fact that people use the name id for this autoincrementing integer field gives away the fact that the primary key is used to identify a row in a database. The primary key for a table should ideally be the minimal subset of relevant information that uniquely identifies an individual record. If you have a single column, say name, with not null and unique constraints, that’s an indicator (though not a cast-iron guarantee) that this column may be the table’s primary key. Sometimes, the primary key can be a tuple of multiple columns. A glyph can be uniquely identified by the tuple (character, font, swash) for example (it can, regardless of whether this is how your particular favourite text system represents it, or whether you think that this is a weird way to store ligatures). The glyphs “(e, Times New Roman Regular 16pt, normal)” and “(ct, Irvin Demibold 24pt, fancy)” are more readily recognisable than the glyphs “146276” and “793651”, even if both are ways to refer to the same data. A music album is identified by the artist and the album name (he says, side-eyeing Led Zeppelin): “A Night at the Opera” is ambiguous while “(Blind Guardian, A Night at the Opera)” is definitely not “(Queen, A Night at the Opera)”.

Use an integer identifier where there is no other way to uniquely identify rows in a table. Note: sometimes there is another, more meaningful way, even where that just means using somebody else’s unique identifier: different copies of the same book will have unique shelfmarks if they’re part of a library, for example. People in an organisation may have an employee number, or a single sign-on user name; though there may be privacy reasons not to use these.

A side-effect of using useful information to identify rows in a database is that it can simplify your queries, because where your foreign keys would otherwise be meaningless numbers, they now actually carry useful information. Here’s an example, from a real application, in which I’m sad to say I designed both the “before” and “after” schemata.

The app is a risk management tool. There are descriptions of risks (I’d like to believe that they all at least have a distinct description but I can’t be sure, so those will use integer id PKs), and for each risk there are people in certain roles who bring particular skills to bear on mitigating the risk. The same role can be applied to more than one risk, the same skill can be applied by more than one role, and one role may apply multiple skills, so there’s a three-way join to work out, for a given risk, what roles and skills are relevant.

The before schema:

create table risk (id integer primary key, description varchar not null, weight integer, severity integer, likelihood integer); -- many fields elided
create table role (id integer primary key, name varchar not null, unique(name)); -- ruh roh
create table skill (id integer primary key, name varchar not null, unique(name)); -- the same anti-pattern twice
create table risk_role_skill (id integer primary key, risk_id integer, role_id integer, skill_id integer, foreign key(risk_id) references risk(id), foreign key(role_id) references role(id), foreign key(skill_id) references skill(id));

In this application, we start by looking at a list of risks then inspect one to see what roles are relevant to mitigating it, and then what skills. So a valid question is: “given a risk, what roles are relevant to it?”

select distinct inner join risk_role_skill on = risk_role_skill.role_id where risk_role_skill.risk_id = ?;

But if we notice the names of each role and skill are unique, then we can surmise that they are sufficient to identify a given role or skill. In fact, the only information we have about roles or skills are the names.

create table risk (id integer primary key, description varchar not null, weight integer, severity integer, likelihood integer); -- many fields elided
create table role (name varchar primary key); -- uhhh...
create table skill (name varchar primary key); -- this still looks weird...
create table risk_role_skill (id integer primary key, risk_id integer, role_name varchar, skill_name varchar, foreign key(risk_id) references risk(id), foreign key(role_name) references role(name), foreign key(skill_name) references skill(name));

Here’s the new query:

select distinct role_name from risk_role_skill where risk_id = ?;

We’ve removed the join completely!

Two remaining points:

  1. There’s literally no information carried in the role and skill tables now, other than their identifying names. Does that mean we need the tables at all? In this case no, but in general we need to think here. How are the names in the join table going to get populated otherwise? If there are a limited set of valid values to choose from, then keeping a table with the range of values and a foreign key constraint to that table may be a good way to express the intent that the column’s content be drawn from that range. As an example, a particular bookstore may have printed, ebook, and audiobook media, so could restrict the medium field in their stock table to one of those values.
  2. Why does the risk_role_skill table have an identifier at all? It is a collection of associations between values, so a row’s content is that row’s identity.

Here’s the after schema:

create table risk (id integer primary key, description varchar, weight integer, severity integer, likelihood integer); -- many fields elided
create table risk_role_skill (risk_id integer, role varchar, skill varchar, foreign key(risk_id) references risk(id), primary key(risk_id, role, skill));

And the after query:

select distinct role from risk_role_skill where risk_id = ?;

Two fewer tables, no joins, altogether a much simpler database to understand and work with.

Reading List 254 by Bruce Lawson (@brucel)

Now wash your hands.

A Most Unusual World Theatre Day

Today is World Theatre Day, and the theatres of the world are shut down; along with the concert halls, opera houses, museums, galleries and other venues that enrich our public lives.

I’ve been lucky to enjoy performances in famous venues all around the world, from Shakespeare’s Globe, to the Sydney Opera House, to the Metropolitan Opera.

I’m fortunate that my job often allows me the privilege of visiting some of these venues when no-one else is there. It is very special indeed to experience the pure silence of an empty Walt Disney Concert Hall, or the expanse of the stage at the David H. Koch Theater, home of the New York City Ballet, when the masking is flown out. The buildings themselves are an intrinsic part of the cultural experience. These places are supposed to be full of people, yet they still manage to fizzle with energy and potential when they’re empty. That should give us hope.

I’ve spent years working in and around theatres, as an administrator, technician, box office assistant, and as a consultant and supplier. I’ve also spent time working as a lighting designer.

Lighting design is true theatrical power and magic. It’s thrilling to plunge a 2,000-seat auditoria into darkness, or to use light to transform an old church into a den for Shakespeare. It makes you viscerally appreciate how a shared environment can alter your response to art and ideas, and why these public spaces are so important (and why, as well, they need to be accessible to everyone).

Our cultural institutions are stepping up in this unprecedented moment, and stepping into our homes. The Metropolitan Opera’s nightly streams have been reaching hundreds of thousands of people. The UK’s National Theatre is opening up its back catalogue of NT Live performances online for free. Around the world, countless artists and companies are finding new ways to work and reach audiences who can no longer gather together to experience art and culture together in a shared physical environment.

This is all very welcome, and speaks to the vital part that art and culture plays in our lives. 

But none of this takes away from the magic of experiencing these incredible venues in person, with their history and aura, and I can’t wait until the day that they’re full once again.

March 25, 2020

Power Up Your Communication During Powerless Times

During these exceptional and difficult times that we are all experiencing,  how you communicate with your customers and patrons will have a strong impression and if done right will have a positive impact when things finally start getting back to some sort of normality.

We wanted to help power up your communication efforts by offering our top tips and thoughts :

The power of Email:
If you can, don’t wait for your customers to contact you with regards to cancellations or postponements. Make first contact. Email is the logical choice to achieve this. 

Whichever ticketing system or event management system you use, you should be able to export a list of all the email addresses of those who have booked tickets for the event to use as your mailing list.  Make sure you keep this list separate from existing marketing lists, the last thing you want is to annoy those already disappointed customers with unsolicited emails.  

When creating your communication make sure to set the options that are open to customers out clearly with clear call to actions.  If you are refunding all customers make sure you set expectations of when this will be processed, as the last thing you want is to communicate an incorrect timeframe which will result in added pressure to systems and processes that will no doubt already be overloaded. If you are asking customers to perform any actions on your website or to call your customer services, it might be a good idea to stagger your send, to help spread the demand on resources.

If you are asking customers to visit your website, triple-check your links. It may sound obvious but if you are rushing to get a communication out, a mistake here can make all your efforts null and void. 

The Power of Search:
You no doubt will see an increase in website traffic as more and more customers search to see if their event is still going ahead.  There are things you can do to communicate with customers within search engines, especially Google.  The first is to make sure you take advantage of the new schema data tags which have been introduced as a result of the current pandemic.  This means that you can tag events with statuses, such as cancelled and postponed, which will then be pulled in to Google’s rich results.  I would also recommend using Google My Business posts.  These posts are similar to those you might see on Facebook or Linkedin but appear in your brand search results.  You can include images and links within these posts.  The advantage of these is they take up a prime position in results, especially with mobile results.

Make sure to check your Google Search Console more regularly as this will give you an insight into what your website visitors are searching for to reach your site and what information they are coming to your site to find.  You can also compare this to any site search results if you have functionality on site.  This will help you work out your hierarchy of information and will inform how you organise this on site along with how you prioritise new content.

If you are still running any paid search ads associated with brand keywords make sure you include your main Covid-19 information page within site links, this will help your customers get to the information they require more efficiently.   

The Power of Content:
Obviously you will have published or will be publishing posts via your social channels keeping customers up to date with developments, which is the right thing to do.  This is really a note about communicating with current and potential customers while your current run is affected.  The current situation will present opportunities, as more and more people are isolated, spending more time at home, and they will be consuming more online content. At the same time, you may also find you have an opportunity to spend a little more time creating engaging and creative content of your own. Make sure you keep the audience in mind to what you create and share, think about their current situations and also pay attention to any current social trends, challenges and conversations, these will offer great opportunities to unleash your creativity.  

Don’t neglect the content you already have.  Many art organisations will have a fantastic back-catalogue of quality content from the archives and many of the great arts organisations are now making it available online for free, such at MET Opera, The Royal Albert Hall and The National Theatre.  This not only gives the chance for your regular visitors a chance to continue to enjoy the arts but also can be a great opportunity to reach new audiences.

Remember what you do now as an organisation will have a long-lasting impression on your current customers and things will return to normal, whatever that is.

We know each organization will be facing its own challenges and we are here to help. If we would like to discuss anything mentioned in this article further we would be more than happy to help get the right strategy for you.

March 23, 2020

I’ve been working from home for over 5 years. Over that time, I’ve improved my home office and tweaked my work-day routines. Being productive while working from home takes practice and experience. I’ve gotten pretty good at it.

That was until the past few weeks. My anxiety and productivity are on opposite tracks: while my anxiety has shot up, my productivity has fallen off a cliff.

I know many of you are now working from home for the first time. If you’re finding it difficult, know it’s not just you. We’re living in a time of unprecedented uncertainty. It’s difficult for everyone, even those of us who have been working from home for years.

Everything is pointing towards things getting worse over the next few weeks. For the short term at least, this is the new normal. And so, I’m hitting reset. I’m using all the tips and tricks I’ve learnt over the past few years to stay as focused as I can be.

Here’s how I’m trying to stay focused this week:

  • As much as I can, I’m resisting the urge to read news during the day. I have plenty of time to catch up on things in the evening.
  • I keep my phone in a different room while I work.
  • I’m using the Focus app to block Twitter, Slack and news sites.
  • I’m using the Streaks app to track 40 minute blocks of uninterrupted work (aka the pomodoro technique).
  • I’m being as realistic as I can about what I can accomplish on any given day. My task list is 4-5 things, max.
  • I’m having lots of conversations with family and friends. I have a few lunch-time video calls lined up. Social distancing doesn’t have to mean social isolation.
  • I’ve given myself permission to take regular extended breaks whenever I feel like it.
  • I’m meditating every morning for 10 minutes. Sam Harris just released a good podcast on why meditation matters in an emergency.
  • Music is helping. I have it playing all day in the office.
  • I’m trying to be as helpful and generous as I can to my clients. We’re all in this together.
  • I’m trying not to be too hard on myself.

How are you getting on working from home? What things that are helping you? Let me know – my email inbox is open:

March 20, 2020

Jeremy Keith:

I’m quite certain that one positive outcome of The Situation will be a new-found appreciation for activities we don’t have to do. I’m looking forward to sitting in a pub with a friend or two, or going to see a band, or a play or a film, and just thinking “this is nice.”

March 16, 2020

To quote Wikipedia:

May you live in interesting times is an English expression which purports to be a translation of a traditional Chinesecurse. While seemingly a blessing, the expression is normally used ironically; life is better in “uninteresting times” of peace and tranquility than in “interesting” ones, which are usually times of trouble.

Online shopping at the Co-op by Stuart Langridge (@sil)

On the Saturday just gone, I thought to myself: OK, better get some food in. The cupboards aren’t bare or anything, but my freezer was showing a distinct skew towards “things that go with the main bit of dinner” and away from “things that are the main bit of dinner”, which is a long way of saying: didn’t have any meat. So, off to online shopping!

I sorta alternate between Tesco and Sainsbury’s for grocery shopping; Tesco decided they wouldn’t deliver to the centre of the city for a little while, but they’re back on it now. Anyway, I was rather disillusioned to see that both of them had no delivery slots available for at least a week. It seems that not only are people panic-buying toilet roll, they’re panic-buying everything else too. I don’t want to wait a week. So, have a poke around some of the others… and they’re all the same. Asda, Morrisons, Ocado, Iceland… wait a week at least for a delivery. Amazon don’t do proper food in the UK — “Amazon Pantry” basically sells jars of sun-dried tomatoes and things, not actual food — and so I was a little stymied. Hm. What to do? And then I thought of the Co-op. Which turned out to be an enormously pleasant surprise.

Their online shopping thing is rather neat. There is considerably less selection than there is from the big supermarkets, it must be admitted. But the way you order shows quite a lot of thinking about user experience. You go to the Co-op quickshop and… put in your postcode. No signup required. And the delay is close to zero. It’s currently 2pm on Monday, and I fill in my postcode and it tells me that the next available slot is 4pm on Monday. Two hours from now. That’s flat-out impossible everywhere else; the big supermarkets will only have slots starting from tomorrow even in less trying times. You go through and add the things you want to buy and then fill in your card details to pay… and then a chap on a motorbike goes to the Co-op, picks up your order, and drives it to your place. I got a text message1 when the motorbike chap set off, before he’d even got to the Co-op, giving me a URL by which I could track his progress. I got messages as he picked up the shopping and headed for mine. He arrived and gave me the stuff. All done.

It seemed very community-focused, very grass-roots. They don’t do their own deliveries; they use a courier, but a very local one. The stuff’s put into bags by your local Co-op and then delivered directly to you with very little notice. They’re open about the process and what’s going on. It seems so much more personal than the big supermarkets do… which I suppose is the Co-op’s whole shtick in the first place, and it’s commendable that they’ve managed to keep that the case even though they’ve moved online. And while the Co-op is a nationwide organisation, it’s also rather local and community-focused. I’ll be shopping there again; shame on me that I had to be pushed into it this first time.

  1. the company that they use to be couriers are called Stuart. This was confusing!

March 13, 2020

Reading List 253 by Bruce Lawson (@brucel)

March 12, 2020

March 03, 2020

We live in a world where websites and apps mostly make people unhappy. Buying or ordering or interacting with anything at all online involves a thousand little unpleasant bumps in the road, a thousand tiny chips struck off the edges of your soul. “This website uses cookies: accept all?” Videos that appear over the thing you’re reading and start playing automatically. Grant this app access to your contacts? Grant this app access to your location? “Sign up for our newsletter”, with a second button saying “No, because I hate free things and also hate America”. Better buy quick — there’s only 2 tickets/beds/rooms/spaces left! Now now now!

This is not new news. Everyone already knows this. If you ask people — ordinary, real people, not techies — about their experiences of buying things online or reading things online and say, was this a pleasant thing to do? were you delighted by it? then you’re likely to get a series of wry headshakes. It’s not just that everyone knows this, everyone’s rather inured to it; the expectation is that it will be a bit annoying but you’ll muddle through. If you said, what’s it like for you when your internet connection goes down, or you want to change a flight, they will say, yeah, I’ll probably have to spend half an hour on hold, and the call might drop when I get to queue position 2 and I’ll have to call again, and they’ll give me the runaround; the person on the call will be helpful, but Computer will Say No. Decent customer service is no longer something that we expect to receive; it’s something unusual and weird. Even average non-hostile customer service is now so unusual that we’re a bit delighted when it happens; when the corporate body politic rouses itself to do something other than cram a live rattlesnake up your bottom in pursuit of faceless endless profit then that counts as an unexpected and pleasant surprise.

It’d be nice if the world wasn’t like that. But one thing we’re a bit short of is the vocabulary for talking about this; rather than the online experience being a largely grey miasma of unidentified minor divots, can we enumerate the specific things that make us unhappy? And for each one, look at how it could be done better and why it should be done better?

Trine Falbe, Kim Andersen, and Martin Michael Frederiksen think maybe we can, and have written The Ethical Design Handbook, published by Smashing Media. It’s written, as they say, for professionals — for the people building these experiences, to explain how and why to do better, rather than for consumers who have to endure them. And they define “ethical design” as businesses, products, and services that grow from a principle of fairness and fundamental respect towards everyone involved.

They start with some justifications for why ethical design is important, and I’ll come back to that later. But then there’s a neat segue into different types of unethical design, and this is fascinating. There’s nothing here that will come as a surprise to most people reading it, especially most tech professionals, but I’d not seen it enumerated quite this baldly before. They describe, and name, all sorts of dark patterns and unpleasant approaches which are out there right now: mass surveillance, behavioural change, promoting addiction, manipulative design, pushing the sense of urgency through scarcity and loss aversion, persuasive design patterns; all with real examples from real places you’ve heard of. Medium hiding email signup away so you’ll give them details of your social media account; Huel adding things to your basket which you need to remove; Viagogo adding countdown timers to rush you into making impulsive purchases; Amazon Prime’s “I don’t want my benefits” button, meaning “don’t subscribe”. Much of this research already existed — the authors did not necessarily invent these terms and their classifications — but having them all listed one after the other is both a useful resource and a rather terrifying indictment of our industry and the manipulative techniques it uses.

However, our industry does use these techniques, and it’s important to ask why. The book kinda-sorta addresses this, but it shies away a little from admitting the truth: companies do this stuff because it works. Is it unethical? Yeah. Does it make people unhappy? Yeah. (They quote a rather nice study suggesting that half of all people recognise these tricks and distrust sites that use them, and the majority of those go further and feel disgusted and contemptuous.) But, and this is the kicker… it doesn’t seem to hurt the bottom line. People feel disgusted or distrusting and then still buy stuff anyway. I’m sure a behavioural psychologist in the 1950s would have been baffled by this: if you do stuff that makes people not like you, they’ll go elsewhere, right? Which is, it seems, not the case. Much as it’s occasionally easy to imagine that companies do things because they’re actually evil and want to increase the amount of suffering in the world, they do not. There are no actual demons running companies. (Probably. Hail to Hastur, just in case.) Some of it is likely superstition — everyone else does this technique, so it’ll probably work for us — and some of it really should get more rigorous testing than it does get: when your company added an extra checkbox to the user journey saying “I would not dislike to not not not sign not up for the newsletter”, did purchases go up, or just newsletter signups? Did you really A/B test that? Or just assume that “more signups, even deceptive ones = more money” without checking? But they’re not all uninformed choices. Companies do test these dark patterns, and they do work. We might wish otherwise, but that’s not how the world is; you can’t elect a new population who are less susceptible to these tricks or more offended by them, even if you might wish to.

And thereby hangs, I think, my lack of satisfaction with the core message of this book. It’s not going to convince anyone who isn’t already convinced. This is where we come back to the justifications mentioned earlier. “[P]rivacy is important to [consumers], and it’s a growing concern”, says the book, and I wholeheartedly agree with this; I’ve written and delivered a whole talk on precisely this topic at a bunch of conferences. But I didn’t need to read this book to feel that manipulation of the audience is a bad thing: not because it costs money or goodwill, but just because it’s wrong, even if it earns you more money. It’s not me you’ve gotta convince: it’s the people who put ethics and goodwill on one side of the balance and an increased bottom line on the other side and the increased bottom line wins. The book says “It’s not good times to gamble all your hard work for quick wins at the costs of manipulation”, and “Surveillance capitalism is unethical by nature because at its core, it takes advantage of rich data to profile people and to understand their behaviour for the sole purpose of making money”, but the people doing this know this and don’t care. It in fact is good times to go for quick wins at the cost of manipulation; how else can you explain so many people doing it? And so the underlying message here is that the need for ethical design is asserted rather than demonstrated. Someone who already buys the argument (say, me) will nod their way through the book, agreeing at every turn, and finding useful examples to bolster arguments or flesh out approaches. Someone who doesn’t already buy the argument will see a bunch of descriptions of a bunch of things that are, by the book’s definition, unethical… and then simply write “but it makes us more money and that’s my job, so we’re doing it anyway” after every sentence and leave without changing anything.

It is, unfortunately, the same approach taken by other important but ignored technical influences, such as accessibility or open source or progressive enhancement. Or, outside the tech world, environmentalism or vegetarianism. You say: this thing you’re doing is bad, because just look at it, it is… and here’s all the people you’re letting down or excluding or disenfranchising by being bad people, so stop being bad people. It seems intuitively obvious to anyone who already believes: why would you build inaccessible sites and exclude everyone who isn’t able to read them? Why would you build unethical apps that manipulate people and leave them unhappy and disquieted? Why would you use plastic and drive petrol cars when the world is going to burn? But it doesn’t work. I wish it did. Much as the rightness and righteousness of our arguments ought to be convincing in themselves, they are not, and we’re not moving the needle by continually reiterating the reasons why someone should believe.

But then… maybe that’s why the book is named The Ethical Design Handbook and not The Ethical Design Manifesto. I went into reading this hoping that what the authors had written would be a thing to change the world, a convincer that one could hand to unethical designers or ethical designers with unethical bosses and which would make them change. It isn’t. They even explicitly disclaim that responsibility early on: “Designers from the dark side read other books, not this one, and let us leave it at that,” says the introduction. So this maybe isn’t the book that changes everyone’s minds; that’s someone else’s job. Instead, it’s a blueprint for how to build the better world once you’ve already been convinced to do so. If your customers keep coming back and saying that they find your approach distasteful, if you decide to prioritise delight over conversions at least a little bit, if you’re prepared to be a little less rich to be a lot more decent, then you’ll need a guidebook to explain what made your people unhappy and what to do about it. In that regard, The Ethical Design Handbook does a pretty good job, and if that’s what you need then it’s worth your time.

This is an important thing: there’s often the search for a silver bullet, for a thing which fixes the world. I was guilty of that here, hoping for something which would convince unethical designers to start being ethical. That’s not what this book is for. It’s for those who want to but don’t know how. And because of that, it’s full of useful advice. Take, for example, the best practices chapter: it specifically calls out some wisdom about cookie warnings. In particular, it calls out that you don’t need cookie warnings at all if you’re not being evil about what you plan to allow your third party advertisers to do with the data. This is pretty much the first place I’ve seen this written down, despite how it’s the truth. And this is useful in itself; to have something to show one’s boss or one’s business analyst. If the word has come down from on high to add cookie warnings to the site then pushback on that from design or development is likely to be ignored… but being able to present a published book backing up those words is potentially valuable. Similarly, the book goes to some effort to quantify what ethical design is, by giving scores to what you do or don’t do, and this too is a good structure on which to hang a new design and to use to feed into the next thing your team builds. So, don’t make the initial mistake I did, of thinking that this is a manifesto; this is a working book, filled with how to actually get the job done, not a philosophical thinkpiece. Grab it and point at it in design meetings and use it to bolster your team through their next project. It’s worth it.

February 28, 2020

Reading List 252 by Bruce Lawson (@brucel)

February 27, 2020

Yesterday, we observed that the goal of considering the go to statement harmful was so that a programmer could write a correct program and have done with it. We noticed that this is never how computering works: many programs are not even instantaneously correct because they represent an understanding of a domain captured at an earlier time, before the context was altered by both external changes and the introduction of the software itself.

Today, let’s look at the benefits of removing the go to statement. Dijkstra again:

My second remark is that our intellectual powers are rather geared to master static relations and that our powers to visualize processes evolving in time are relatively poorly developed. For that reason we should do (as wise programmers aware of our limitations) our utmost to shorten the conceptual gap between the static program and the dynamic process, to make the correspondence between the program (spread out in text space) and the process (spread out in time) as trivial as possible.

This makes sense! Our source code is a static model of our software system, which is itself (we hope) a model of a problem that somebody has along with tools to help with solving that problem. But our software system is a dynamic actor that absorbs, transforms, and emits data, reacting to and generating events in communication with other human and non-human actors. We need to ensure that the dynamic behaviour is evident in the static model, so that we can “reason about” the development of the system. How does Dijkstra’s removal of go to help us achieve that?

Let us now consider how we can characterize the progress of a process. (You may think about this question in a very concrete manner: suppose that a process, considered as a time succession of actions, is stopped after an arbitrary action, what data do we have to fix in order that we can redo the process until the very same point?) If the program text is a pure concatenation of, say, assignment statements (for the purpose of this discussion regarded as the descriptions of single actions) it is sufficient to point in the program text to a point between two successive action descriptions. (In the absence of go to statements I can permit myself the syntactic ambiguity in the last three words of the previous sentence: if we parse them as “successive (action descriptions)” we mean successive in text space; if we parse as “(successive action) descriptions” we mean successive in time.) Let us call such a pointer to a suitable place in the text a “textual index.”


Why do we need such independent coordinates? The reason is – and this seems to be inherent to sequential processes – that we can interpret the value of a variable only with respect to the progress of the process. If we wish to count the number, n say, of people in an initially empty room, we can achieve this by increasing n by one whenever we see someone entering the room. In the in-between moment that we have observed someone entering the room but have not yet performed the subsequent increase of n, its value equals the number of people in the room minus one!

So the value of go to-less programming is that I can start at the entry point, and track every change in the system between there and the point of interest. But I only need to do that once (well, once for each different condition, loop, procedure code path, etc.) and then I can write down “at this index, these things have happened”. Conversely, I can start with the known state at a known point, and run the program counter backwards, undoing the changes I observe (obviously encountering problems if any of those are assignments). With go to statements present, I cannot know the history of how the program counter came to be here, so I can’t make confident statements about the dynamic evolution of the system.

This isn’t the only way to ensure that we understand a software system’s dynamic behaviour, which is lucky because it’s not a particularly good one. In today’s parlance, it “doesn’t scale”. Imagine being given the bug report “I clicked in the timeline on a YouTube video during an advert and the comments disappeared”, and trying to build a view of the stateful evolution of the entire YouTube system (or even just the browser, if you like, and if it turns out you don’t need the rest of the information) between main() and the location of the program counter where the bug emerged. Even if we pretend that a browser isn’t multithreaded, you would not have a good time.

Another approach is to encapsulate parts of the program, so that the amount we need to comprehend in one go is smaller. When you do that, you don’t need to worry about where the global program counter is or how it got there. Donald Knuth demonstrated this in Structured Programming with go to Statements, and went on to say that removing all instances of go to is solving the wrong problem:

One thing we haven’t spelled out clearly, however, is what makes some go to’s bad and others acceptable. The reason is that we’ve really been directing our attention to the wrong issue, to the objective question of go to elimination instead of the important subjective question of program structure.

In the words of John Brown [here, Knuth cites an unpublished note], “The act of focusing our mightiest intellectual resources on the elusive goal of go to-less programs has helped us get our minds off all those really tough and possibly unresolvable problems and issues with which today’s professional programmer would otherwise have to grapple.”

Much has been written on structured programming, procedural programming, object-oriented programming, and functional programming, which all have the same goal: separate a program into “a thing which uses this little bit of software, according to its contract” and “the thing that you would like to believe implements this contract”. OOP and FP additionally make explicit the isolation of state changes, so that you don’t need to know the whole value of the computer’s memory to assert conformance to the contract. Instead, you just need to know the value of the little bit of memory in the fake standalone computer that runs this one object, or this one function (or indeed model the behaviour of the object or function without reference to computer details like memory).

Use or otherwise of go to statements in a thoughtfully-designed (I admit that statement opens a can of worms) is orthogonal to understanding the behaviour of the program. Let me type part of an Array class based on a linked list directly into my blog editor:

Public Class Array Of ElementType
  Private entries As LinkedList(Of ElementType)
  Public Function Count() As Integer
    Dim list As LinkedList(Of ElementType) = entries
    Count = 0
    If list.IsEmpty() Then GoTo empty
    Count = Count + 1
    list = list.Next()
    GoTo nonempty
    Exit Function
  End Function

  Public Function At(index As Integer) As ElementType
    Dim cursor As Integer = index
    Dim list As LinkedList(Of ElementType) = entries
    If list.IsEmpty() Then Err.Raise("Index Out of Bounds Error")
    If cursor = 0 Then Return list.Element()
    list = list.Next()
    cursor = cursor - 1
    GoTo next
  End Function
End Class

While this code sample uses go to statements, I would suggest it’s possible to explore the assertion “objects of class Array satisfy the contract for an array” without too much difficulty. As such, the behaviour of the program anywhere that uses arrays is simplified by the assumption “Array behaves according to the contract”, and the behaviour anywhere else is simplified by ignoring the Array code entirely.

Whatever harm the go to statement caused, it was not as much harm as trying to define a “correct” program by understanding all of the ways in which the program counter arrived at the current instruction.

February 26, 2020

Aquamarine by Bruce Lawson (@brucel)

Here’s a newly-recorded version of one of the favourite songs I wrote (crappy cassette 4-track demo previously posted). I was obsessed with TS Eliot’s poem Marina, a monologue inspired by Shakespeare’s Pericles. So I ripped that off, nicked a line or two from The Waste Land, pinched a bit of Shakespeare’s The Tempest and, while the literary store detective was looking the other way, ran off with a bit of Dylan Thomas too. The Shakespeare reading is by my friend Richard Crowest. Bass guitar and production is by Shez.

Aquamarine –
I’m a ship becalmed after stormy seas.
You’ve been silver and green;
I love you best now for your clarity.
You sing to me in sharpened keys.
You bring me emeralds and harmonies.

I will be here for you if you’ll be here for me
Sometimes, the tide turns
and everything is monochrome.

Aquamarine –
Your wet hair dries in the warm sea breeze.
Lie still and dream
Of the mountains – there you feel free.
Sail across still memories
Under sleep where all the waters meet.

I will be here for you if you’ll be here for me
Dry stones and white bones
and everything is monochrome.

Aquamarine –
This music crept upon the water to me
I’m a machine
Powered by your electricity.
You sail across still memories
You bring me emeralds and energy.

I will be here for you if you’ll be here for me
From the horizon
The world can turn monochrome.

What seas, what shores,
what great rocks?

Seize what’s yours;
What grey rocks?

What islands? What waters lap at the bow?

The sea’s daughter, you ebb and you flow;
The sea’s daughter, emerald green;
The sea’s daughter, Aquamarine.

Lie still, be calm, and dream.

Words and music © Bruce Lawson 1991, all rights reserved.

Dijkstra didn’t claim to consider the go to statement harmful, not in those words. The title of his letter to CACM was provided by the editor, Niklaus Wirth, who did such a great job that the entire industry knows that go to is “Considered Harmful”, and that you can quickly rack up the clicks by considering other things harmful.

A deeper reading of his short (~1400 words) article raises some interesting points, that did not as yet receive as much airing. Here, in the interests of writing an even shorter letter, is just one.

My first remark is that, although the programmer’s activity ends when he has constructed a correct program, the process taking place under control of his program is the true subject matter of his activity, for it is this process that has to accomplish the desired effect; it is this process that in its dynamic behavior has to satisfy the desired specifications. Yet, once the program has been made, the “making’ of the corresponding process is delegated to the machine.

There are many difficulties with this statement, including the presumed gender of the programmer. Let us also consider the idea of a “correct” program, which does not exist for the majority of programmers. Eight years after Dijkstra’s letter was published, Belady and Lehman published the first law of program evolution dynamics:

_ Law of continuing change_. A system that is used undergoes continuing change until it is judged more cost effective to freeze and recreate it. Software does not face the physical decay problems that hardware faces. But the power and logical flexibility of computing systems, the extending technology of computer applications, the ever-evolving hardware, and the pressures for the exploitation of new business opportunities all make demands. Manufacturers, therefore, encourage the continuous adaptation of programs to keep in step with increasing skill, insight, ambition, and opportunity. In addition to such external pressures for change, there is the constant need to repair system faults, whether they are errors that stem from faulty implementation or defects that relate to weaknesses in design or behavior. Thus a programming system undergoes continuous maintenance and development, driven by mutually stimulating changes in system capability and environmental usage. In fact, the evolution pattern of a large program is similar to that of any other complex system in that it stems from the closed-loop cyclic adaptation of environment to system changes and vice versa.

This model of programming looks much more familiar to me when I reflect on my experience than the Dijkstra model. If Dijkstra’s programmer stopped programming when they have “constructed a correct program”, then their system would fail as it didn’t adapt to “increasing skill, insight, ambition, and opportunity”.

The programmer who would thrive in this environment is more akin to Ward Cunningham’s opportunistic rewriter, based on his experience of the WyCash Portfolio Management System. That programmer rewrites every module they touch, to ensure that it represents the latest information they have. We recognise the genesis of Ward’s “technical debt” concept in this quote, and also perhaps what we would now call “refactoring”:

Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite. Objects make the cost of this transaction tolerable. The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt. Entire engineering organizations can be brought to a stand-still under the debt load of an unconsolidated implementation, object-oriented or otherwise.

The traditional waterfall development cycle has endeavored to avoid programming catastrophe by working out a program in detail before programming begins. We watch with some interest as the community attempts to apply these techniques to objects. However, using our debt analogy, we recognize this amounts to preserving the concept of payment up-front and in-full. The modularity offered by objects and the practice of consolidation make the alternative, incremental growth, both feasible and desirable in the competitive financial software market.

Ward also doesn’t use go to statements, his programming environment doesn’t supply them. But it is not the ability of his team to avoid incorrect programs by using other control structures that he finds valuable; rather the willingness of his programmers to jettison old code and evolve their system with its context.

February 21, 2020

Reading List 251 by Bruce Lawson (@brucel)

February 19, 2020

I like having the news headlines on my phone’s home screen. (Well, on the screen to the right.) It helps me keep up with what’s going on in the world. But it’s hard to find a simple headline home screen widget which isn’t full of ads or extra frippery or images or tracking; I just want headlines, plain text, not unpleasantly formatted, and high-density. I don’t want to see three headlines; I’d rather see ten. I tried a whole bunch of news headline home screen widgets and they’re all terrible; not information-dense enough, or they are but they’re ugly, or they insist on putting pictures in, or they display a ton of other information I don’t want.

It occurred to me that I don’t really need a news reader per se; just an RSS reader, which I then point at Google’s “all news” feed (which they move around from time to time but at time of writing in February 2020 is at However, RSS reader widgets are also all terrible.

Finally, I thought: fine, I’ll just do it myself. But I really don’t want to write Java and set up Android Studio. So I installed Web Widget which just renders a web page to a home screen widget, and then wrote a simple web page and stuck it at the root of my phone’s storage. I can then point Web Widget at file:///sdcard/noos.html and it all works, and I can customise it how I like. Every one’s a winner. Nice simple way to create widgets that do what I want. They can’t be animated or anything, but if you want something which displays some external data and is happy to be polled every now and again to update, it’s perfectly fine. Sadly, there’s no continuity of storage (indexedDB exists but doesn’t persist and localStorage doesn’t exist at all), but it’s good for what I needed.

February 17, 2020

On the Birmingham tech scene by Stuart Langridge (@sil)

A certain amount of kerfuffle over the last couple of days in the half of the Birmingham tech scene that I tend to inhabit, over an article in Business Live about Birmingham Tech Week, a new organisation in the city which ran a pretty successful set of events at the back end of last year.1

I think what got people’s backs up was the following from BTW organiser Yiannis Maos, quoted in the article:

I saw an opportunity borne out of the frustration that Birmingham didn’t really have a tech scene, or at least not one that collaborated very much.

You see, it doesn’t appear that the Tech Week team did much in the way of actually trying to find out whether there was a tech scene before declaring that there probably wasn’t one. If they had then they’d have probably discovered the calendar which contains all the stuff that’s going on, and can be subscribed to via Google. They’d probably have spoken to the existing language-specific meetups in the city before possibly doing their own instead of rather than in conjunction with. They’d have probably discovered the Brum tech Slack which has 800-odd people in it, or2 CovHack or HackTheMidlands or FusionMeetup or devopsdays or CodeYourFuture_ or yougotthisconf or Tech Wednesday or Django Girls or OWASP or Open Code or any one of a ton of other things that are going on every week.

Birmingham, as anyone who’s decided to be here knows, is a bit special. A person involved in tech in Birmingham is pretty likely to be able to get a similar job in London, and yet they haven’t done so. Why is that? Because Brum’s different. Things are less frantic, here, is why. We’re all in this together. London may have kings and queens: we’re the city of a thousand different trades, all on the same level, all working hand in hand. All collaborating. It’s a grass roots thing, you see. Nobody’s in charge. The calendar mentioned above is open source exactly so that there’s not one person in charge of it and anyone else can pick it up and run with it if we disappear, so the work that’s already gone into it isn’t wasted.

Yiannis goes on to say “I guess we weren’t really banging the drum about some of the successes Birmingham had seen in regards to tech.” And this is correct. Or, more accurately, I don’t personally know whether it’s correct, but I entirely believe it. I’m personally mostly interested in the tech scene in the city being good for people in the city, not about exhibiting it to others… but that doesn’t mean that that shouldn’t be done. Silicon Canal already do some of that, but having more of it can’t be bad. We all want more stuff to happen, there just doesn’t need to be one thing which attempts to subsume any of the others. Birmingham Tech Week’s a great idea. I’d love to see it happen again, and it’s great that Yiannis has taken a lead on this; five thousand people showing up can’t be wrong.

And, to be clear, this is not an attempt to rag on them. I don’t know Yiannis myself, but I’ve been told by people whose opinions I value and who do know him that he’s not intending to be a kingmaker; that what he’s looking to do is to elevate what’s already going on, and add more to it. That’s fantastic. They’ve contacted people I know and trust to ask for opinions and thoughts. I spoke to them when they set up their own events listing and asked people to contribute to theirs specifically and I said, hey, you know there already is one of those, right? If you use that (as Silicon Canal do) and ask people to contribute to that, then we all win, because everyone uses it as the single source and we don’t have fifteen incomplete calendars. And they said, hey, we didn’t know that, soz, but we’ll certainly do that from now on, and indeed they have done so, recommending to event organisers that they add their stuff to the existing calendar, and that’s brilliant. That’s collaboration.

I think of the tech scene in my city like a night out dancing. You go out for the evening to have a dance, to have a laugh. Show up on your own or with a partner or with a group, and then all get out there on the floor together and throw some shapes; be there for one minute or the whole night, nobody minds. And nobody’s directing it. Nobody wins a dance. If someone tries to tell everyone how to dance and when to dance and where to dance… then it stops being fun.

And so there’s a certain amount of resistance, on my side of the fence, to kingmakers. To people who look at the scene, all working together happily, and then say: you people need organising for your own good, because there needs to be someone in charge here. There needs to be hierarchy, otherwise how will journalists know who to ask for opinions? It’s difficult to understand an organisation which doesn’t have any organisation. W. L. Gore and Patagonia and Valve are companies that work a similar way, without direct hierarchy, in a way that the management theorist Frédéric Laloux calls a “teal organisation” and others call “open allocation”, and they baffle people the world over too; half the managers and consultants in the world look at them and say, but that can’t work, if you don’t have bosses, nobody will do anything. But it works for them. And it seems to me to be a peculiarly Brum approach to things. If we were in this for the fame and the glory we’d have gone down to London where everyone’s terribly serious and in a rush all the time. Everyone works with everyone else; BrumPHP talks about BrumJS, Fusion talks about School of Code; one meetup directs people to others that they’ll find interesting; if the devopsdays team want a speaker about JavaScript they’ll ping BrumJS to ask about who’d be good. That’s collaboration. Everyone does their bit, and tries to elevate everyone else at the same time.

So I really hope that the newspaper article was a misquote; that the journalist involved could have looked more into what’s going on in the city and then written something about all of that, too. It’s certainly easy to just report on one thing that’s going on, but exactly what makes the Birmingham tech scene different from others is that it’s rich and deep and there isn’t one convenient person who knows all of it. I’d love to see Birmingham journalism talking more about the Birmingham scene. Let’s hope there’s more of that.

  1. That link describes the 2019 Birmingham tech week at time of writing in February 2020. I do not know whether they’ll keep the 2019 schedule around (and I hope they do and don’t just overwrite it).
  2. to quote Jim

February 15, 2020

Getting a new phone by Stuart Langridge (@sil)

So, I’m getting a new phone. Here’s an insight into my decision-making processes.

I have, repeatedly and irritatedly, complained that phones now are too big. My beloved Sony Xperia Z5 Compact is the right size for a phone, in my opinion. I always, always use my phone one-handed; I never ever hold in one hand and touch the screen with the other. It is a loss to me why this, which was the normal way of using a phone for years, has been reclassified as a thing that nobody wants any more, but c’est la vie, I suppose. Anyway, said beloved Z5C finally threw a seven the other day and decided that it wouldn’t do wifi any more. Or, more accurately, that it was fine doing wifi when within about two feet of the router, and not otherwise.

That’s not ideal, I thought.

I mean, it’s five years old. So I probably did OK out of it. And the battery life is shocking now. So I’ve been vaguely thinking about getting something new for a while. I’m not sure that the wifi thing is sensibly repairable, and I read a forum post about a chap who took his Z5C apart to replace the (not-user-replaceable) battery (a process which involves heating it up to break the glue behind the glass, and a bunch of other stuff that there’s no way I’d be able to do without breaking the phone and possibly burning down the building) and while doing so managed to snap a tiny bit of metal which then broke the wifi antenna and made it exhibit the problems I’m seeing. So that’s probably what happened; it got jolted or something. No chance of me fixing that; if I have to solder anything, I’ll screw it up. This is the universe telling me to get a new phone, I thought.

Consequently, it’s off to GSM Arena’s phone finder. I don’t actually have much in the way of requirements for a phone. My original list of needs was:

  • not too big (for what exactly qualifies as not too big, read on)
  • not too expensive (flagship phones are now a thousand pounds! even non-flagship ones are £500! I don’t have a monkey just lying around)
  • NFC (for Google Pay, which I use all the time)
  • a headphone jack (because wireless headphones are pointless and expensive and worse in every conceivable way other than “the cable doesn’t get tangled up”, and I don’t like them and don’t want to buy any)
  • made in the last couple of years, since if I’m spending money on a phone I want it to last a while; there’s not a lot of point replacing my 2015 Z5C with a phone of similar vintage
  • and I like pretty things. Design is important to me. Beauty, vitality, and openness are all important.

This is not much of a strenuous list of requirements, to be honest. Or so I thought. I did some searches, and quickly established that I’d have to get something bigger than the Z5C; there isn’t anything at all that size, these days. So I wandered into town with the intention of picking up some actual phones to get a sense of what was too big.

This was harder than it looks, because basically every phone shop now bolts all their phones to the table so they can’t be picked up. All you can do is jab at the screen like a bloody caveman. This is pretty goddamn annoying when the point of the test is to see what a phone feels like in the hand. The O2 shop had a bunch of plastic models of phones and even those had a massive thing glued on the back with a retracting wire cable in it, as if I’m going to steal a non-functional plastic box, O2, for god’s sake, stop treating your customers like criminals, this is almost as bad as hotels giving you those crap two-part hangers like I’m going to spend £150 on a night in the Premier Inn and then nick the hangers, what’s wrong with you… but it did at least let me establish that the absolute outside maximum size for a phone that I’m able to tolerate is the Samsung Galaxy S10e. Anything bigger than that is just too big; I can’t reach the top of the screen without using my other hand.

A search on gsmarena for phones less than 143mm in height, with NFC and 3.5mm jack, from 2018 onwards lists three phones. The S10e as mentioned, the Sony Xperia XA2, and the Sharp Aquos R2 Compact. Now, I quite like the look of the Aquos (despite all the reviews saying “it’s got two notches! not even the Nazis did that!”) but as far as I can tell it just was flat never made available in the UK at all; getting hold of one is hard. And the S10e, while it seems OK, is a Samsung (which I’m not fond of) and more importantly is £450. This left me looking at the Xperia XA2, which was a possibility — it’s sort of a grand-nephew of my Z5C. Reviews weren’t very encouraging, but I figured… this might be OK.

Andrew Hutchings pointed out on Twitter (because of course I was bitching about this whole situation on Twitter) that there are USB-to-headphone-jack adaptors. Now, I knew this — my daughter uses one to plug her headphones into her iPhone — but for some reason I hadn’t properly considered that option; I’d just assumed that no headphone jack = stupid wireless headphones. An adaptor wouldn’t be that big a deal; my headphones just get thrown in my coat pocket (I have cheapish in-ear headphones, not posh cans that go ove the ear and need a bag to carry them around in) and so I’d just leave the adaptor attached to them at all times. That wouldn’t be so bad.

Taking the headphone jack requirement away from the search added two more options (and a bunch of smartwatches, unhelpfully): the Sony Xperia XZ2 Compact and the Nokia 8 Sirocco. I liked the sound of the Nokia, but… not for very good reasons. My favourite ever phone from an industrial design perspective was the Nokia N9, which I loved with a passion that was all-encompassing. I like the Nokia brand; it says classy and well-thought-out and well-integrated and thoughtful and elegant. And “Sirocco” is a cool name; I like things with names. I hate that phones are just called a code number, now. So “Sirocco” is much cooler than “S10e”. None of these are good reasons, particularly the ones that revolve around my nostalgia for the Nokia brand considering that it’s been bought by some other company now. And the Sirocco only got fairly average reviews.

Ah, but then I read the reviews. And all the things that reviewers didn’t like, I either didn’t care about or, more worryingly yet, I completely disagreed with. “As the phone has a 16:9 screen rather than the now more popular 18:9 (or even 19:9) style, it already seems dated” says techradar, for which you can just sod off. Why, why would I want a phone a foot long? That’s the opposite of what I want! So reviews that complain that it’s not tall enough (which was a lot of them) got discounted. Complaints that it’s using an older chipset than some of its contemporaries don’t bother me; it’s quite some newer than my current phone, after all. Apparently the camera isn’t perfect, about which I don’t care; it’s got a camera, so I’m good. And they all agreed on two things: it’s Android One, meaning that it’s stock Android and will get updates (which I like, since my Z5C is stuck on Android 7 (!)), and that it’s pretty. I like pretty.

The price tag was off-putting, though. £475 on Amazon. That’s rather too much; I’d have to save up for that, and as noted I have a phone with no wifi, so this problem needs solving sooner rather than later. I don’t mind second-hand, though, so I checked eBay and it was still £250 there, which is on the very utmost outer edge of what I can just drop on a purchase and I’d have to be really convinced of it. I don’t like buying things on the knock-knock, and I am in a 12-month can’t-leave SIM-only contract with Three, so the idea of getting an “upgrade” from my carrier was a no-no even if I wanted to, which I don’t (the SIM-only thing gives me unlimited texts and calls and 6GB of data per month for nine quid. Not forty nine. Nine. I don’t want to lose that).

And then I checked CeX. And CeX had it in stock, online, class A, for £175.

What? A hundred and seventy-five quid for a phone which elsewhere is nearly five hundred?

So I bought it. And now it’s not in stock online any more, so I assume I have the only one they had. This means you can’t do the same. Sorry about that.

It’s due to arrive early next week (which is the problem with buying on a Saturday). I’ll let you know how it goes. I’m rather looking forward to it.

February 14, 2020

Reading List 250 by Bruce Lawson (@brucel)

February 13, 2020

For the longest time I’ve wanted to play with epoxy resin. Watching makers like Peter Brown, Ben’s Worx, and TheCrafsMan on YouTube inspired the desire to use resin in a project, and conversations with my patron, Emma, revealed that she had similar desires, so during the first weekend of February she joined me in my workshop, and powered with nothing more than imagination and ill-gained confidence, we decided to make an epoxy resin river laptop tray for her husband.

The journey to this fated weekend started back in mid-Janurary during a trip to Bristol. Shortly after Christmas, Lucy and I decided we needed new Superdry hoodies, so a trip to Cabot Circus was planned. Little-known to Lucy, Bristol was also home to the Bristol Wood Recycling Project, and there’s no way that I was going to skip visiting a reclamation yard if I was in the neighbourhood.

I walked out £150 poorer with one cherry, and two sycamore, waney edged boards under my arm.

The cherry and £38 sycamore boards were for me, but the £45 sycamore was for Emma, chosen from the vast selection of amazing boards, via WhatsApp consultation and lots of photos.

The reclamation yard had a lot to choose from, with most of the waney edge boards being rough sawn, and over two-and-a-half meters long, but they had a small selection of boards which had been cut down to size, squared off, planed and finished with oil, which they were selling to be used as shelves. These were perfect for my purposes, as I don’t have a planer/thicknesser (something which is going to come back and bite us in the arse shortly).

Next we needed the resin. I’d decided a while ago that I was going to use GlassCast resin because they’re British (I didn’t want to mess about importing stuff), and because of all the helpful tools and information they have on their site, specifically the video tutorials they have for a number of different resin projects, and the resin calculator to work out how much resin you’ll need for the different projects featured in the videos.

I had planned on using my cherry board to make a river table for myself, but the calculator revealed that I’d need just under 5kg of resin at a cost of just over £80 for the resin alone, and as I’d already spend all my money on my new Superdry hoodie, decided I’d shelf the idea temporally.

My cherry board, cut in half, and positioned for resin river measurement – turns out, that gap needs a lot of resin.

Price wasn’t a barrier for Emma, however, and £130 later I was awaiting shipment of 2kg of resin, a selection of metallic pigments, a roll of flash/release tape, a 100x100cm polypropylene sheet, some nitrile gloves, and some mixing cups.

Emma arrived on the Friday, and after a night of catching up (and drinking), we awoke Saturday morning ready to work.

The original plan had been to split the board into three sections, with two of them being individually squared off using resin, but after some thought we decided this was going to be a bit too difficult, mainly due to having three open edges against the resin, and not really being sure how to make a form to contain it all.

So we went with plan B, which was to go for a single piece featuring the more traditional river table approach of two boards facing each other, so after cutting the board down to size, we set about using two offcuts from the door in my basement and some clamps to create a makeshift form on top of the polypropylene sheet, sealed around the edges with (far too much) silicone.

Next on the agenda was preparing the resin. Emma wanted it to be olive green, but that wasn’t available as a pre-mixed colour, so instead she took three parts yellow pigment, one part blue, and a touch of red, and combined it until it was the perfect colour.

Based on our calculations we knew that 1kg of resin should be more than enough to fill the gap, which made mixing the batch easy, so after pouring all the resin from one bottle into the cup, and mixing the pigment into it, we then poured the hardener in, and mixed it some more. I’d picked up a paint stirrer which fits into your drill to the mixing process easy, but we’d decided to use the two-cup method of pouring all the mix from one cup into a second just to be sure everything was thoroughly mixed.

I was given the honour of pouring the mixture into the gap, which reached the top with ease, but after a few minutes, we’d noticed the level had dropped off, so poured in some more. We figured this shrinking was probably due to the bubbles in the resin (the resin has a fairly long open time, so we could have waited a while to let these rise to the surface before pouring), but little did we know the real cause.

We could see the level was still dropping, but had already used the remaining resin mixture and filled a knot in one of my planks, so decided that we’d top it off with clear resin the following day, so after a couple of hours of monitoring the situation to ensure there were no leaks, we called it a day and resumed drinking.

The following morning we were greeted by a few small leaks in the form, but thankfully, the resin had already hardened enough to plug them.

We proceeded to mix the second batch of resin, and as we’d left it clear, we could see all the bubbles slowly rise up and out of the mixture. Having watched lots of videos about epoxy resin, I knew that bubbles could be an issue, and that you can use a pressure pot or vacuum chamber to eliminate them, so to watch them remove themselves from the equation was something special. I don’t know if this is a feature unique to GlassCast, but it’s impressive all the same.

Content that we had done as much as we could, we spent the rest of the day exploring Springfair, before Emma had to head home. If we’d have read the technical sheet sooner, we’d have seen that it takes at least 48 hours for the resin to cure, but I was happy to finish up by myself in the week.

Fast forward to Tuesday and I was ready to de mould. The first thing I did was turn the form over, and discovered where the resin had gone.

As mentioned earlier, I don’t have a planer/thicknesser, meaning we had to use the boards as they came, and it seems they came with some warping in them, enough that neither board sat perfectly flat on the polypropylene sheet, letting the resin seep under them.

Job one was freeing them from the supports. If we’d placed the tape along the full length of supports we could have simply lifted them off, but because we hadn’t, it meant cutting them of with the table saw.

Job two was removing the resin amassed on the bottom. I asked around to see if anyone had a planer/thicknesser, but the only one I had access to was too small, so I had no choice but to sand it off using my belt sander.

I then switched to my random orbit sander and went up to 400 grit. This left the river section of the resin on the bottom cloudy, which I could have continued sanding up to 3000 grid and beyond, then use some polishing compound to make it glossy again, but I don’t have any of those things, and was well aware of the Valentine’s Day deadline, so decided that because it was on the bottom it was good enough for now.

Flipping the board over, the top was pretty good as is, being naturally nice and glossy. There’s a slight drop of less than 1mm, but not enough of a concern to make it worth sanding the wood down at the risk of messing up the gloss, so I carefully gave the wood a light sanding, being sure to avoid the resin at all cost.

And for now, this is where this story must end. I’ve sent the board to Emma, who will give it to Pete on Valentine’s day, to let him decide what happens next. One idea is we maybe trim it down slightly and keep with the idea of a laptop tray, another is we add some handles on either side and make it into a serving tray. Regardless of what happens next, it isn’t the end of the adventure, just a pause, and when we return, we’ll round over the edges with a router, polish the bottom and sides, and reveal it’s final form.

February 11, 2020

Free and open source software has traditionally been defined as the opposite of something else: proprietary (or commercially-licensed) software. That’s particularly obvious in the name of the GNU project, which calls itself “Not UNIX” – a popular AT&T-owned commercial software property of the time. The GNU manifesto goes deeper on the specific ways in which it is Not Unix:

I consider that the Golden Rule requires that if I like a program I must share it with other people who like it. Software sellers want to divide the users and conquer them, making each user agree not to share with others. I refuse to break solidarity with other users in this way. I cannot in good conscience sign a nondisclosure agreement or a software license agreement. For years I worked within the Artificial Intelligence Lab to resist such tendencies and other inhospitalities, but eventually they had gone too far: I could not remain in an institution where such things are done for me against my will.

The focus of this document, and of the various free software licenses, is on the distribution and redistribution rights associated with the software. Thus the focus of the Free Software Foundation, Open Source Initiative, and the other organisations that promote free or open source software is on ensuring appropriate licences are used, and that distributors comply with the licence terms.

Otherwise, free software development is not particularly distinguished from other forms of software development. There are, of course, some outliers, but mostly you’ll see a “core team”, perhaps with a formal structure (component owners, project/release managers, and other roles are common). This team organises its work around proprietary work-allocation tooling like Jira, Github, Slack, Trello, and so on. In many cases, an organisation such as a commercial company or business-interest foundation exists to centralise ownership and decision making, like a good old-fashioned Fordist company. The only visible difference in operations is that it’s possible to read the source code and get changes from outside through the gates and into their repository.

The reason so much work in open source software looks a whole lot like commercial software is that it is work in commercial software. Sometimes the open source project exists exactly to drive adoption of commercially-licensed equivalents, replacements, or upgrades. “Open core” products exist so that you find a need for the commercial features. Developer advocates build open source workflow tools as a sort of loss leading pre-sales activity. And many companies publish open source software “off the money path” as a recruitment activity: do some free work on our pull requests then come here and get paid to reject pull requests from your peers!

Note that I’m not saying all free software or open source software is like this, but that plenty is. Free and open source software development is informed by, and mimics, commercial software engineering to a large extent.

Of course it’s this way, you say, we software engineers need our expensive software engineering lifestyles supported by our high software engineering salaries, so we learn our craft in corporate service and that informs all of our development, including open source. Or that we are only able to contribute to open source when it’s in pursuit of our employers’ goals, because Computering Time is something we do in the office. So it’s no surprise that a lot of open source software development looks like, or is, corporate software development. If only there were proper, sustainable funding for open source software!

To which I say: that is an interesting, and problematic, request, and I wish to put it to one side. Maybe I’ll revisit it in a later post. What I’m more interested in, is what an open source movement that was centered around the Four Freedoms, rather than software-licensing concerns, would look like. One in which you didn’t merely have some abstract legal freedom to do the four activities, but were empowered to do so.

Power Zero: The power to run the program for any purpose.

How much free or open source software cannot directly be used by anyone who isn’t a programmer? Think of all of the things that are only distributed as developer libraries, for developers to incorporate into (commercial or open source) applications. The things that get duplicated as a pod, an egg, a crate, and in whatever new packaging system and programming language comes along. This is the repository namespace as a virtual landgrab, enabling open source as corporate recruitment tool: you should hire me, you’ve heard of me because I wrote the language-your-programmers-use version of library-your-programmers-use.

How much free or open source software is just plain difficult, due to accidental rather than essential complexity? Developers will probably have all sorts of (developer tools) examples here, like GNU autoconf. I find it very hard to make a nice-looking document using open source tools, too. I’ve put enough effort into learning emacs and LaTeX to get somewhat proficient, but still spend a lot of time looking up TeX syntax and getting it wrong. And making (hopefully nice-looking) documents is something I do fairly frequently.

And I’m playing this game on the easy setting. I’ve got years of experience trying to make software work. I am willing (and often paid) to put time into understanding why software doesn’t do what I want. I speak English, the home language of much software, and can use a screen and keyboard without difficulty.

A free software movement in which Freedom 0 is replaced by Empowerment 0 would make getting, trying, and adopting free software trivial. Much simpler than an app store, which has the necessary gatekeeper of payments.

Power One: The power to study how the program works, and change it to make it do what you wish.

Access to the source is a precondition for this. Also, the source being in a readily comprehensible format, amenable to experimentation and adaptation are preconditions. It needs to be possible for a finance person, not a computer person, to look at a finance application like GNUcash, understand its model of finance, and adapt it to their model of finance.

This means elevating automated testing from a thing that developers claim they do sometimes, to the principal mode of hypothesis-driven change in software. Remember when Dan North said that Cucumber would allow business analysts and developers to collaborate on writing the tests? That, but collaborating on writing the software. Currently modes of software development, including free and open source software, are predicated on the division of society into three classes: “developers” who make software, “the business” who sponsor software making, and “users” who do whatever it is they do. An enabling free software movement would erase these distinctions, because it would give the ability (not merely the freedom) to study and change the software to anyone who wanted or needed it.

Software developed with this in mind would have – nay, require – a very clear architecture. If you want a finance person to critique the finance model used in a finance application, everything needs to scream finance. It needs to stop screaming model, view, controller, or memory management, or database transaction, and start shouting credit, debit, accounts receivable.

That doesn’t mean that there isn’t space for experts in memory management or database transactions, but it does mean that you can understand a music score pagesetting application to the point where you can improve its representation of Klezmer modes without needing to understand memory management or database transactions.

Power Two: The power to redistribute and make copies so you can help your neighbour.

An enabling free software movement would make it easy for me to package my computer, or a part of it, and send it to someone else: “here, I find this useful, you give it a go”. So I don’t have to grub around (pardon the pun) for whatever guix, apt, yum, pkcon, brew, pkg or whatever command I had to run to make the software work and tell that person to run the same command, hoping it works. I just give them the thing, and they use it.

Power Three: The power to improve the program, and release your improvements (and modified versions in general) to the public, so that the whole community benefits.

Currently there is a blessed edifice, called “upstream”, the fount of all that is good in software. Any corporate programmer who wants to juice their proprietary github profile longs for their “requests” to be “pulled” by upstream, so that all of those other programmers who are in thrall to upstream finally get to see the fruits of this individual’s labour.

It feels weird to say this in 2020, when the idea was presented as fait accompli in 1997, but an enabling open source software movement would operate more like a bazaar than a cathedral. There wouldn’t be an “upstream”, there would be different people who all had the version of the software that worked best for them. It would be easy to evaluate, compare, combine and modify versions, so that the version you end up with is the one that works best for you, too.

The Four Powers

The combination of these powers points to an open source software movement that erases power dynamics implicit and explicit in our current modes of producing software. It’s as easy for someone who understands the domain of a software system to acquire, understand, improve and share that system as it is for someone who understands the computer it runs on. The infinite malleability of software is deployed to allow people, teams and communities to produce and share their own versions that work best for them.

The antagonism between “the developers” and “the business” documented in the principles behind the agile manifesto is left to commercial software companies. Users, developers, and sponsors are on the same team, and produce software that works better for them than if they worked in other ways.

Number Stations by Bruce Lawson (@brucel)

A new song. It’s inspired by numbers stations, “a shortwave radio station characterized by broadcasts of formatted numbers, which are believed to be addressed to intelligence officers operating in foreign countries. Most identified stations use speech synthesis to vocalize numbers”. This got me thinking about clandestine communication and betrayal.

I heard chatter on the network.
But I couldn’t crack your code.
I was waiting defenceless
for your bombshells to explode.

If you’re here, there is a reason.
Your ciphers are all known.
To everything there is a season.
Now you’re here, your cover’s blown.

I don’t recall why we are enemies.
I don’t understand what we are fighting for.
I forgot my ideology,
half way across the bridge
in this cold, cold war.

You walked down to the checkpoint.
I saw graffiti on the wall.
You presented your false papers,
and the wall began to fall.

Words and music © Bruce Lawson 2020, all rights reserved.
Production and bass guitar: Shez of @silverlakemusic.

February 08, 2020

Here’s another old song that my band The Lucies used to gig, mixed last Wednesday. I’ve no idea what it’s about—I was in a “special state of mind” when I wrote it. “Yakamoz” is a Turkish word which is used when the moonlight shines on the sea, ocean etc.

Candyfloss moon
there is only half an hour til daybreak
You leave me too soon
Stay a while and I’ll watch your heart break

Through all the tears and the rage
This is our golden age
Through the silver rain
I see you wax and wane

Candyfloss moon
I’ve been torn apart and reassembled
Here in this room
I can see the stars that you resemble

Turn off your mind
turn down your radio
I hear angels singing all the time
Shut down your shadow
slow down your heartbeat
Why do your eyes shine?

Yakamoz moon
I see you glow on tranquil seas
Your flowers are in bloom
lilies, fuchsia, rosemary

Words and music © Bruce Lawson 2020, all rights reserved.
Production: Shez of @silverlakemusic.

February 07, 2020

This morning I was introduced to Roam Research by Blair Wadman who kindly spent an hour talking through his setup. I’ve since spent some time playing with it and I’m impressed.

Roam is hard to explain. It’s a note-taking tool that uses an outline structure (think Workflowy), with powerful cross-linking capabilities making it easy to organise and find information. It’s setup like a journal, with today’s date at the top, which makes the concept even more appealing.

Nat Eliason has an excellent article on how he’s using Roam that would make a great starting point if you’re interested in learning more.

Reading List 249 by Bruce Lawson (@brucel)

I figured it might be fun to talk about some of my earliest memories of being a maker.

I think my current interest started with issue 40 of MagPi magazine in December 2015, famous for being the first magazine to give a computer (the Raspberry Pi Zero) for free as a cover gift. I’d picked up a couple of the original Raspberry Pi models in 2012, but it wasn’t until the Zero that my imagination took off, and lead me down this path.

But from an early age, I think I was always destined to be a maker, as I think some of these memories will highlight.

Robotic clone

I remember having a fascination with robots from an early age. Back when we lived in Hoo (near Rochester), I used to talk with my friend about making robot substitutes that we could send to school in our place. They’d look exactly like us, and be powered by control panels in our bedroom, letting us skip school.

When we moved to Bexleyheath this fascination continued, as I recall checking out and reading various books about robots from the primary school library. I also remember being fascinated by a programmable robot the school had, which could be programmed to move forward and backward, as well as turning in either direction, and could draw images with a pencil placed in it’s body. I have no idea what it was called, but I’m sure there’s someone out there that knows what I’m talking about.

Interestingly, robotics isn’t currently as much of an interest to me as you might imagine. I have a couple of beginner robotics kits which Lucy got for me, including a really cool robotic arm which I built one Christmas, but I’m currently lacking the interest in exploring any further than this, I think partly because of the reliance on computers for robotics, and the fact I’m trying to get away from using computers all the time.


Also while in primary school, I remember making a whirlpool experiment I’d seen on a TV program (it might have been How 2) and taking it to show my teacher (I think his name was Mr March). The experiment consisted of two plastic cola bottles, joined at the lid with the screw facing out, and a hole melted through the middle of the join. The idea was to fill one of the bottles with water, then screw both bottles into either side of the joined cap. As the water filtered from the upper bottle down into the lower one, you could rapidly shake the bottle in a round motion, which would cause the water in the upper bottle to form into a whirlpool.

Beyond looking pretty, I’m sure there was a lesson in among the explanation featured on thee TV show, but I probably didn’t pay much attention to that, I just thought it would be fun to make.

Quiz circuitry

When moving to secondary school (age 11-16), I had the opportunity to apply for a technical collage, but had to make and present a project as part of the application interview. At the time, the best I could come up with was the classic tin-can telephone, which I’m sure would have been fine, if I had been able to explain why it works, but as I wasn’t really able to, I failed the application.

What I should have done instead is make another project that I’d seen on TV, an electronic quiz game. This was a simple exercise in circuitry which featured a number of metallic contact points running down either side of a sheet of box cardboard, which were connected one side to the other in a random order on the back via jump wires. The player of the game had two metallic probes connected to a small battery and an LED, and would play by using the two probes to connect the question contact with the appropriate answer contact, thus completing the circuit and illuminating the LED. This something I understood well, and I’m sure I’d have been able to explain it fully.

I’m not sure why I didn’t make this, but I do remember talking with my parents about it shortly after the interview (it was definitely something I’d seen before the interview), and them asking me why I hadn’t done that instead, but I guess 11-year-old Daniel was being a typical 11-year-old.

As an adult, electronics has some interest to me, and I’ve spent a fair amount of time learning the basics, but I don’t think I’m very good at it. I know enough to wire up some LEDs and other basic circuits to an Arduino, which is more than enough for now.

Ornamental display box

The last thing I remember is a woodworking project I made for CDT (Craft, Design, and Technology) while at secondary school. I had an interest in collecting miniature figures and wanted something I could store and display them on.

The design was a simple plywood box with removable lid, maybe around 20cm wide and tall. Sticking out the top of the lid was a thick dowel, onto which another sheet of plywood was attached, cut into an interesting shape, and designed to act as a platform to display the figures. I remember having plans to cover it with fake grass (the type used on miniature train sets) but I don’t think this ever happened.

In any case, anyone that’s read even a few pages of this blog know that I’m very much into woodworking, and have the great fortune of having my very own workshop for this very purpose.

What about you?

I’ve shared some of my memories, what are your earliest memories of being a maker? Post a comment below and let me know.

February 06, 2020

A very old song that I wrote when I was about 17, inspired by melodic pop-punk of Buzzcocks and The Undertones. Shez and I gigged it in a school band, then I forgot it. When Pete Shelley of Buzzcocks died, I remembered it, so recorded it. My old chum Shez played bass when we were in a school band, and mixed it yesterday, 37 years later!

She just loves to be loved.
She just needs to feel needed
And you know she will tear you in half in the end.

She just likes to feel liked
And it doesn’t really matter who by
And you know she will break your heart, my friend.

Don’t ask her does she love you?
You’ll get a vague reply.
So what, she said she needs you?
Would she look you in the eye?
And when she upsets you
Don’t let her see you cry.
She feeds on your emotions
She’s gonna bleed you dry.

You thought that you’d got her to keep.
She says the novelty wore off after a week.
And you know she just loves to be loved.

She’ll love you for ten days
and then she won’t remember your face
And you know she just loves to be loved.

And now that you are just her ex,
and you see she’s moved on to her next.
And you know she just loves to be loved.

Everyone knows she just loves to be loved.

Words and music © Bruce Lawson 1983, all rights reserved.

January 31, 2020

Reading List 248 by Bruce Lawson (@brucel)

Came across this quote from It Doesn’t Have to Be Crazy at Work today and it resonated with me:

Happiness is shipping: finishing good work, sending it off, and then moving on to the next idea.

I’ve not shipped as much as I’d have liked over the past few years, so this feels like a good mantra.

January 30, 2020

Newsletter reboot by Marc Jenkins (@marcjenkins)

I’m relaunching my newsletter this week. If you want to get a monthly email from me that includes links to the latest articles I’ve written, as well as recommendations for interesting articles, books or tools I’ve come across, then sign up today.

I’ve just published some updates to my /Uses page. I cover the hardware and software I’m currently using and my current desk setup. Hat tip to Harry Roberts, Wes Bos and the excellent Uses This site for inspiration.

Suits you? by Andy Wootton (@WooTube)

Last night I went to a ‘Product Tank Birmingham’ workshop on ‘Empathy Mapping’. As an exercise, we looked at ‘a product meeting group’ and tried to identify its customers. There was a brief discussion about ‘Product Owners’ (from agile software development) and ‘Product Managers’ who often have a more marketing-led approach. Someone then commented on what ‘Product people’ think. I found I didn’t agree. I reflected on the difference between Product Owners (in this context: me), who care about giving people the product they want and Product Managers, who seem to care more about people’s relationship with the product.

I realised there is a half-way house and I have not, to date, worked in it. My experience in agile software development has been about “custom” development of software products for small teams with a shared view of what they want. I’ve realised for a while that my experience is very different to those Product Owners who have to develop a more generic product to ‘optimise’ across a set of potential or actual customers who have differing needs. There is an extra role there which is far more like my understanding of Product Management. I think the key difference is the need to correctly judge the closeness of fit needed to achieve mass market appeal vs the bespoke tailoring trade that I’ve worked in.

Early in my career, I worked as a programmer on a software package for pharmaceutical companies. We coded to specifications provided by 2 people, a salesman and our technical manager, who both travelled the world visiting customers’ sites. Looking back, I think the salesman was much better at identifying the features that would be valued by most customers. Is marketing USEFUL?

Being that this is a .44 Magnum, the most powerful handgun in the world, and would blow your head clean off…
You’ve got to ask yourself one question: do I feel lucky?
— “Dirty” Harry Callaghan

Kinda, Harry.

I am pretty lucky, after all. I have work I like, friends I like, my daughter, there’s a pie shop within walking distance, I’ve been hanging out ont he web writing these birthday posts for sixteen years now. And 44 is a “happy” number according to Wikipedia, and also the UK’s international dialling code. Internationalism is a lot on my mind, since Brexit happens tomorrow, and now I have to look at government guidelines on what I have to do when “travelling for business”, which speaking at conferences in Europe apparently counts as. I am sure that this will make my life more complicated; any time you have to jump through a bunch of hoops to fill out forms, someone will screw it up, and that someone is usually me. I wish being a metropolitan elite came with the benefits that it’s supposed to so I could counterbalance them.

Anyway, politics aside, let’s leave myself another note for next year. I’m spending some of today writing proposals for work, which is good stuff. Future me, this is the — how shall I describe it so that I know what it is but it remains secret? Let’s call it the Vicious Cabaret project. Looks like that may happen, which is cool. I’ve also made a bunch of progress during January on the top-secret Swordcello project, which shall remain under wraps, but wheels are moving. Things are OK, generally. I got this fantastic envelope around a card: it’s great having friends who are artists; nice one Gaby.

aliens invade, and call me out by name. And there's a Thor stamp.

Interestingly, last year I was at BrumPHP the day after my birthday; this year, I’m there tonight! So pop along; might be a pint or two.

Happy birthday to me.

January 29, 2020

All My Endeavour by Stuart Langridge (@sil)

A discovery.

What a return for all my endeavour—
Not to mention the L. S. D!
I am an atheist now and for ever,
Because this God has afflicted me!

It’s from Rudyard Kipling’s Natural Theology, which I’d never read and which I wholly intend to mine for lines for imploring sympathy next time I’m suffering from manflu or have a hangover or something, after having read Neil Gaiman do the same back in 2004. He was actually ill, though.

Did close friends call Rudyard Kipling “Rudy”? It’s actually short for his name, although it doesn’t sound like it. Maybe I’ve been pronouncing it wrong all these years: is he “Rudy-ard” rather than “Rud-yard”?

In fifty minutes it’s my birthday, although the annual birthday post will have to wait until tomorrow.

Yes, I know he was talking about currency. Albert Hoffman didn’t synthesise LSD for another 19 years. But it’s funny.

Pairing in Github by Graham Lee

In the world of free software, it’s good to appropriately credit contributors to your community for the work they do.

git makes this hard when you pair program. I was at a hackathon recently, and while I didn’t make a single commit, I sat next to a lot of other people who made plenty of commits based on conversations we had, and suggested a lot of things to try to debug problems, and invented solutions that made it into those commits. No highly-nutritious green squares in github for me, no external evidence that I had contributed two days of my time to these free software projects.

When I pair, if I’m committing, I make sure that I acknowledge the contribution my pair makes as equal to my own. In the github UI, it looks like this. You can see that both of us contributed to the commit.

How do I do this? I commit like this:

git commit -m 'We fixed this thing' --author 'Jennifer H. Pair <>'

Now both accounts are linked in the UI, because I’m the committer and my pair is the author. This isn’t perfect, because github doesn’t acknowledge the author in their contribution graph, only the committer. If there’s a more egalitarian way to acknowledge my pair I’d want to follow that, but for the moment I’m happy to at least demonstrate that they authored the change I typed into a text editor.

January 27, 2020

Offset Earth by Marc Jenkins (@marcjenkins)

A small win last week: I signed up for Offset Earth. For a small monthly fee, you can offset your carbon footprint by planting trees.

January 25, 2020

Write more by Stuart Langridge (@sil)

I’ve written a couple of things here recently and I’d forgotten how much I enjoy doing that. I should do more of it.

Most of my creative writing energy goes into D&D, or stuff for work, or talks at conferences, or #sundayroastclub, but I think quite a lot of it is bled away by Twitter; an idea happens, and then while it’s still just an idea I tweet it and then it’s used up. There’s a certain amount of instant gratification involved in this, of course, but I think it’s like a pressure valve; because a tweet is so short, so immediate, it’s easy to release the steam in a hundred tiny bursts rather than one long exhalation. I’m not good at metaphors, but in my head this seems like one of those thermometers for charities: my creative wellspring builds up to the overflow point — call it the value of 50 — and so I tweet something which drops it back down to 48. Then it builds up again to 50 and another tweet drops it back to 48, and so on. In the old days, it’d run up to fifty and then keep going while I was consumed with the desire to write but also consumed with the time required to actually write something, and then there’d be something long and detailed and interesting which would knock me back down to thirty, or ten, or nought.

I kinda miss that. I’m not sure what to do about it, though. Swearing off Twitter isn’t really an option; even ignoring the catastrophic tsunami of FOMO that would ensue, I’d be hugely worried that if I’m not part of the conversation, part of the zeitgeist, I’d just vanish from the public discourse. Not sure my ego could cope with that.

So I’m between the devil and the deep blue sea. Neither of those are nice (which, obviously, is the point) but, like so many people before me, and I suspect me included, I think I’m going to make an effort to turn more thoughts into writing rather than into snide asides or half-finished thoughts where maybe a hundred likes will finish them.

Of course I don’t have comments, so your thoughts on this should be communicated to me via Twitter. The irony hurricane proceeds apace. (Or on your own weblog which then sends me a webmention via the form below, of course, but that’s not all that likely yet.) Check in a month whether I’ve even remotely stuck to this or if I’ve just taken the easy option.

January 24, 2020

New Starter: Andrew Fletcher

Has learning all about Sam left you eagerly wanting more? Never fear, we have you covered. Continuing with our series of posts introducing our new starters we would like to introduce another new member to the super talented Made family.

Next up…

What is your name?
Andrew Fletcher

And Where are You from?
The Venice of the North - Birmingham

Digital Analyst

What is it you do?
My main responsibility is to offer support and expertise to our clients when it comes to their digital marketing endeavours.  This can obviously cover a wide variety of requests, such as producing and delivering SEO plans, problem-solving tracking and analytics issues, advice on digital marketing strategy and managing marketing campaigns.

Tell us a little about your professional journey to Made?
I have over 8 years of digital marketing and data analysis experience, 5 of which was spent at Drayton Manor Park, where my office was opposite the ‘Accelerator’ (Formerly Ben10) rollercoaster.  So I feel I have acquired quite a bit of knowledge and insight into the challenges organisations have, trying to persuade potential customers to purchase tickets to an event. 

Before that, I worked at MobileFun, who sold mobile phone accessories all over the world.  It is here where I found my calling in digital marketing and analytics.

I am passionate about getting actionable insights from data and how this insight can help maximise ROI on marketing activity and digital investment.

I also have a degree in Drama. I felt if I couldn’t have a career on the stage or around the stage, helping those that do was just as good.

What do you like doing when you’re not working?
I used to like doing a wide variety of things, from video gaming to watching sports, but that all seems a distant memory now that I have a 2-year-old son. Now I spend most of my time making sure he hasn’t put the TV remote in the washing machine or the car keys in the bin.

What is your proudest achievement?
I once managed a 12 dart checkout in darts; I’ve called myself Andrew ‘The Archer’ Fletcher ever since.

What is your slogan in life?
Only worry about the things you can actually affect or change.  

What is the best thing you’ve ever seen performed?
Julius Caesar at the RSC. I went on a school trip when I was about 12. Blew me away and gave me a lifelong love of the theatre and togas.

‘Alexa…’ or 'Hey Google…’?
Hey Google…  turn the heating down (I’m sure my wife was raised in a volcano).

If you were an Animated Character, who would you be and why?
Carl (the elderly man) from Up - I’m just a little grumpy and want to be by myself from time to time.

What would the title of your autobiography be?
'Don’t waste your money’… It’s a very short book

What is the best thing you’ve MADE for someone or have had MADE for you?
I made a Star Wars mobile for my son before he was born. X-Wings, TIE-Fighters and Star Wars music — even I was impressed by my handy work.  It was the first thing I did when my wife told me she was pregnant. I think it was my nesting stage.

Reading List 247 by Bruce Lawson (@brucel)

Hello, you divine diplodocus! Here’s the best of my reading from the last 2 weeks. Last week I was sunning myself in Marbella, Spain, at Forum for the Future, as a guest of the Joomla community. (I’m on their Open Source Matters Advisory Board.)

Anyhow, here we go!

January 23, 2020

I’ve been using Goodreads to track the books I’ve read since 2014. Since then, I’ve read on average 18.3 books per year.

I don’t have a reliable way to track how much time I spend reading, but anecdotally it’s around 20 minutes per day. I read in dribs and drabs. On one day I’ll read for hour and then I won’t read a thing for days on end.

Assuming I live to the age of 80 and that I’ll be reading until the day I die, that gives me 47 book-reading-years left.

At my current rate of reading, I have 860 books left to read in my life time.

If I was to increase my reading time to 30 minutes per day, that’ll mean I’ll be getting through 27.5 books per year. That now means I could get through an additional 432 books, a total of 1292 books in my remaining years.

Now, let’s push this further and say I read for an hour a day. It may sound like a lot, but most of us watch far more TV than that in any given day. A few small habit changes and it’s possible to read more.

Reading for an hour daily means I’ll be getting through 55 books in a year. At this rate I could get through 2858 books before the age of 80, 1725 more just from increasing the time I read from 20 to 60 minutes per day.

That’s why I’m going to push myself to read for at least an hour every day.

January 21, 2020

An old Mac Mini server was ‘going in the skip’ because it had been replaced as an office server. It was handed to me instead, due to my reputation as an IT dumpster diver. (server model: 2.66 GHz Core 2 Duo (P8800))

I did MANY upgrades to get it to the latest release, 10.13 High Sierra. A couple of weeks later, Apple announced that they were stopping further updates. I understood at the time this was because this generation of hardware had a 32-bit EFI boot system, despite being a 64-bit processor and that it was only possible to boot Ubuntu by modifying the Ubuntu OSI image. This may have been true at the time. I’ve tried to get to know MacOS but it sometimes feels really sluggish on this hardware and now I’m not seeing the latest features, I decided to consider giving up the struggle.

Today, I tried to boot an Ubuntu 64-bit image from a ‘live’ USB memory stick I’d built on another Ubuntu system. I wanted to see how it would fail. To my surprise, it booted. I had to go into Settings to add a WiFi connections. The only problem I had was that tinny sound came from the Mac Mini’s internal speaker. When I plugged the headphone socket to the TV, rather than being routed by HDMI and the TV’s stereo sound inputs as Mac OS would do, I had no sound. A full install might fix that.

You get (this) Mac to boot from another device by pressing the <Alt> key at startup.
(This didn’t work on a white iMac with a Core 2 Duo processor when I tried months ago but that was probably an earlier version of Ubuntu.)

January 19, 2020

Number word sequences by Stuart Langridge (@sil)

I was idly musing about number sequences, and the Lychrel algorithm. If you don’t know about this, there’s a good Numberphile video on it: basically, take any number, reverse it, add the two, and if you get a palindrome stop, and if you don’t, keep doing it. So start with, say, 57, reverse to get 75, add them to get 57+75=132, which isn’t a palindrome, so do it again; reverse 132 to get 231, add to get 132+231=363, and that’s a palindrome, so stop. There are a bunch of interesting questions that can be asked about this process (which James Grime goes into in the video), among which are: does this always terminate? What’s the longest chain before termination? And so on. 196 famously hasn’t terminated so far and it’s been tried for several billion iterations.

Anyway, I was thinking about another such iterative process. Take a number, express it in words, then add up the values of all the letters in the words, and do it again. So 1 becomes ONE, and ONE is 15, 14, 5 (O is the fifteenth letter of the alphabet, N the fourteenth, and so on), so we add 15+14+5 to get 34, which becomes THIRTY FOUR, and so on. (We skip spaces and dashes; just the letters.)

Take a complete example: let’s start with 4.

  • 4 -> FOUR -> 6+15+21+18 = 60
  • 60 -> SIXTY -> 19+9+24+20+25 = 97
  • 97 -> NINETY-SEVEN -> 14+9+14+5+20+25+19+5+22+5+14 = 152
  • 152 -> ONE HUNDRED AND FIFTY-TWO -> 15+14+5+8+21+14+4+18+5+4+1+14+4+6+9+6+20+25+20+23+15 = 251
  • 251 -> TWO HUNDRED AND FIFTY-ONE -> 20+23+15+8+21+14+4+18+5+4+1+14+4+6+9+6+20+25+15+14+5 = 251

and 251 is a fixed point: it becomes itself. So we stop there, because we’re now in an infinite loop.

A graph of this iterative process, starting at 4

Do all numbers eventually go into a loop? Do all numbers go into the same loop — that is, do they all end up at 251?

It’s hard to tell. (Well, it’s hard to tell for me. Some of you may see some easy way to prove this, in which case do let me know.) Me being me, I wrote a little Python programme to test this out (helped immeasurably by the Python 3 num2words library). As I discovered before, if you’re trying to pick out patterns in a big graph of numbers which all link to one another, it’s a lot easier to have graphviz draw you pretty pictures, so that’s what I did.

I’ve run numbers up to 5000 or so (after that I got a bit bored waiting for answers; it’s not recreational mathematics if I have to wait around, it’s a job for which I’m not getting paid). And it looks like numbers settle out into a tiny island which ends up at 251, a little island which ends up at 285, and a massive island which ends up at 259, all of which become themselves1. (You can see an image of the first 500 numbers and how they end up; extending that up to 5000 just makes the islands larger, it doesn’t create new islands… and the diagrams either get rather unwieldy or they get really big and they’re hard to display.2)

A graph of the first 500 numbers and their connections

I have a theory that (a) yes all numbers end up in a fixed point and (b) there probably aren’t any more fixed points. Warning: dubious mathematical assertions lie ahead.

There can’t be that many numbers that encode to themselves. This is both because I’ve run it up to 5000 and there aren’t, and because it just seems kinda unlikely and coincidental. So, we assume that the fixed points we have are most or all of the fixed points available. Now, every number has to end up somewhere; the process can’t just keep going forever. So, if you keep generating numbers, you’re pretty likely at some point to hit a number you’ve already hit, which ends up at one of the fixed points. And finally, the numbers-to-words process doesn’t grow as fast as actual numbers do. Once you’ve got over a certain limit, you’ll pretty much always end up generating a number smaller than oneself in the next iteration. The reason I think this is that adding more to numbers doesn’t make their word lengths all that much longer. Take, for example, the longest number (in words) up to 100,000, which is (among others) 73,373, or seventy-three thousand, three hundred and seventy-three. This is 47 characters long. Even if they were all Z, which they aren’t, it’d generate 47×26=1222, which is way less than 73,373. And adding lots more doesn’t help much: if we add a million to that number, we put one million on the front of it, which is only another 10 characters, or a maximum added value of 260. There’s no actual ceiling — numbers in words still grow without limit as the number itself grows — but it doesn’t grow anywhere near as fast as the number itself does. So the numbers generally get smaller as they iterate, until they get down below four hundred or so… and all of those numbers terminate in one of the three fixed points already outlined. So I think that all numbers will terminate thus.

The obvious flaw with this argument is that it ought to apply to the reverse-and-add process above too and it doesn’t for 196 (and some others). So it’s possible that my approach will also make a Lychrel-ish number that may not terminate, but I don’t think it will; the argument above seems compelling.

You might be thinking: bloody English imperialist! What about les nombres, eh? Or die Zahlen? Did you check those? Mais oui, I checked (nice one num2words for supporting a zillion languages!) Same thing. There are different fixed points (French has one big island until 177, a very small island to 232, a 258, 436 pair, and 222 which encodes to itself and nothing else encodes to it, for example.Not quite: see the update at the end. Nothing changes about the maths, though. Images of French and German are available, and you can of course use the Python 3 script to make your own; run it as python3 no for Norwegian, etc.) You may also be thinking “what about American English, eh? 101 is ONE HUNDRED ONE, not ONE HUNDRED AND ONE.” I have not tested this, partially because I think the above argument should still hold for it, partially because num2words doesn’t support it, and partially because that’s what you get for throwing a bunch of perfectly good tea into the ocean, but I don’t think it’d be hard to verify if someone wants to try it.

No earth-shattering revelations here, not that it matters anyway because I’m 43 and you can only win a Fields Medal if you’re under forty, but this was a fun little diversion.

Update: Minirop pointed out on Twitter that my code wasn’t correctly highlighting the “end” of a chain, which indeed it was not. I’ve poked the code, and the diagrams, to do this better; it’s apparent that both French and German have most numbers end up in a fairy large loop, rather than at one specific number. I don’t think this alters my argument for why this is likely to happen for all numbers (because a loop of numbers which all encode to one another is about as rare as a single number which encodes to itself, I’d guess), but maybe I haven’t thought about it enough!

  1. Well, 285 is part of a 285, 267, 313, 248, 284, 285 loop.
  2. This is also why the graphs use neato, which is much less pleasing a layout for this than the “tree”-style layout of dot, because the dot images end up being 32,767 pixels across and all is a disaster.

In someone else’s project (which they’ll doubtless tell you about themselves when it’s done) I needed a tiny Python templating engine. That is: I wanted to be able to say, here is a template string, please substitute a bunch of variables into it. Now, Python already does this, in about thirty different ways, and str.format or string.Template do most of it as built-in.

str.format works like this:

"My name is {name} and I am {age} years old".format(name="Stuart", age=43)

and string.Template like this:

    "My name is $name and I am $age years old"
    ).safe_substitute(name="Stuart", age=43)

Both of which are pretty OK.

However, what they’re missing is loops; having more than one of a thing in your template, and looping over a list, substituting it each time. Every even fractionally-more-featureful templating system has this, whether Mustache or Jinja or whatever, of course, but I didn’t want another dependency. All I needed was str.format but with loops. So, I thought, I’ll write one, in about four lines of code, so I can just drop the function in to my Python file and then I’m good.

def LoopTemplate(s, ctx):
    def loophandler(m):
        md = m.groupdict()
        return "".join([LoopTemplate(md["content"], val)
                        for val in ctx[md["var"]]])
    return re.sub(r"\{loop (?P<var>[^}]+)\}(?P<content>.*?)\{endloop\}",
                  loophandler, s, flags=re.DOTALL).format(**ctx)

And lo, twas so. So I can now do

    "I am {name} and my imps' names are: {loop imps}{name}{endloop}",
        "name": "Stuart",
        "imps": [
            {"name": "Pyweazle"}, {"name": "Grimthacket"}, {"name": "Hardebon"}

and it all works. Not revolutionary, of course, but I was mildly pleased with myself.

Much internal debate about whether loophandler() should have been a lambda, but I eventually decided it was more confusing that way, on the grounds that it was confusing me and I knew what it was meant to be doing.

A brief explanation: re.sub lets you pass a function as the thing to replace with, rather than just a string. So we find all examples of {loop something}...{endloop} in the passed string, look up something in the “context”, or the dict of substitution variables you passed to LoopTemplate, and then we call LoopTemplate again, once per item in something (which is expected to be a list), and pass it the ... as its string and the next item in something as its context. So it all works. Of course, there’s no error handling or anything — if something isn’t present in the context, or if it’s not a list, or if you stray in any other way from the path of righteousness, it’ll incomprehensibly blow up. So don’t do that.

January 16, 2020

New Starter: Sam Harper-Wallis

Here at Made, we are always on the look-out for talented and passionate people who can help us on our mission to provide clients with a first-class service. 

Over the past few months, we have been lucky enough to find a few such individuals, so over the coming posts, we wanted to introduce you to them officially,  whilst also welcoming them into the Made family.

We asked our new starters to answer a few questions to try and learn a little more about them and we thought we would share their answers with you. 

First up…

What is your name?
Sam George (only if I am naughty) Harper-Wallis

And where are you from?

Digital Project Manager

What is it you do?
In a sentence…
I facilitate the delivery of the scope of a project for Made Media’s clients.

In a paragraph…
My job as a project manager involves many different functions: cat herder, scope wrangler, delivery man. As a PM it’s my job to watch over and coordinate projects to make sure that we can give the client exactly what they need on time and budget. Day to day this includes project client calls, trello management, testing, SoW writing, sprint briefing, requirement defining, and dependency gathering.

Tell us a little about your professional journey to Made?
In 2010 I went to university in Manchester to study Cellular Molecular Biology. I always had a passion for science, especially biology, so it was an easy choice.

After completing university I started to look for a job so naturally as a newly minted science graduate the obvious choice was to become a recruitment consultant. I did this job for around 6ish months, before being moved into a contracts manager/business manager role to scout out for new business opportunities.

I then fell into a product owner role with a new business being spun out from my company, focusing on supply teachers for the education sector. While working as a product owner, I was also dipping into project management. I really enjoyed this side of the business, so I decided to look for a job with an agency which my mentor at the time suggested would be the best challenge for me.

I moved to a small bespoke agency in Manchester, but I knew I wanted to move back home, so in May 2018 I decided to take an opportunity in Birmingham as a Digital Project Manager, with another agency based in the Jewellery Quarter. During my first year, I worked with some massive clients and really honed my project management skills.

Through this project management work, I started to work with the operations director who helped me implement changes which improved company-wide cohesion. I was then offered a new role that sat between the account and studio team. Here I was the gatekeeper for all things process. The studio process, work request process, support and SLA process. During this time I implemented new processes to improve efficiency. I did this for over half a year but my heart was elsewhere. I wanted to get back in front of clients and deliver great projects which I can be proud of.

In October I had an interview here at Made. We take a really pragmatic approach to development resource and project management which appealed to me. So I was extremely pleased when I was offered the job as a project manager.

I joined in November and so far I am loving every day! 

What do you like doing when you’re not working?
Mostly cooking, gardening, eating, walking the doggo.

What is your proudest achievement?
I completed Bravo Training in the Army Reserves. I started my 16 days of training at Grantham, getting up at 5 am and going to bed, at some times 11 pm.  This wasn’t the hard part, nor the constant exercise or sleeping in the cold or even drills. It was being away from my girlfriend Hannah.

What is your slogan in life?
You can’t control people’s actions but you can control your reactions to them.

What is the best thing you’ve ever seen performed?
Cirque du Soleil.

‘Alexa…’ or 'Hey Google…’?
Hey Google…

If you were an Animated Character, who would you be and why?
My girlfriend helped me answer this as I was struggling - “You’re Jimmy Neutron - You have a massive head, not because you’re clever, you just have a massive head”.

What would the title of your autobiography be?
The man with a massive head.

What is the best thing you’ve MADE for someone or have had MADE for you?
I make the best lasagne - FACT.

January 15, 2020

I loved reading Patrick Collison’s Fast Project. He has compiled a list of ambitious projects that were completed incredibly quickly. Some of my favourite examples include the iPod shipping in 290 days after being started and Amazon Prime being brought to life in 6 weeks.

January 13, 2020

After a few weeks off over the holiday period, I’ve been using The Theme System Journal to help get my habits back on track.

These are the daily habits I’m currently tracking:

  1. Reading (20 mins+)
  2. Writing (20 mins+)
  3. Complete highlight
  4. Deep work (3 hours+)
  5. Meditate
  6. Close activity rings
  7. Go for a walk
  8. No alcohol
  9. Finish work at 5:30pm

January 10, 2020

Reading List 246 by Bruce Lawson (@brucel)

Happy Nude Year, you perfectly pouting porcupine!

January 09, 2020

Last year, I started my review with this:

One of the wonderful benefits of these annual reviews is that it encourages you to look back at the year as a whole. I was reminded that 2018 was actually a really good year.

It’s true: these reviews are a great way to reflect on the year and they help remind you how much you’ve accomplished. I nearly didn’t write a review this year. 2019 was a mixed bag and it didn’t feel like there was much to share. But as this is my fifth annual review (see 2015, 2016, 2017, 2018), I knew I’d regret it if I didn’t publish this.

So, with that said, here was my 2019.

What went well

Completed the house extension. Boy does it feel good to write those words! We started planning the house extension in late 2017 and it has taken up a good amount of our time and energy since then. We’ve added an additional bedroom, doubled the size of an existing bedroom, increased the size of our bathroom, and added a utility room and a garage. It was stressful at times – it often felt like a new problem would present itself daily – but my wife and I worked through each issue together and that has made us closer. It’s the biggest thing we’ve worked on and accomplished together.

Home office improvements. As part of the house extension, my home office got an upgrade. My old office was in a small bedroom which wasn’t even big enough to fit a double bed. The new office is much more spacious. I’ve added additional storage and my favourite new addition: a reading chair. It’s great being able to move from my desk and sit in comfort with my iPad to plan the day, read or just think. I’m looking forward to improving the office further in the coming year.

My current desk setup
My favourite new additional to the office: a reading chair

5 years of self-employment. November marked my 5th anniversary of self-employment. It can’t believe it has been that long. This year has been kind to my business – I’m on track to have my best financial year yet and have signed up new clients that I’m excited to work with. I’m still transitioning from freelancer to consultant, and that has been both challenging and rewarding.

Health & diet. My wife and I switched to a pescatarian diet in November 2017. Throughout the past year, we’ve gradually eaten less fish and dairy and most of the meals we eat are vegan. I’m not sure we’ll ever go completely vegan, but my energy levels have improved and my weight has stabilised from eating a mostly plant-based diet. The Apple Watch continues to play a big role in keeping me active. I try to close my activity rings most days and in November I got my first Perfect Month badge. I’ve also been using Pedometer++ for step counting and managed to complete 10 out of 12 monthly challenges.

Reading. While I only read 16 books in the past year, the amount of books I read outside my usual comfort zone was higher (mostly thanks to the book club I participate in). Books like The Lessons of History, Educated and A Million Miles in a Thousand Years are not books I would have picked to read, but I learnt a lot from them and enjoyed them greatly.

A few other things that I’ve enjoyed or accomplished in 2019

  • I jumped out of a plane for the first time and I can’t wait to do it again. The adrenaline rush is like nothing else I’ve experienced.
  • I started meditating regularly again using the Waking Up app (the 50 day introductory course is incredible, I couldn’t recommend it more highly).
  • I started using the Theme System Journal to track my habits and keep focused during the day (I’ll be writing about this soon).
  • I’ve continued cutting down on my social media usage after deleting my Facebook account in 2018. I’ve only tweeted a handful of times and I finally deleted Instagram in November. It feels great.
  • I went to watch the Allam British Open Squash Championships in Hull. One of the games we saw just so happened to be the game of the season.
  • We had our first vegetarian tasting menu at Carters of Moseley to celebrate our wedding anniversary. It was superb.
  • I upgraded to the iPhone 11 Pro. I’m so pleased with both the camera and battery performance. I’m taking more photos as a result.
  • I travelled to Amsterdam to work with the guys at modmore. It’s a beautiful city and I can’t wait to return so I can explore more of it.
  • We also travelled to Barcelona to celebrate New Years with our good friends Stu and Chloe. The inside of the Sagrada Família was a highlight.
  • And a shout out to my mastermind group for their help and support. It has been amazing to watch and learn from them.

What went badly

Overworking. The house extension was tough. We spent much of our spare time in the first half of the year painting and decorating. As the house extension was nearing completion, I promised myself I’d dedicate all of my energy to my business once it was done. And I did that, but at a cost. I spent too many days and weekends working long hours. It wasn’t all that bad: I rebuilt my emergency savings fund and produced a lot of good work. But it’s not something I want to continue. Getting my work/life balance right is going to be a primary focus for 2020.

Over consumption. Despite cutting back on social media, I still felt I over consumed on media this year… news, politics and too many podcasts. I’m a podcast junky: I fill every spare moment with sound from my AirPods. I can’t remember the last time I took a walk without headphones in. I recognise that I need to change, so 2020 is the year that I allow more silence into my life.

Writing habit. This one is simple: I didn’t prioritise or make time for writing this year. I have started redesigning my blog ready for more writing and publishing. Of all my goals for the coming year, I want “writing” to be in my “what went well” section of my 2020 review.

Relationships. It’s hard to share this one as it’s so personal, but I’ve not invested enough time or effort in my family and friendships this year. Nor have I invested enough in my own marriage. I was distracted by other things, when really relationships are the most important thing I have. I know I can do better.

How I did against my 2019 goals

Complete the house extension. Done. We’re really happy with how this has gone. Score: A

Systems for my business. I’m in a better place with systems than I was this time last year, but there’s still more to do. Score: C

Reading. I only read 2 fiction books (6 was my target). And while I only read 16 books total, the quality and diversity of books I read this year was better than previous years. Score: C

Writing. Ugh. Score: F

Continue with our pescatarian diet, tweaking and finding new healthy recipes. I only stumbled and eat meat once (when I was stuck in Amsterdam airport for 24 hours due to a cancelled flight). We’ve found a bunch of new recipes we like and I enjoy cooking more than ever. Score: B

Improve the quality of my sleep with a better shutdown ritual in the evening. I never got a shutdown ritual to stick, but I have been tracking my sleep and have been going to bed at a consistent time. Score: C

Close the activity rings daily on my Apple Watch. Pretty good year for this, got my first perfect month and closed my activity rings on more days than not. Score: B

Start my daily meditation practice again. I’m not meditating every day, but in the last few months in particular I have been meditating most days. Score: C

Continue playing squash 2-3 times per week. It has been a great year for my squash playing and I’ve enjoyed it a lot. Score: A

Things I’m thinking about for 2020

Setting a yearly theme. I’m a long-time Cortex listener. A recurring topic on the show is yearly themes. Myke explains:

Instead of resolutions, we set an overall idea of how we would like to approach each year or season. This becomes almost like a guiding principle for our work and/or personal lives for that period.

I’m been thinking about my 2020 theme for a while and I’ve decided it’ll be The Year of Calm. Last year was frantic, my calendar was full and I had little down time. I want to change that. I’ll be sharing more about this soon.

Less contract work. In the past year, I’ve done a reasonable amount of contracting for local web development agencies. I’m in the process of shifting my business to focus more on my own clients and projects.

Blogging on my personal website. At the end of December, I spent a week redesigning this site. The feeling of having a new website makes me excited about writing again.

Build and release a product. I’ve been discussing some ideas with a friend. All that is left is the hard part: building and shipping it.

Fitness and health. I want to kit my garage out with some basic gym equipment, making it easier to do a morning workout. I’m also planning to do more hiking and cycling with the goal of increasing my base level of fitness. I’d like to reach my ideal body weight of 70kg (currently 75kg).

Environmental impact. The climate emergency we’re in is one of my biggest concerns. The recent scenes in Australia are heartbreaking. We’ve been taking small steps over the past few years, such as reducing single-use plastics, but I’d like to take that more seriously.

That’s all from me. Happy new decade!

January 07, 2020

When I started redesigning this website a few weeks ago, I started from a blank slate (an empty WordPress theme directory and a couple of Sass files that I use to start new projects). Since then, I’ve built out most of the core components to get the site looking reasonable.

On the surface, a blog design is simple. You have posts and pages and that’s usually about it. But when you dig deeper, you realise there’s lots of little design decisions that need to be made.

One such design decision is how blog posts are displayed. The previous version of my blog listed posts chronologically, like this:

The previous version of my blog listed blog posts by title

No dates, no content, just a list of blog posts. This approach is fine if each post is a self-contained topic, but it doesn’t feel particularly well suited to a ‘weblog’ where each post can vary in size. Clicking through to a post with two or three lines of text doesn’t feel right.

Now take Manton Reece’s blog as example:

Manton Reece’s blog

Manton’s blog has two types of posts: full articles and microposts. This is the approach I decided I wanted to take. Sometimes I just want to a share a thought or a link and several lines of text is all that is required. This smaller bite-size approach to blogging is called microblogging (incidentally, Manton runs

The design as it stands currently

This is the design I’ve ended up with. Very much inspired by Manton, I now have two types of post: a standard post and a note. I’m still experimenting with the format, but I hope that now that a post can be tweet-sized, it’ll make it easier to get back into the habit of publishing.

January 06, 2020

RUNOFF another copy? by Andy Wootton (@WooTube)

I was telling a story about my first job a couple of days ago. I was an ‘applications programmer’ at Cambridgeshire College of Art and Technology. There was an Argentinian lecturer who knew our systems. He asked if his wife could use the computer centre facilities to write up her research thesis during the Summer holidays. We were casual users of a text processing ‘tagging language’ for documentation. It was called DSR, Digital [Equipment Co.] Standard Runoff, so my colleague John suggested she used that. The ‘typing department’ had some fancy new ‘word processors’ (I think they were Wang) but we didn’t have any authority over them and wouldn’t be able to help her with problems. We also had doubts about whether they had the capacity for a whole thesis.

So it was that John and, in his absence, I provided occasional help to a charming, intelligent Argentinian woman during the outbreak of the Falklands War in 1982, while the British press ramped up the hatred of British idiots against the entire Argentinian nation. She was the first Argentinian I’d ever met and it was the first time I had any indication that fascism could also infect the UK or was personally shamed by the state of our newspapers. I remember us scooping up some hate-filled tabloid front page and dumping it, seconds before our guest arrived.

In later jobs I learned of Unix roff, nroff and troff and came to assume that Runoff was DEC’s version of the Unix tools. Today I discovered that isn’t true. DEC’s Runoff came from the common ancestor of the Unix tools, Runoff on CTSS then Multics (1964.)
“types out text segments in manuscript form.”

CTSS was also the original home of LISP, ALGOL and the text editor QED, the predecessor of ed, vi and vim.

January 02, 2020

December 24, 2019

For the 2018 festive season I started what I hoped would become a tradition of making Christmas gifts for my friends and family, by making eight wall-mounted bottle openers. I’d had the idea some time in late Autumn 2018, but it was early December before I started, and with everything else I had going on, that didn’t leave much time to do as good a job as I had wanted.

🎵 Last Christmas, I gave you my heart

In my mind I’d imagined elaborate bottle-shaped designs, with either magnets embedded in them or a little box under the opener, to catch the cap, but what I actually produced was less… good.

Amounting to little more than a cheap bottle opener mounted on a piece of pine, with a bit of chalkboard paint complimented with some chalk-based art by Lucy, and a coat of varnish, it’s hardly my best work. They didn’t even have a way of to attach them to the wall. Still, combined with the hampers Lucy and I made for everyone, I don’t think anyone was too disappointed. Except me.

Anyone who isn’t embarrassed of who they were last year probably isn’t learning enough.

Alain de Botton

This year I had a loftier ambition, and with a brand new workshop ready for use and a far longer lead time, I was going to continue the theme of alcoholic beverages by making everyone beer flight paddles.

🍻 Don’t worry, be hoppy

This was inspired by our holiday to Cyprus in May this year, where we partook in Beer Quest, an ale and cider tasting experience hosted by Aphrodite’s Rock Microbrewery. For just £45 you got transport from the hotel, a flight of home brewed beers or ciders, a huge platter of BBQ food, a tour of the brewery, and (most importantly) an open bar, before being transported back to the hotel again.

There’s a reason it’s listed at the top of things to do in Paphos.

Needless to say, there was very little activity from either Lucy or myself for the rest of that day, as we both opted for an early night.

🎅 Believe in your ‘elf

Fast forward four months, to early August, and I’d made some decisions about the paddles:

  • I wanted to use a wood other than pine
  • I wanted to use a finish other than paint or varnish
  • I wanted each paddle to be different

So, armed with little more than some inspiration from Pinterest, I ventured to Homebase and picked up the largest solid oak hobbyboard they did, and a handful of assorted cabinet handles, then popped next door to Homesense and picked up five sets of glasses, ranging in size from shot to pint.

When I got them home, I laid the board on my workbench, and after matching the handles I wanted to use for each set, I sat them on the board and placed them in different positions to find the best arrangement for each set with the most efficient use of the wood available.

Once I was happy with the layout, I used my table saw to chop the board down, then used a pencil and ruler to work out the exact positions of the holes for the glasses.

⛳ Hole in one

Now that I knew where I wanted the holes, I needed to find a way of making the holes. With one exception, none of the paddles were to have holes going all the way though, instead they were to be hollowed down to about half the thickness of the wood, which meant I’d not be able to use a holesaw, but something like a forstner bit should work well.

People don’t want to buy a quarter-inch drill, they want a quarter-inch hole.

Theodore Levitt

And it’s here that my ambition bit off just a little more than I could chew, as each of the glass sets were different sizes, with each requiring a hole larger than any of the forstner bits I already had. I solved this problem by putting my hand in my pocket and spending £55 buying four sets of bits from Amazon, ranging in size from 10mm right up to 90mm in diameter.

I knew that I’d not be able to use any of the larger bits in my hand drill, so had planned on using the drill press at Cheltenham Hackspace, but because the largest forstner bit had a shaft thicker than the chuck at the space could accommodate (oohh-eerrr), Andy from the space very generously let me use his personal drill press, and gave me some tips on how best to get the best results.

So while Lucy did some shopping at the Cheltenham retail parks, I got to work cutting the rest of the holes.

This went mostly OK, but as I started with the smallest holes, and gradually increased the sizes, I didn’t reduce the RPM on the drill as I increased, resulting in a little bit of burning on one of the flights, which I corrected for the next one. I also slipped a couple of times, resulting in some gouges in the wood, but nothing a bit of sanding can’t fix.

I also made the mistake of trying to go all the way though in one direction, thinking a sacrificial board underneath would help prevent tear-out. It didn’t. So for the other three holes needed for that paddle, I drilled a small hole in the centrer of each so I’d know where to start on the other side, then hollowed out half thickness on one side, then flipped it over and hollowed out the other half.

Two hours later, after having cut all the holes, and using the bandsaw to cut the paddle handle, I rescued Lucy from the rain.

💸 Money talks… but all mine ever says is good-bye

Now, I’m very happy being a member of the Cheltenham Hackspace – I’ve met some really nice people there, and in addition to the tools I’ve got access to, the expertise of the other members, and willingness to share it, is second to none.

But Cheltenham is 40 minutes down the M5, which isn’t exactly accessible, and means that when you find a mistake you’ve made after returning home, you can’t exactly just pop back to fix it.

The mistake in this instance was the size of the holes on two of the flights. After some experiments with the placement of the glasses I decided the holes for the skull glasses weren’t deep enough, and that the holes for the wobble glasses needed to not only go all the way through, but also needed to be slightly wider.

Now, despite it still being August at this point, with plenty of opportunity to get back to the space before Christmas to correct these issues, I’m an impatient person, and knew that waiting wasn’t going to scratch the itch I had.

It’s at this point I decided to buy my own pillar drill, and while I was spending money I might as well buy the tools from Aldi I’d had my eye on as well. Fast forward an amount money which was just a tad more than I could really afford, and I was soon the proud own of a bandsaw, belt and disk sander, a paint gun, a nailgun, and of course, a pillar drill.

🙋🏼‍♂️ Professional sawdust maker

With my new tools in tow, increasing the size of the holes was a doddle (and the new sander made it easy to smooth out the curves on the paddle), letting me move onto the next step of rounding over the edges with my router. My router table (also from Aldi, are you noticing a trend here?) is a bit fiddly to set to the correct depth, so it was important to use a piece of scrap wood to test it, but once this was dialled in, I made quick work of it, replacing all the sharp edges with a nice rounded ones.

More tricky was drilling holes for the handles, which needed precision of placement for any with more than a single screw. I also needed to shorten the screws (which were designed to be attached to far thicker things than my 18mm boards), which I did using a Dremel.

The penultimate step was to sand everything. I started with my random orbit sander for the main surfaces of each board, using 180 grit initially before moving to 240 grit. I was able to use a Rotary Flap Wheel Sander (attached to new pillar drill) to sand the inside of any holes which went all the way through, but in inside of any any partial holes needed regular sandpaper and elbow grease.

⚖ Oil be the judge of that

All that remained was to apply the finish, for which I’d opted to use Danish Oil. Applying three coats of oil, wiping off the excess after 5 minutes, and waiting 24 hours between coats, really brought out the natural beauty of the wood. Apparently it isn’t as protective as Lacquer or Varnish, but I think it should be more than suitable for the flights.

Once dried, I attached the handles, placed the glasses, and took these action shots:


In the time between when I originally wrote this post in late August, and Christmas day when it was published, I locked myself in the workshop and decided to put the remaining wood to good use, producing these additional pieces as gifts:

Oh, and I couldn’t go thought all that without at least making one bottle opener that I could be proud of:

I’m really happy with the way these have turned out, and am ever-so lightly jealous that I have to give them away, but happy to do so – I just hope they bring joy to their recipients – and then when I see them next, they’ll offer me a drink of something nice from them.

Happy Christmahanakwanzika!

December 20, 2019

Reading List 245 by Bruce Lawson (@brucel)

Merry Consumerfest, and a Happy Nude Year!

December 19, 2019

Brum tech pub crawl 2019 by Stuart Langridge (@sil)

It’s time for the Birmingham tech pub crawl! Saturday 28th December 2019.

This is called a pub crawl, but it’s really an excuse to get together, hang out, have a couple of drinks — alcoholic or not, that’s entirely up to you and there’s no pressure — in various places around the Jewellery Quarter. (There was discussion of being in the city centre, or in Digbeth, but since it’s a Saturday and we want to talk rather than scream over the music, the JQ it is.) Get away from the turkey and chill out and meet people. Bring your family and your friends along. Pop in for an hour while you’re in town and say hello, or show up at 12 noon and still be there at midnight, it’s up to you. Lots of people come at various points during the day, and it’s all very friendly, so if you don’t think you know anyone, or you’re on your own, that’s not a problem. Come, chat to people, have a drink, have a laugh. The agenda this year is, roughly, six different places and a couple of hours in each, so we move around a bit, but it’s all in the Jewellery Quarter so there’s not a lot of walking. If you’re feeling unsure do feel free to ping me — @sil on Twitter — and I can tell you where we are, and I’ll try to keep things updated during the day.

Everyone is welcome, and everyone is invited. Bring friends along; drink coffees or soft drinks; pop in for an hour; whatever you fancy. Tell everyone about your pressies, talk about all the tech you thought about over the Christmas period, or don’t talk about technology at all and just enjoy hanging out with your mates. Looking forward to seeing you all.

A rough agenda:

  • The Lord Clifden, 12pm - 2pm (they do food if you fancy lunch)
  • The Church, 2pm - 4pm
  • 1000 Trades, 4pm - 6pm
  • The Rose Villa Tavern, 6pm - 8pm (probably grab a bite to eat here if we haven’t already)
  • The Queen’s Arms, 8pm - 10pm
  • The Actress and Bishop, 10pm - whenever

December 17, 2019

One of my goals for next year is to write and publish more often (as it has been for the past few years and I’ve horrifically failed at). But, as everyone knows, before you can start writing you have to redesign your website.

This week I’ve booked out a chunk of time to redesign and rebuild my site from the ground up. The hope is that a fresh new site will provide the perfect platform to start writing and publishing again in the new year.

Here are a few of my thoughts as I start the project:

  • I’m sticking with WordPress and plan to fully embrace Gutenberg. I know there are lots of great platforms out there to choose from, but it makes sense to stick with what I know given that my business specialises in WordPress development.
  • I want the site to load as fast as possible. It will be minimalist in style and I’ll only include what is absolutely necessary.
  • I plan to use as little Javascript as possible and where I do, I’ll be using vanilla Javascript.
  • I’m going to stick with Sass. While I’ve enjoyed writing vanilla CSS again lately, there’s still a few things that I find useful: mixins, imports, etc.

The tools I’ll be using to build the website look something like this:

I’ll be “live designing” as I go, so the plan is to launch updates throughout the week. I’ll be sharing the process as I go.

Back to Top