You can subscribe to new posts via email or RSS.
- November 2018
- Record number of uploads of a Debian package in a day
- October 2018
- Salsa ribbons
- November 2017
- Faking cleaner URLs in the Debian BTS
- October 2017
- python-gfshare: Secret sharing in Python
- July 2017
- More Lintian hacking
- Installation birthday
- December 2016
- 10 years of Debian
- September 2016
- Diffoscope progress bar
- How to write your first Lintian check
- August 2016
- try.diffoscope.org CLI client
- April 2016
- Parsing Jenkins log output to determine job status
- September 2015
- Joining strings in POSIX shell
- January 2015
- Calculating the ETA to zero in shell
- Giant's Causeway puzzle
- Uploading a large number of files to Amazon S3
- December 2014
- Starting IPython automatically from zsh
- November 2014
- Validating Django model attribute assignment
- Generating gradiented fade images using ImageMagick
- August 2014
- Strava Enhancement Suite update
- July 2014
- start-stop-daemon: --exec vs --startas
- Disabling internet for specific processes with libfiu
- Strava Enhancement Suite
- March 2014
- Two aesthetically pleasing Python snippets
- February 2014
- Estimating Training Stress Score (TSS) for running on Strava
- Defaulting to comparing against yourself on Strava
- December 2013
- Quickly switching between imperial and metric units on Strava
- Developing responsive websites using the Awesome window manager
- October 2013
- Readers-writers lock in eventlet
- September 2013
- Using the Garmin 910XT on Linux
- August 2013
- Decrypting the Caesar cipher using shell
- August 2011
- Timezone bingo in debian/changelog files
- Careful what you wish for...
- Monitoring Redis? Check last_save_time
- July 2011
- Sysadmin-friendly deployment of Gunicorn in Debian
- Optimising directory navigation with multiple terminals
- Calculating requests per second with pv
- September 2010
- irccat plugin for supybot
- August 2010
- Debian Live Studio
- screen-message prompt for Awesome
- July 2010
- Four men in a mine
- June 2010
- Distributing locking with Python and Redis
- Appending the request URL to SQL statements in Django
- May 2010
- Rotating email into your inbox using imapfilter
- April 2010
- Locating source for any Python module
- December 2009
- Readline tab completion using Django models
- November 2009
- Transparent directory replacement with zsh
- August 2009
- No-one expects the string literal exception
- Ambigram animations using shell and Imagemagick
- May 2009
- Poor man's Google Checkout
- February 2009
- Scrap your boilerplate; POSIX shell edition
- Committing every time you save in Vim
- January 2009
- Matching IPs with regexes conCIDRd harmful
- December 2008
- Kicking the Vim cursor key habit
- July 2008
- BTS bot improvements
- June 2008
- Strange loops
- March 2008
- AptFs - FUSE filesystem for APT source repositories
- January 2008
- "Can you get cp to give a progress bar like wget?"
- Debian packages sorted by build-time and build-space
Free / open source software reports
Since 2015 I have written a detailed report every month outlining my activity in the free and open source software community. My latest report is for December 2019, but you can view the archive here: