Kevin Boone's website
Some thoughts on Pimoroni's "Pico GFX Pack" LCD module
Fun with capital letters
Social media: it's not me, it's you
No good deed goes unpunished: can we now be sued over software we give away?
ARM assembly-language programming for the Raspberry Pi
Watch out: the Chinese domain registration scam is getting slicker
Technical writing: what do we lose, when we write more readably?
A USB power supply with a real on-off switch
How to write a technical or scientific report
They don't make them like that any more: Sony PRS-500 e-reader
They don't make 'em like that any more: things you can switch off
They don't make them like that any more: the Yamaha DX7 keyboard
They don't make them like that any more: Epson MX-80 dot matrix printer
Using Windows is like smoking (?)
Ten steps to becoming a Linux snob
Wayland from the ground up
Why systemd is a problem for embedded Linux
Using Apache Camel to implement an IRC bot
Adventures with Artix
C development for Linux without a standard library
The nuts and bolts of anonymous inner classes in Java
Command-line hacking: countdown timer
How Linux home directory encryption works
Rudiments of Java concurrency control, part 1
They don't make 'em like that any more: Borland Turbo Pascal 7
Some thoughts on using a small cellphone as a media player
Yet another desktop Raspberry Pi media player
Making tab-and-slot boxes for electronic prototypes. Or: how I stopped worrying and learned to love the laser
Getting started with Kafka Streams, part 2
Getting started with Kafka Streams
They don't make them like that any more: Garmin Nuvi 300
Predicting eclipses with clockwork
RSS feed
Command-line hacking: calculating the phase of the Moon
They don't make 'em like that any more: Blackberry Bold 9700
Kafka Connect from the ground up, part II
Kafka Connect from the ground up
Powering a Raspberry Pi from an attached Waveshare USB HAT
Converting push-button events to keyboard events in the Raspberry Pi
Rolling your own minimal embedded Linux for the Raspberry Pi -- part one: booting to a root shell
Why the grammer snobs have it all wrong about the apostrophe
They don't make 'em like that any more: Archos 605 media player/recorder
What exactly is 'saturation'?
Yet another Darktable/Lightroom comparison
Using media keys in a Linux console application
Using the Linux framebuffer in C/C++ -- just the essentials (part 2)
Using the Linux framebuffer in C/C++ -- just the essentials
pico-photo-clock: an easy-to-construct Pi Pico desktop photo clock
Using the Maxim DS3231 I2C real-time clock in C on the Raspberry Pi Pico
Using ImageMagick to generate anti-aliased bitmap fonts for a microcontroller's LCD display
The Pi Pico, two years on
Some thoughts on the Waveshare 3.5-inch LCD/SD module for the Raspberry Pi Pico
Why 'int x = 0' is uninitialized data to the GNU C compiler
Raspberry Pi Pico: loading code into RAM and running it -- part 2
Some thoughts on using a USB keyboard with the Raspberry Pi Pico
Using the rdkafka library to integrate a C program with Kafka messaging
Why synchronous write speed is likely to be the limiting factor in message broker throughput
Why I won't be dumping DuckDuckGo over Ukraine
cwordle -- A Wordle-like word-guessing game for CP/M
The peculiar Benford distribution
UTF-8 and the problem of over-long characters
Juice-jacking -- it's a problem, but not because it's a problem
How Unicode reading direction characters defeat source code inspection, and what it means for the open-source movement
Multi-source Z80 assembly programming for CP/M
Writing new interactive fiction games for CP/M using PunyInform and Linux
Converting a floating-point number to a fraction (approximately) using continued fraction expansion
Raspberry Pi as a networked storage (NAS) device
Making a Raspberry Pi bootable SD card from a root filesystem
Does it matter if amateur radio dies out?
Why the Linux console is so awesome
Making an 8x32 LED auxiliary display with a USB interface, from an LED matrix and a Raspberry Pi pico
A very brief overview of Kotlin for Java developers
An overview of finite fields
Homeopathy: flushing science down the lavatory
Samsung DeX -- the good, the bad, and the ugly
On master/slave
Can Project Gemini rewind the Web thirty years?
More like Windows every day
The planet Vulcan: a cautionary tale that deserves to be better known
Building a custom mechanical keyboard from scratch
Reviving old keyboards for Arduino
Why the fascination with retrocomputing?
Peli "Protector" case as a rugged enclosure for a Raspberry Pi-based field terminal
Building and programming a USB keypad from the ground up
Using Linux command-line tools for programming the SparkFun Pro Micro microcontroller (and similar)
A Raspberry Pi and touchscreen case that anybody can make
Rolling your own minimal embedded Linux for the Raspberry Pi -- part four: audio
Rolling your own minimal embedded Linux for the Raspberry Pi -- part three: services and remote access
Rolling your own minimal embedded Linux for the Raspberry Pi -- part two: early initialization
Rolling your own minimal embedded Linux for the Raspberry Pi -- part five: X
Switching a couple of amps with a Raspberry Pi and a relay
Using an I2C analog-to-digital converter chip with the Raspberry Pi, from the ground up
Using the FreeType library to render text nicely onto a Linux framebuffer
Examining simple build and deployment operations on OpenShift 3/4
Why pitch is not the same as frequency
A failed experiment in laptop cooling
Using thinkfan for fan control on Lenovo (Linux) laptops
Using the Pi Pico with an L298N module to control a 12V motor
FastMail -- still good value in 2025?
No, eBay: it isn't "free to sell"
antiX vs. MX Linux on old-ish laptops
Why using crude PWM for sampled audio output on the Raspberry Pi Pico doesn't sound that great
Law and small woodlands
They don't make 'em like that any more: Sony DTC-700 audio DAT player/recorder
Some thoughts on LoRa-based mesh radio technologies
Raspberry Pi Pico: loading code into RAM and running it -- part 1
AppImage from scratch
They don't make them like that any more: the BMW C1
Why do we use 'complex impedance' in electrical engineering?
They don't make 'em like that any more: 3D movies
They don't make them like that any more: the Raleigh Chopper
Why are the variable names all wrong in my decompiled Java class?
Log4J -- ask yourself: do I really need that library?
Gentoo vs. MX Linux on old-ish laptops
How de-Googled is Lineage OS?
Fitting an NVMe disk in a computer with no NVMe support
Getting back into C programming for CP/M
Comparing Dropbox, pCloud, and rsync.net for off-site storage for Linux users
They don't make 'em like that any more: the 3.5mm headphone jack socket
Some notes on installing Lineage OS on modern-ish Samsung Android devices
A few interesting features of Vim, part 1
They don't make them like that any more: the Quad 306 amplifier
They don't make them like that any more: the Xircom REX 6000 PDA
One month with Gentoo
Going back to ALSA in 2024
Can you use ALSA to get 'bit-perfect' audio playback on Linux?
Using Private Internet Access VPN with Gentoo Linux
Gentoo Linux -- is this the solution to the Winux problem?
Differential equations: how does separation of variables really work?
Do you need to wipe that hard drive? And can you?
Exploring Java 17's container-awareness features
Using Keycloak for authentication with Apache Artemis: part 1
When science and engineering are in conflict: the weird Whipple truss bridge
They don't make 'em like that any more: how the Vectrex almost revolutionized video gaming
ActiveMQ/Artemis or Kafka for Java messaging?
They don't make them like that any more: the slide rule
Is your fitness watch lying to you?
Some thoughts on always-on OLED displays on smart watches
Command-line hacking: displaying system temperature
Does the use of custom Android ROMs improve or worsen security?
They don't make 'em like that any more: NVIDIA Shield K1 tablet
Snake oil: 4K displays on smartphones
What you give up, when you opt out of the surveillance economy
Adventures with RC2014, Z80, and CP/M
Designing a dual 5V-to-RS232 serial level converter for the RC2014
They don't make 'em like that any more: The Philips Pronto remote control
They don't make 'em like that any more: a paean to the Cowon D2 DAB
CP/M resources
Getting to grips with JMS shared subscriptions
Adding a floppy disk controller to my RC2014 Z80 system
Using flash memory as non-volatile storage on the Pi Pico microcontroller
Constructing and programming a YM2149 sound board my RC2014 Z80 system
Updating, building, and flashing RomWBW on an SC130 CP/M system
Exchanging files between an SC130 CP/M board and a Linux system
Some thoughts on a DS1302 real-time clock board for RC2014/Z80 and CP/M
Using a CP/M machine to log into a Linux server using an RS232 connection
Serial device mapping in CP/M
The vexed problem of generating delays in a CP/M program
Is Collapse OS really a practical proposition?
Getting back into C programming for CP/M -- part 2
Using Keycloak for authentication with Apache Artemis: part 2
A self-contained CP/M computer based on the Z80 Playground
Why does my Raspberry Pi project keep displaying the 'lightning bolt' undervoltage indicator?
Using an Oracle database as storage for the Apache Artemis message broker -- part 2
Using an Oracle database as storage for the Apache Artemis message broker -- part 1
Using the Qpid Proton C++ library to understand AMQP
Why your cheap mains inverter could kill you
Using Quarkus to provide a REST interface to a message broker
Comparing a natively-compiled Java webservice with C
Is dithering necessary when reducing the number of bits per sample in an audio waveform?
The costs and benefits of software pulse-width modulation on the Raspberry Pi
Using an HD44780 LCD display module with the Raspberry Pi, from the ground up
Monitoring an INA219 chip in a Raspberry Pi battery-backed power supply
Getting reasonably robust proximity measurements from an ultrasonic sensor on the Raspberry Pi
Using a shift register to control eight digital outputs with three GPIO lines on the Raspberry Pi
How flat-earthers use misrepresentations of scale to promote their ideas
Why "RMS watts" is a useless measure of power
Calculus of variations: a lunchbreak guide
Sorting files and directories on a FAT-formatted USB memory stick
A review of the Leak Stereo 130 and CDT
Why is there a vinyl revival?
Does it matter how we rip audio CDs?
Is "high resolution" audio really worth the effort?
Why you can't improve your hi-fi system by upgrading the mains cable
Do different CD transports sound different?
Snake oil: balanced headphones
Why your vintage turntable could kill you
A skeptic's guide to headphones
Are Flatpak, et al., saving or drowning the Linux desktop?
Command-line hacking: timezone conversions
Command-line hacking: displaying a weather summary
Command-line hacking: creating a tide table
Command-line hacking: extracting audio metadata (tags)
Command-line hacking: querying an Internet radio database
Command-line hacking: paced breathing
Command-line hacking: displaying news headlines in the manual viewer
Command-line hacking: Assigning folder icons to directories
How Microsoft Windows killed the palmtop computer
Using Podman to deploy an image directly to OpenShift 4
Understanding Java's functional interfaces
Using the new pluggable active/passive management framework in Apache Artemis
Embedding resources into executables built using GCC
You be the linker -- building "Hello, world" from scratch, in hexadecimal
Did aliens really talk to us in "binary code" at Rendelsham Forest?
They don't make 'em like that any more: the Lenovo W520
How problematic is resampling audio from 44.1 to 48 kHz?
Using the Qpid Proton C++ library to create a server for monitoring or telemetry data
Why we only see one side of the moon -- the odd phenomenon of tidal locking
Why the energy cost or benefit of switching to DAB digital radio is hard to assess
Creating an "animated score" for demonstrating musical compositions on YouTube, etc
Implementing a web-based music player for Android
Conway's Game of Life in 3D perspective
Using Apache Avro for passing Java objects through a message broker
How does Camel-K actually work?
Rolling your own minimal embedded Linux for the Raspberry Pi
Audible's returns policy -- who wins, who loses?
"Spy pixels" -- how worried should we be?
Implementing Apache ActiveMQ-style broker meshes with Apache Artemis
Deploying the Mosquitto MQTT message broker on OpenShift (part 1)
Back to BASICs with a Pro Micro microcontroller
Playing Zork 1 on a CP/M emulator on Linux
JGemini -- a Java-based browser for Project Gemini protocols and content
Using a Pi Zero and throw-away parts to provide a serial terminal for retrocomputing projects
Deploying the Mosquitto MQTT message broker on OpenShift (part 2)
Capturing database change records using Debezium and Camel
Using Apache Avro for passing Java objects through a message broker, with a schema registry
Developing KCalc-CPM -- a scientific calculator utility for CP/M
CP/M forty years on -- what it was, and why it still matters
Running CP/M on the Raspberry Pi Pico microcontroller
Why you can sometimes connect 3.3V and 5V I2C devices (and probably shouldn't)
Controlling a chain of MAX7219 LED matrices using C on a Raspberry Pi Pico
Building and programming a USB auxiliary display using a SparkFun Pro Micro, an HD44780 LCD module, and an PCF8547 IC-to-parallel IC
The tabular method for integration by parts
Integrating factors from the ground up
Using an I2C analog-to-digital for temperature measurement on the Raspberry Pi
Gâteaux differentials and Euler-Lagrange equations using Maple
Why you can't rely on system calls to obtain limits, when running an application in a container
Container from scratch: building a Linux container from the ground up
The importance of enabling compiler warnings in C and C++ programming
Why is covid-19 testing so unreliable? A pictorial view
Java as a scripting language: new auto-compilation features in Java 11
How to run a shell script from a Java application
Making simple stop-motion animations using Linux and a DSLR camera
Developing micro-microservices in C on Red Hat OpenShift
Understanding the Hamming 'sphere packing' bound in coding theory
Solving a quadratic equation in a prime (finite) field
An introduction to joint, marginal, and conditional probabilities
Using the Raspberry Pi official 7-inch touch-screen in embedded applications
Handling GPIO-connected switches robustly in C on the Raspberry Pi
Why switching high currents using a MOSFET and a Raspberry Pi is not as straightforward as it looks
Extracting software from the Raspbian repository, for assembling a custom Linux image for the Raspberry Pi
Bayesian statistics for dummies
Night of the living differential equations -- modeling the zombie apocalyse
Night of the living drag coefficients -- ballistics applied to zombie control
The titles game: can you buy nobility?
An introduction to steam locomotive technology
Prototyping a large Raspberry Pi case
Raspberry Pi 4 -- is it good news for experimenters and enthusiasts?
Building a Lua extension library for Linux in C/C++
Lua quick-start for Java programmers
A Linux storage management cheat-sheet
An introduction to Perl for Java programmers
Why use of the @Override annotation is essential in Java
A collection of Java curiosities and oddities
Generating simple MIDI files using Java, without using the Java Sound API
How to give a presentation
A brief history of English land law
Compiling a Java program to native code using GraalVM, from the ground up
How the Fabric8 Maven plug-in deploys Java applications to OpenShift
Making a Java JAR file self-executing (on Linux)
Ten simple rules for passing an examination
Why you can't play Bach on a piano
An overview of character encoding for developers
A ten-minute guide to electrical theory
Unicode combining and graphemes -- how two identical Java Strings can be different
Using an ammo box as portable 12V power supply
Extending the bash 'cd' command in Linux
The Argleton affair, and the Wikification of the World-Wide Web