All posts

This is a list of every post on, sorted by date. You can browse the list:

You can subscribe to my posts as an Atom feed.

Jump to: 2022 / 2021 / 2020 / 2019 / 2018 / 2017 / 2016 / 2015 / 2014 / 2013 / 2012


17 May Changing my carbon monoxide detectors
7 May Find the dominant colours in an image in your web browser
5 May Running a Rust binary in Glitch
25 Apr Illustrating the cipher wheels of a Lorenz machine
23 Apr Creating a “simple” three-up image layout in CSS
2 Apr Checking lots of URLs with curl
28 Feb Beware delays in SQS metric delivery
19 Feb A tale of two Twitter cards
15 Feb Closing lots of Safari tabs with JXA
12 Feb Why is Amazon Route 53 named that way?
14 Jan Creating animated GIFs from fruit and veg
7 Jan Creating coloured bookshelf graphics in Rust


31 Dec My favourite books from 2021
24 Dec Why is os.sep insufficient for path operations?
10 Dec The ever-improving error messages of Rust
1 Dec A tale of two path separators
30 Nov dominant_colours, a CLI tool for finding dominant colours in an image
19 Oct Programatically finding the original filename of a photo in the macOS Photos Library
16 Oct The Oboe of Optozorax, and Other Objects
14 Oct Prevent accidentally copying the prompt character in console code snippets
6 Oct READMEs for Open Science
4 Oct Beware of incomplete PDF redactions
1 Oct Red heart How do you work with non-engineers?
29 Sep SeptembRSE: Missing narratives in discussions around diversity and inclusion
28 Sep An editing toolbar for
25 Sep Red heart Getting a monthly cloud costs report in Slack
22 Sep Operations on strings don’t always commute
21 Sep Hiding favicons in Safari 15 (kinda)
14 Sep When is my EventBridge cron expression going to run next?
6 Sep Picking perfect planks with Python
28 Aug How to ignore lots of folders in Spotlight
25 Aug Markdown’s gentle encouragement towards accessible images
22 Aug Finding misconfigured or dangling CloudWatch Alarms
9 Jul A few useful GitHub searches
5 Jul Red heart Listing deleted secrets in AWS Secrets Manager with boto3 and the AWS CLI
4 Jul A wise choice of test strings
8 Jun Amazon is discontinuing S3 BitTorrent
3 Jun Visualising how often I write in my journal
30 Apr Downloading objects from/uploading files to S3 with progress bars in Python
29 Apr Drawing coloured squares/text in my terminal with Python
27 Apr Building Wellcome Collection’s new unified catalogue search
18 Apr Using AppleScript to detect if a Safari window uses Private Browsing
5 Apr Finding the app/process that’s using Secure Input
12 Mar Red heart Drawing inner/outer strokes in SVG (clips and masks)
7 Mar Creating pairs of interlocking rainbow hearts 🌈
2 Mar An AppleScript to toggle Voice Control
15 Feb Wellcome’s approach to digital verification
15 Feb Screaming in the Cloud: Using the Cloud to Preserve the Future
31 Jan Red heart How KempisBot works
1 Jan What year it it? (A tale of ISO week dates)


