Kevin Boone's website
Home page
Linux / UnixJava / JVMEmbedded / microcontrollersElectronics
- Posts
- 448 from 7 Jul 2020 to 12 Oct 2026
- Posting
- about daily (171 in the last year)
- Kind
- personal blog
- Feed
- https://kevinboone.me/feed.xml
2026 153
- First steps in bare-metal programming using UEFI -- part 5
- General computing
- Linux installation and administration
- OpenShift
- General software development
- Java programming
- Perl programming
- General science and Technology
- Education; articles for students
- English law and politics
- Mathematics
- Music groupindex
- July 2020
- Container technology
- Retrocomputing
- C programming
- Lua programming
- Embedded computing
- Raspberry Pi
- Arduino
- Electronics
- February 2021
- January 2021
- December 2020
- November 2020
- October 2020
- September 2020
- August 2020
- Middleware
- CP/M and Z80
- Raspberry Pi Pico
- Snake oil and pseudo-science
- January 2022
- December 2021
- November 2021
- October 2021
- September 2021
- August 2021
- June 2021
- May 2021
- April 2021
- March 2021
- Linux command-line hacking
- Computer security
- They don't make 'em like that any more
- August 2022
- July 2022
- June 2022
- May 2022
- April 2022
- March 2022
- February 2022
- Hi-fi and audio
- January 2023
- December 2022
- November 2022
- October 2022
- September 2022
- June 2023
- May 2023
- April 2023
- March 2023
- February 2023
- De-Googling
- December 2023
- November 2023
- October 2023
- September 2023
- August 2023
- July 2023
- September 2024
- August 2024
- July 2024
- June 2024
- May 2024
- April 2024
- March 2024
- February 2024
- January 2024
- December 2025
- November 2025
- October 2025
- September 2025
- August 2025
- July 2025
- June 2025
- May 2025
- March 2025
- February 2025
- January 2025
- December 2024
- November 2024
- October 2024
- The small web
- June 2026
- May 2026
- April 2026
- March 2026
- February 2026
- January 2026
- October 2026
- September 2026
- August 2026
- July 2026
- First steps in bare-metal programming using UEFI -- part 4
- First steps in bare-metal programming using UEFI -- series index
- First steps in bare-metal programming using UEFI -- part 3
- First steps in bare-metal programming using UEFI -- part 2
- First steps in bare-metal programming using UEFI -- part 1
- Further thoughts on Android's native desktop mode
- System-level ad-blocking in Android in 2026
- Software
- VoLTE on de-Googled Samsung devices: perhaps there is light at the end of the tunnel
- Did you know that recent, de-Googled Android ROMs like Lineage OS have a "desktop" mode?
- No more Lineage OS on Samsung cellphones
- Why are modern televisions so cheap?
- Who needs a dedicated portable music player in 2026?
- Using a Raspberry Pi Pico to control a large-scale model locomotive
- Command-line hacking: using find, sed, and xargs together for flexible filename transformation
- The crisis in refurbished, top-tier smartphones
- How to recover when the Android rooted De-Bloater app puts your device into a boot loop
- Praying to St Jude: counselling the re-Googlers
- Did aliens really talk to us in "binary code" at Rendlesham Forest?
- Why I don't really care if web content is AI-generated
- MBook -- a proposal for a new, simple e-book format based on Markdown
- Maps after Google
- keplerd: a new Java-based server for the Gemini protocol and others
- Running a Java server application in a chroot jail
- In praise of HTTP
- Announcing md2gem 0.1 -- a cross-platform, best-effort converter for Markdown to Gemini Gemtext
- Self-hosting and steamrollers in the small net
- Is Fahrenheit 451 becoming relevant again?
- Trying to live without a smartphone in 2026
- Age verification and privacy: let's try to be objective
- Why I de-Googled
- Announcing Caztor 1.0 -- a browser for small-net protocols like Gemini and Gopher
- Announcing JGemini version 2.0
- JGemini -- a Java-based browser for Project Gemini protocols and content
- The "small web" is bigger than you might think
- A plug for the Spartan protocol
- Hosting a Gemini capsule on a virtual private server
- Small web, IndieWeb, Gemini... A guide to the retro-web
- Can Project Gemini rewind the Web thirty years?
- The Gemini Protocol in 2026: growing, but still not setting the Internet aflame
- This site is now webmention-aware
- They don't make them like that any more: the Cyclemaster
- Command-line hacking: a really simple console music player
- Rant: 2026 will not be the 'Year of Linux on the Desktop' -- and I'm glad
- Battle of the privacy-focused search engines: Kagi vs. DuckDuckGo
- Digital voice assistants vs. privacy in 2026
- Command-line hacking: Downloading a podcast to create an audiobook
- Using a Garmin fitness watch completely offline -- no accounts, no app
- They don't make 'em like that any more: filament fairy lights
2025 49
- They don't make 'em like that any more: the Casio VL-1 pocket synthesizer
- Predicting eclipses with clockwork
- They don't make them like that any more: the Yamaha DX7 keyboard
- They don't make them like that any more: Denshi block electronics kits
- Google Pixel and Sony Xperia handsets for budget de-Googling
- Some thoughts on de-Googling Google Pixel phones
- 'Sideloading' restrictions on Android: how big a deal will they be?
- How to write a technical or scientific report
- De-bloating and de-Googling an Android device using Canta
- The privacy nightmare of browser fingerprinting
- Comparing Android alternatives: Lineage OS, ∕e∕OS, and Graphene OS
- Custom ROM versus extensive package removal, for de-Googling a Samsung cellphone
- Is it worth rooting an Android phone in 2025?
- Running the Google Pixel Camera app on a robustly de-Googled cellphone
- Two years without Google, et al. -- has it been worth it?
- How to get a dark background on the K-9/Thunderbird e-mail widget for Android
- The 2nd-generation Nokia 105: a smarter dumb phone
- Gâteaux differentials and Euler-Lagrange equations using Maple
- AppImage from scratch
- Lineage OS vs /e/OS in 2025
- USB-C headphone dongles: still sucking after all these years
- They don't make 'em like that any more: Playmobil RC model trains
- They don't make 'em like that any more: Honda's ATC110 all-terrain cycle
- They don't make 'em like that any more: Dyson Pure Cool-Me personal air purifier
- They don't make 'em like that any more: tone controls
- Creating an "animated score" for demonstrating musical compositions on YouTube, etc
- 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
- 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
- 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
2024 47
- 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: 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
- 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
- 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
- RSS feed
- Command-line hacking: calculating the phase of the Moon
- They don't make 'em like that any more: Blackberry Bold 9700
2023 50
- 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
- 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
- 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
2022 55
- 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 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
- 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
- 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
2021 43
- 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
- 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
- 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 I2C-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
- On master/slave
- 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
2020 51
- 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
- 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