Posts

Separating Kubernetes Kubeconfigs per Environment

2025-12-13

The idea of having a singular Kubernetes config, authenticated to all your production, staging and dev environments alike, should fill you with trepidation. An accidental mis-selection from your shell history of a potentially destructive command could end up being enacted against the wrong cluster. In any case, a stark visual…

Read more: Separating Kubernetes Kubeconfigs per Environment

Narrowing Docker IP Ranges for Local Development with Docker Compose

2025-08-19

The problem / background You have a limited IP address space to use for Docker. Docker’s default pool is a /12. For Compose it allocates /16s from it by default. This gives each Compose project 65,536 IPs. That’s likely overkill for most folks’ needs. It also effectively limits you to…

Read more: Narrowing Docker IP Ranges for Local Development with Docker Compose

Authenticating with fingerprint on Arch / EndeavourOS for Bitwarden and 1Password

2025-08-14

Assumptions: You have fprintd installed already, following the Arch wiki. You have enrolled your fingerprints. Install polkit: sudo pacman -S polkitCreate a polkit-1 file in pam.d: sudo nano /etc/pam.d/polkit-1#%PAM-1.0 auth sufficient pam_fprintd.so auth include system-auth account include system-auth password include system-auth session include system-authTesting: pkexec whoamiYou should see the system…

Read more: Authenticating with fingerprint on Arch / EndeavourOS for Bitwarden and 1Password

Communication

2025-04-15

As developers the one thing that’s central to everything is communication. We’re responsible for communicating our ideas and intentions to others and to our future selves. Whether it’s through the code itself, its token names and comments, or through its accompanying documentation. Whether it’s through the commit messages: title and…

Read more: Communication

NixOS

2025-03-06

The following are my random thoughts during setting up NixOS. I already have Manjaro installations boiled down into a set of shell scripts that let me reinstall and configure the OS fairly quickly and repeatably. NixOS solves this in a much nicer way, so that appealed. The ability to rollback…

Read more: NixOS

Signposting

2024-12-22

TL;DR Be a good custodian and make sure people can find stuff. Don’t “But the plans were on display…” “On display? I eventually had to go down to the cellar to find them.” “That’s the display department.” “With a flashlight.” “Ah, well, the lights had probably gone.” “So had the…

Read more: Signposting

Migrating From Ghost to Hugo

2024-12-22

I’ve migrated this blog from Ghost to Hugo. Primarily because it’s updated so infrequently that every time I even thought about maybe writing something (yes, very committal) Ghost would need an update. Most recently, and the final straw, was it got stuck in a dependency loop of needing a Node…

Read more: Migrating From Ghost to Hugo

Git history is Tralfamadorian

2024-12-21

Or, why I dislike squash merges. Tralfamadorians have the ability to experience reality in four dimensions; meaning, roughly, that they have total access to past, present, and future; they are able to perceive any point in time at will. Kurt Vonnegut The code usually tells you the what and sometimes…

Read more: Git history is Tralfamadorian

Migrating unknown unmanaged infrastructure into a managed Ansible-based IaC

2023-02-12

I had a VPS on a popular developer-centric cloud platform. It started out life as Ubuntu 14, several years ago, and predates my learning about IaC, Terraform and Ansible. After starting work at a hosting company, I thought I may as well migrate my stuff over. And so, the headache…

Read more: Migrating unknown unmanaged infrastructure into a managed Ansible-based IaC

Water-Scrum-Fail

2022-02-01

It wasn’t waterfall. It wasn’t scrum. It was both and it was neither and it was doomed to fail from the get-go. Once you’ve been doing this for a while, you’ll understand that pretty much every aspect of the discipline, at least in a professional setting, has a trade-off. To…

Read more: Water-Scrum-Fail

Cloudflare's "Always Use HTTPS" prevents LetsEncrypt renewals from working

2021-03-16

I was getting errors from Certbot invalid response from .well-known/acme-challenge It took a lot of messing around but the problem lay with a Cloudflare setting. SSL/TLS -> Edge Certificates -> Always Use HTTPS Redirect all requests with scheme “http” to “https”. This applies to all http requests to the zone.…

Read more: Cloudflare's "Always Use HTTPS" prevents LetsEncrypt renewals from working

Custodian Mindset

2018-10-03

Businesses are usually around for longer than individual employees’ tenures. At some point, someone else has to take over your workload. If you have an owner mindset rather than a custodian mindset this is difficult. Handovers are not easy. Trying to cover all bases and think of everything you might…

Read more: Custodian Mindset

Framework choices

2017-10-22

Framework choices can be critical. The wrong choice is going to cause a big increase in the amount of technical debt a project has and can harm the onboarding process for new employees, which already carries a high opportunity cost. Problematic choices: Flavour of the month Too dated Custom All…

Read more: Framework choices

Opportunity costs

2017-10-22

Opportunity costs are so often missed in a myriad of different areas. For software engineering we of course have them too. If you’ve not read The Mythical Man Month, you may have at least heard its central premise: Adding resources to a late software project makes it later Or perhaps…

Read more: Opportunity costs

Git is not that hard (really)

2017-10-22

I’ve seen some criticism of Git recently, on Twitter, with a ton of likes, suggesting a large amount of people have a difficult time using Git. Git is not that hard. It really isn’t. I think the problem stems from two main approaches. Problem the first: Shying away from the…