1 Dec Creating short-lived, temporary roles for experimenting with AWS IAM policy documents
24 Nov “Non-technical users”
18 Nov A script to copy images from Docker Hub to Amazon ECR
16 Nov How I read non-fiction books
15 Nov Maths is about facing ambiguity, not avoiding it
6 Nov Remembering if a <details> element was opened
1 Nov A Python function to ignore a path with .git/info/exclude
30 Oct TIL: Using git check-ignore to debug your .gitignore
17 Oct How do I use my iPhone cameras?
12 Oct The importance of good error messages
12 Oct A new README for docstore, my tool for organising scanned paperwork
9 Oct Replicating Wellcome Collection’s digital archive to Azure Blob Storage
26 Sep Using qlmanage to create thumbnails on macOS
8 Sep Two Python functions for getting CloudTrail events
20 Aug S3 prefixes are not directories
18 Aug S3 keys are not file paths
6 Aug Using fuzzy string matching to find duplicate tags
26 Jul Getting a Markdown link to a window in Safari
22 Jul Why do programming languages have a main() function?
20 Jul Running concurrent Try functions in Scala
13 Jul What does \d match in a regex?
12 Jul How to do parallel downloads with youtube-dl
6 Jul Changing the accent colour of ICNS icons
24 Jun Using AppleScript to open a URL in Private Browsing in Safari
21 Jun Fat shaming in The Good Place
20 Jun Red heart Large things living in cold places
15 Jun Always read your contracts
15 Jun Archive monocultures considered harmful
6 Jun Finding the months between two dates in Python
27 May Getting every item from a DynamoDB table with Python
24 May Showing human-friendly dates in JavaScript
17 May The Sachsenhausen concentration camp
16 May Moving messages between SQS queues
15 May Downloading the AO3 fics that I’ve saved in Pinboard
14 May Letter to my MP about Liz Truss and medical treatment for trans youth
13 May Social media as a growth culture for opinions
12 May Taking tuple unpacking to terrible places
11 May Red heart The friends I lost along the way
10 May Make it safe to admit mistakes
2 May How long is my data? 💾
2 May Give your audience time to react
1 May Illustrating lifecycle transitions in Amazon S3
27 Apr Using DynamoDB as a calculator
26 Apr Exploring an unknown SQL server
22 Apr Thinking about your gender
19 Apr Complex systems have complex failures
19 Apr Comparing JSON strings when testing in Scala
18 Apr Look out for survivor’s guilt
17 Apr Getting word count stats for my blog
16 Apr Red heart Adventures in euphoria and embodiment
15 Apr Red heart Access to information is a privilege
12 Apr A snippet for downloading files with Python
5 Apr Red heart Storing language vocabulary as a graph
25 Mar Inclusion can’t be an afterthought
15 Mar Rich enough to make bad choices
14 Mar Sick leave while working from home
8 Mar Creating striped flag wallpapers with Pillow
4 Mar A Jekyll filter for adding non-breaking spaces
2 Mar Finding the size and cost of each of your S3 buckets
25 Feb Red heart A remote-controlled oven is a safety nightmare
23 Feb Adjusting the dominant colour of an image
18 Feb Storing multiple, human-readable versions of BagIt bags
6 Feb Red heart Building Wellcome Collection’s new archival storage service
29 Jan Excluding lots of folders in Backblaze
22 Jan A deletion canary: testing your S3 bucket permissions
22 Jan An interactive map of British railway stations 🚂
19 Jan A Docker image to run LaTeX
16 Jan Generating pride-themed Norse valknuts with Python 🌈
4 Jan Finding the CPU and memory bottlenecks in an ECS cluster


11 Dec This YAML file will self-destruct in five seconds!
6 Dec Some useful spreadsheet functions: FORMULATEXT, MATCH, CONCATENATE and INDIRECT
2 Dec November 2019 scripts: downloading podcasts, retrying flaky errors, Azure and AWS
27 Nov Red heart How I scan and organise my paperwork
17 Nov Saving a copy of a tweet by typing ;twurl
8 Nov Preparing for Terraform 0.12: fixing module sources
6 Nov An AWS costs graph that works for me
22 Oct Digital preservation at Wellcome Collection
16 Oct Red heart Adventures in Python with concurrent.futures
14 Oct Red heart Sans I/O programming: what, why and how (PyCon UK talk)
11 Oct Adding religious holidays to my calendar
6 Oct The rough edges of filecmp
28 Sep Experiment: GitHub code search with de-duplication
23 Sep Red heart Drawing with triangular coordinates in SVG
13 Sep Slides for PyCon UK 2019 “Sans I/O programming”
12 Sep Streaming large objects from S3 with ranged GET requests
5 Sep Iterating over the entries of a compressed archive (tar.gz) in Scala
19 Aug Red heart Getting a tint colour from an image with Python and k‑means
12 Aug Removing the DRM from my Kindle books
29 Jul Finding divisors of a number with Python
18 Jul Section 28, and LGBTQ+ people in UK schools
8 Jul Creating preview thumbnails of PDF documents
3 Jul Listing even more keys in an S3 bucket with Python
1 Jul Ten braille facts / ⠼⠁⠚⠀⠃⠗⠁⠊⠇⠇⠑⠀⠋⠁⠉⠞⠎
18 Jun Red heart An inescapable conclusion
15 Jun A Jekyll filter for obfuscating email addresses
12 Jun Red heart Reading a Chinese dictionary / 读一本中文字典
9 Jun Converting Acorn images on the command-line
4 Jun Hey Apple, cycle tracking isn’t just for women
4 Jun A script for getting cover images from mobi ebooks
24 May Red heart Questions to ask when writing a trans inclusion policy
15 May Falsehoods programmers believe about Unix time
13 May Red heart Creating a locking service in a Scala type class
1 May Finding unused variables in a Terraform module
28 Apr Reversing a URL to the original tweet
23 Apr Some tips for conferences
11 Apr Getting a transcript of a talk from YouTube
3 Apr How I back up my computing devices, 2019 edition
25 Mar Red heart Creating a GitHub Action to auto-merge pull requests
15 Mar Red heart A day out to the Forth Bridge
11 Mar Finding the latest screenshot in macOS Mojave
3 Mar Atomic, cross-filesystem moves in Python
26 Feb Checking Jekyll sites with HTMLProofer
9 Feb Red heart Working with really large objects in S3
5 Feb Red heart More advice on running inclusive and welcoming events
31 Jan Red heart Monki Gras 2019: The Curb Cut Effect
29 Jan Debugging a stuck Terraform plan
28 Jan Notes from You Got This 2019
22 Jan How much sunlight affects my mood levels
21 Jan Thoughts on privacy and Oyster cards
16 Jan A delightful store for speciality spreads: Paul Rothe & Sons


27 Dec Notes on reading a UTF-8 encoded CSV in Python
23 Dec Iterating in fixed-size chunks in Python
13 Dec Getting credentials for an assumed IAM Role
5 Dec A script for backing up Tumblr posts and likes
13 Nov Keeping track of my book recommendations
8 Nov Red heart My visit to the Aberdulais Falls
2 Nov Finding SNS topics without any subscriptions
29 Oct How do you hide a coin for 400 years?
28 Oct How to set the clock on a Horstmann Electronic 7 water heater
22 Oct Custom 404 responses in Finatra
11 Oct Open consultation on the Gender Recognition Act
30 Sep Content warnings
24 Sep Red heart Assume worst intent (designing against the abusive ex)
22 Sep Building trust in an age of suspicious minds
17 Sep Signs of the time
13 Sep PyCon UK 2018
5 Sep A basic error logger for Python Lambdas
26 Aug Making the venue maps for PyCon UK
25 Aug Red heart Implementing parallel scan in DynamoDB with Scanamo
20 Aug Avoiding the automatic redirect on Tumblr posts
13 Aug Red heart Ideas for inclusive conferences and events
7 Aug Finding slow builds in Travis
5 Aug Do Not Distract while driving
2 Aug Selective sudo on Travis
28 Jul Moving my calendars from iCloud to FastMail
19 Jul Red heart A robot leaked my SSH keys
15 Jul A tip for travel instructions
1 Jul My favourite iMac accessory
26 May Red heart Drawing ASCII bar charts
14 May A brief thought on Google Duplex
4 May Red heart Beware of logged errors from subprocess
27 Apr Two shortcuts for using S3 in the shell
18 Apr (Anti) Social Media
17 Apr 24 hours or bust
13 Mar Notes on A Plumber’s Guide to Git
2 Mar The Hypothesis continuous release process
1 Mar Keep an overnight bag in the office
24 Feb A working from home experiment
25 Jan Red heart Getting every message in an SQS queue
20 Jan Listing keys in an S3 bucket with Python, redux
18 Jan IP and DNS addresses for documentation


18 Dec Your repo should be easy to build, and how
11 Dec Armed police officers don’t make me feel safer
27 Nov Pruning old Git branches
22 Nov Red heart Downloading logs from Amazon CloudWatch
20 Nov My favourite WITCH story
20 Nov Don’t tap the mic, and other tips for speakers
9 Nov Red heart A plumber’s guide to Git
8 Nov How I ask about gender
3 Nov Using privilege to improve inclusion
28 Oct Lightning talks
27 Oct PyCon UK 2017 resources
25 Oct Displaying tweets in Keynote
20 Oct Using hooks for custom behaviour in requests
17 Oct Control Centre: one step forward, two steps back
11 Oct Red heart Four ways to underline text in LaTeX
9 Oct Using pip-tools to manage my Python dependencies
8 Oct NPR: Graduation Readers At MIT Go The Extra Mile To Pronounce Names Correctly
3 Oct What happens when you overengineer a static site?
18 Sep Some useful Git commands for CI
11 Sep Ode to docopt
2 Sep A Python module for lazy reading of file objects
31 Jul Backing up full-page archives from Pinboard
18 Jul Backing up content from SoundCloud
18 Jul Listing keys in an S3 bucket with Python
7 Jun Red heart A visit to the Crossness pumping station
4 Apr Accessibility at AlterConf
25 Mar A few examples of extensions in Python-Markdown
11 Feb A script for backing up your Instapaper bookmarks
8 Feb A script for backing up your Goodreads reviews
14 Jan A Python interface to AO3
7 Jan Experiments with AO3 and Python