Read more: Git is not that hard (really)

Ensuring better git commit messages with a global template

2017-03-30

I read the advice here some time ago, and I’ve been following it by and large. However, only recently I discovered how to enforce a line limit when git-commit starts up nano: ~/.gitconifg: [core] editor = nano -r 72The problem is that doesn’t help limit the summary to 50 characters,…

Read more: Ensuring better git commit messages with a global template

Logging

2016-11-14

Logging is an important thing to get right. It is a window into what’s happening in your application, right now and [x] days ago. Keeping a close eye on the error logs allows you to find bugs that users haven’t reported, or haven’t noticed. Doing logging right involves a few…

Read more: Logging

Laravel Facades pollute the mindset of junior developers

2016-10-06

Laravel Facades came in for some criticism a couple of years ago. https://www.reddit.com/r/PHP/comments/1zpm0y/laravel_lets_talk_about_facades/ http://paul-m-jones.com/archives/5952 https://www.brandonsavage.net/lets-talk-about-facades/ I’ve got a greenfield project at work using Lumen (Laravel Lite), which is what’s brought it back to my attention. Lumen, by default, switches off the Facades feature. However, a bunch of the documentation asks…

Read more: Laravel Facades pollute the mindset of junior developers

UX and security, so often traded off against each other. Can't we have both?

2016-07-01

In this day and age of frequent large scale data breaches and compromising of passwords, security is rightly being talked about more. Unfortunately, this is often at the expense of user experience. Can’t we have both? The simple answer is no, but the longer answer is a more complicated yes…

Read more: UX and security, so often traded off against each other. Can't we have both?

Password managers and data breaches

2016-05-26

If the LinkedIn hack has told us anything, it’s some stuff that we already knew. You can’t really on even massive, well known sites to store passwords correctly, or to have been doing so since they started out. Get your family and friends setup We as techies have a responsibility…

Read more: Password managers and data breaches

What everyone should know about credit files

2016-04-22

There’s a lot of stuff I think everyone should know about how credit files work but not enough people do know. N.B. I’m from the UK, I only know about the UK. This post deals only with how it works in the UK. Credit Scores Your credit score is meaningless…

Read more: What everyone should know about credit files

Custom HTTP routes in Zend Framework 1 MVC

2015-11-18

Scenario: you’re stuck with Zend 1 (which will support PHP7 - great news for those of us with legacy apps!) and you’re building an API. You’ve got routes like /api/categories, and /api/products but you want to provide some nice, nested resource routes, such as /api/categories/42/products to get all products in…

Read more: Custom HTTP routes in Zend Framework 1 MVC

Saving time and effort with an SSH config file

2015-01-19

I can’t believe I’ve only recently discovered the benefits of having a config file sitting in ~/.ssh A couple of my Digital Ocean boxes have non-standard SSH ports and it’s a bit of an arse to type it out every time. Example ~/.ssh/config: Host projects HostName bencromwell.co.uk Port 424242 User…

Read more: Saving time and effort with an SSH config file

How to upgrade your Grunt-supported Ember app to 1.9

2014-12-13

Ember 1.9 came out a few days ago, continuing along the path towards HTMLBars. It took me longer than the expected 5 minutes to upgrade HungryBun due to a couple of small issues regarding support for Handlebars 2 in the build tools. I had some problems with npm when trying…

Read more: How to upgrade your Grunt-supported Ember app to 1.9

Ello: the social network with investors and no revenue model

2014-10-25

You may have heard of Ello. It’s a new social network with no users and no revenue model. OK, so it does have a fair amount of users and it continues to grow rapidly by invite. The curious thing about it, though, is their claims that: they’ll never have adverts…

Read more: Ello: the social network with investors and no revenue model

REST URL schemes in Ember

2014-04-12

In Ember, the default is for the name of your model corresponds to a REST route of the same name. So what happens when you’re using hyphens in the URL? You can’t name your model to match, but the solution is quite simple, although it did take me a lot…

Read more: REST URL schemes in Ember

CVs

2013-03-28

Style over substance may be a common phrase but frequently CVs possess neither. Layout Inconsistencies make CVs difficult to scan read. Sure, it’s not going to be a work of art (unless you’re a designer of some sort, in which case it should be: show off your talents) but it…

Read more: CVs

Qualitative vs quantitative experience

2013-03-02

Frequently, companies will specify in job adverts that a potential candidate must have an arbitrary number of years’ experience. Such requirements amuse me, as the experience metric is flawed. For me, it shows a lack of understanding and a lack of thought. For the purposes of analogy, take football as…

Read more: Qualitative vs quantitative experience

Tweaking Twitter with Firefox

2010-09-23

A lesser known feature of Firefox, is its facility to allow the user to write custom CSS and have it apply to particular websites. userContent.css resides in your Firefox profile, under the chrome directory. Open it with a text editor and you can play around. Here’s a few very basic…

Read more: Tweaking Twitter with Firefox

Quick and easy translations with Firefox & Google

2010-06-27

Google Translate has the following URL format: <http://translate.google.com/#de|en|%s>Where “de” is the language you’re translating from, “en” is the language you’re translating to, and “%s” represents the string to translate. This makes it very easy to create Firefox Quicksearches for various translations. You can find the short code for the language…

Read more: Quick and easy translations with Firefox & Google