28 Dec A tool for backing up your message history from Slack
1 Dec Another example of why strings are terrible
30 Nov Some low-tech ways to get more ideas
16 Nov Use keyring to store your credentials
30 Oct Red heart The A stands for Asexual
22 Oct Red heart Creating low contrast wallpapers with Pillow
21 Oct Red heart Tiling the plane with Pillow
8 Oct Why I use py.test
1 Oct A shell alias for tallying data
30 Sep My travelling tech bag
23 Sep aspell, a command-line spell checker
19 Sep Silence is golden
17 Sep Live captioning at conferences
31 Aug Python snippet: dealing with query strings in URLs
19 Aug Python snippets: Is a URL from a Tumblr post?
7 Aug Python snippets: Cleaning up empty/nearly empty directories
28 Jul Python snippets: Chasing redirects and URL shorteners
4 Jul Clearing disk space on OS X
23 Jun A subscription for my toothbrush
16 Jun Reading web pages on my Kindle
9 Jun Introduction to property-based testing
7 Jun Red heart Introduction to property-based testing
16 May Finding 404s and broken pages in my Apache logs
10 May A Python smtplib wrapper for FastMail
5 May Safely deleting a file called ‘-rf *’
1 May “The document could not be saved”
16 Apr Hiding the YouTube search bar
8 Apr Red heart Treat regular expressions as code, not magic
29 Mar Get images from the iTunes/App/Mac App Stores with Alfred
27 Mar Exclusively create a file in Python 3
8 Mar Backup paranoia
24 Feb How I use TextExpander to curb my language
9 Feb Saved by the Prompt
25 Jan The Harry Potter Collector’s iPod
20 Jan The Skeletor clip loop, 2015 edition
17 Jan A cautionary tale about Fusion Drive repairs


13 Dec Pretty printing JSON and XML in the shell
10 Dec Simpler syndication, by Dr. Drang
30 Nov Backups and Docker
15 Nov Export a list of URLs from Safari Reading List
14 Nov Email with a purpose
13 Nov Beyond PEP 8: Best practices for beautiful intelligible code
3 Nov Python and the BBC micro:bit
2 Nov Quick shell access for Docker containers
12 Oct Getting Started Testing, by Ned Batchelder
20 Sep What does “Spotlight Suggestions” turn off?
16 Sep Apple quietly adopts HTTP/2
6 Sep Review: Effective Python
19 Aug Finding even more untagged posts on Tumblr
27 Jul Useful Bash features: exit traps
29 Jun Persistent IPython notebooks in Windows
22 Jun Safer file copying in Python
2 Jun Useful Git features: a per-clone exclude file (.git/info/exclude)
26 May Cloning GitHub’s Contributions chart
22 May The Secret Lives of Data, a visualisation of the Raft algorithm
17 May Previewing notes from nvALT in Marked
16 May One-step paste in the iOS Simulator
29 Mar Some exam advice
7 Mar Pygmentizr
5 Mar Adding Python to the OS X firewall
22 Feb Tidying up my 1Password
22 Feb A Flask app for taking notes
12 Feb Adding checkboxes to lists
9 Feb Swift 1.2 improves the “let” keyword, and other improvements
25 Jan What went wrong at King’s Cross over Christmas?
16 Jan Register to vote – GOV.UK
6 Jan Empire’s BBFC Ratings Podcast Special


29 Dec RSS linkposts in Pelican
28 Dec A script for exporting from iMessage
28 Dec What would happen if we really went to war against Christmas?
19 Dec How could Golems best be used to defend a modern day city of Prague?
13 Dec Kitchen sink security
10 Dec Acronyms
6 Dec Skeletors All the Way Down
6 Dec Lukas Mathis on iOS CarPlay and Android Auto
10 Nov Custom CSS in ResophNotes
2 Nov Unpacking sets and ranges from a single string
28 Oct “Missing argument at index 2” in fish
1 Oct Notes on Tumblr
14 Sep Playing with 404 pages
5 Sep My new standing desk
31 Aug Updates to my site for finding untagged Tumblr posts
29 Aug A TextExpander snippet for Amazon affiliate links
28 Aug A quick Alfred workflow for opening recent screenshots
18 Jul Thoughts on Overcast
11 Jul Getting plaintext LaTeX from Wolfram Alpha
29 Jun Skeletor!
23 Jun Catching instapaper:// URLs from ReadKit
13 Jun Finding untagged posts on Tumblr, redux
13 Jun Some site updates
14 May Some Part IA exam advice
12 May Brief advice for Part II
20 Apr Pulling back the veil


13 Nov TextMate 2 and Quick Look
20 Aug Cleaning up Google Maps
6 Aug Finding untagged posts on Tumblr
11 May Podcast feeds on Tumblr
31 Mar Automatic Pinboard backups
30 Mar Strange clock bug in OS X
6 Mar Candybar and icon recommendations
13 Feb Darwin, pancakes and birthdays
10 Jan Zero


30 Dec Hypercritical