There's no shortage of guidance on writing English that people will want to read. In science and technology, however, can we apply the same guidelines without losing information?
As part of my campaign to eliminate wall-warts and external power supplies that don't have on/off switches, I've built a USB charger that has a mains switch. Why? Because nobody seems to sell one.
In a market dominated by the Amazon Kindle, it's easy to forget that Sony, not Amazon, made the first commercially-successful e-book reader.
How worried should we be, that we're wasting electrical energy for no benefit?
How a non-existent English village ended up on maps, and the implications this has for how we handle information.
The built-in cd command in the bash shell is not as smart as it could be; but it's a little fiddly to extend its functionality.
A military-surplus steel ammunition box makes a great housing for a high-current, outdoor 12V power supply. This article gives some ideas about how to build one.
Java's strict adherence to Unicode standards for text representation ought to make life easier for developers, and usually it does. But not always.
Volts, amps, ohms, and watts, for complete beginners. This article explains electrical circuit theory in the context of domestic wiring installation.
How character encoding actually works, and the implications for developers of choosing one character set over another.
Well, perhaps you can play Bach on a piano, if you have the skill and the patience; but you can't hear Bach's music the way he and his contemporaries would have heard it because, in general, we don't using the same tuning schemes. This is an article about the mathematics of music tuning, from Pythagoras to the modern equally-tempered scale.
Advice for students on how to do well in university level examinations, fairly and honestly. There are no secrets here, but it's amazing how many students do less well than they should because they haven't understood how university teaching works.
A quick-and-dirty way to make it possible to execute Java JAR files at the prompt, without needing to invoke the JVM.
This article describes in detail the steps the Fabric8 Maven plug-in carries out when deploying an application to OpenShift.
The GraalVM 'Native Image' plugin has the capability to compile to stand-alone binaries languages like Java that are normally compiled on the fly. This article describes step-by-step how to install GraalVM and the plug-in, and use it on some simple Java examples.
Some guidance, mostly for students, on how to make a scientific or technical presentation.
Although the Java Media Framework can do some very sophisticated things, it remains relatively difficult to generate simple musical tones using Java. The de-facto method for specifying musical notes remains the MIDI file, although there are now more sophisticated approaches. It's surprisingly difficult to generate even a simple MIDI file in Java,...
Why does Java have a NullPointerException when it doesn't support pointers? Why does the equality operator compare object references, but the collections framework comparison methods compare object contents? These questions and many more like them will comprehensively fail to be answered in this article.
Developers don't use @Override enough. Java's method visibility rules, when classes are in different packages, make polymorphic inheritance behave in odd ways. Careful use of @Override can prevent these problems, and make applications much easier to maintain.
A quick-start guide that highlights the similarities and differences between the Java and Perl programming languages.
This article outlines, with step-by-step examples, how to carry out the most fundamental Linux storage management tasks: partitioning a disk, creating a filesystem, setting up swap space, managing a logical volume management (LVM) storage pool, and configuring a RAID mirror.
The essentials of Lua programming in one page, for experienced Java programmers.
Lua is an embeddable scripting language, which can be extended in a number of useful ways. This article describes in detail how to create a Lua extension in C (or, with a bit of fiddling, C++) as a loadable (.so) library.
Faster, more of everything, same price -- what's not to like?
Using high-density vinyl board to construct a practical prototype case without specialist tools or materials
Oh yes it's great to be an engine... But how did the driving force of the industrial revolution actually work?
This article is about whether you can legally and openly buy a British noble title. Spoiler alert: no, you can't. People still keep asking, though.
An exploration of various aspects of English law, as they apply to the owners and managers of small, private woodlands.
An introduction to the science of exterior ballistics -- tracking the flight of a projectile under the influence of gravity and drag.
Using a simple application of Euler's method to estimate the solutions of non-linear differential equations, and work out your chances of surviving the zombie apocalypse. No, really.
An explanation from first principles of this much-misunderstood principle of statical inference.
Using the official Raspian repository to assist the construction of a custom Linux for embedded applications is quick and convenient, compared to building everything from source. However, this approach has certain hazards.
Using a single MOSFET transistor for power switching in microcontroller applications is simple and low-cost, but it often doesn't work as well as expected. Either the switched device doesn't run at full capacity, or the MOSFET gets hot. This article explains why.
It's surprisingly difficult to detect switch actuations in a robust way, dealing with contact bounce and other quirks. This article describes one approach to the problem in C.
The official Raspberry Pi 7-inch touchscreen is a useful and well-designed piece of equipment but, if you're using it in a custom (hardware and/or software) build, you'll notice a lack of any relevant technical information. This article tries to supply some of that information.
An explanation from first principles of the concepts of probability applied to two random discrete variables.
This article describes how to do arithmetic in a small finite (prime) field. Being able to do this is essential for the implementation of cryptography, among other things. The arithmetic isn't particularly difficult -- particularly if we use software that specifically supports such operations. However, it's illustrative to do it manually, at...
The Hamming bound is an important metric in the evaluation of information coding schemes. It sets an upper limit on the number of distinct codewords that an error-correcting block code can provide, for a given block length. The Hamming bound is a benchmark for the evaluation of error correction schemes used in digital data storage and...
Although Java dominates the webservices world, there are gains to be made by considering the use of lower-level lanaguages like C, particularly in a containerized, microservice architecture. This article describes one way to implement a webservice for Red Hat OpenShift, and similar systems, using C and an ultra-lightweight container base image.
Creating stop-motion animated movies using a DSLR camera and some basic Linux tools. It won't rival Pixar, but it's something to do with your kids on a rainy Sunday afternoon.
Running a shell script from a Java program usingappears simple. In practice, there are many pitfalls. This article describes how to avoid at least some of them.
New auto-compilation features in Java 11 give Java the potential to behave more like a traditional scripting language, such as Perl or Python. But how useful are these features in practice?
The UK Government's response to the covid-19 is to 'test, test, test'. This article demonstrates in pictorial terms why this strategy will catastrophically overestimate the number of people actually infected, leading to widespread disruption.
I see too many C (and C++) programs misbehave at runtime, for reasons that could easily have been detected using checks built into all modern compilers. This article describes some common C programming errors, and shows how they would have been spotted easily if the compiler were configured correctly.
Containers have become increasingly important for Linux developers and administrators. A number of frameworks like LXC, Docker, and Podman are now available to automate the management of containers. However, all these frameworks rely on similar kernel features, particularly control groups, namespaces, and virtual networks. This article...
The notion of resource limits (on memory, CPU, etc) has never been very well-defined, and the use of container-based deployment makes the situation worse. This article describes why, and what can be done about it.
My article on calculus of variations assumed without explanation the basic form of the Euler-Lagrange equation. This article attempts to demonstrate how an Euler-Lagrange equation arises, by solving a variational problem algebraically using Maple.
This article describes how to do simple temperature measurement with a Raspberry Pi, and I2C analog-to-digital converter, and a thermistor.
The use of integrating factors is a well-known method for turning an intractable differential equation into an integration problem (which may itself turn out to be intractable, but we live in hope). The method is usually described in textbooks and lectures with a fair amount of hand-waving. This article attempts to describe it in detail, with...
There is a tabular method for organizing integration computations which require repeated application of the integration-by-parts formula. It is seldom taught, which is a shame: it hugely reduces the algebraic complexity of the problem.
Make an "auxiliary LCD display" for a computer that displays data sent to it over a USB connection. Ready-made devices of this sort are widely available, but it's more fun to build your own.
The MAX7219 IC is widely used to control an 8x8 matrix of LED, but they can be chained to create much larger displays. This article describes how the chaining works, and how to create a driver for the Raspberry Pi Pico.
On websites, and in hobbyist kits for Raspberry Pi and Arduino, you'll often see IC devices connected that have different supply voltages. This is (usually) safe and, in non-critical applications, tends to work. But why?
This article introduces CPICOM -- an emulator for CP/M 2.2 on the Raspberry Pi microcontroller.
Why was the CP/M operating system so successful? Forty years on, why should we care?
My first CP/M program for nearly 40 years -- how, and why, I wrote it.
This article extends my earlier article on using Avro with a message broker. In this article I explain how to use the Apicurio schema registry to store Avro schema artefacts that are shared by multiple clients, rather than providing local copies for each client.
The notion of "change data capture" (CDC) is becoming increasingly significant, in an IT industry that stores and manages an ever-increasing volume of data. This article describes how to begin using the Debezium CDC framework with Apache Came, to collect and process change records from disparate data sources.
Part 2 of my article on installation the Mosquitto MQTT message broker on OpenShift.
Many retrocompting projects are designed to be used with a serial terminal. It's easy to emulate a terminal using a desktop workstation, but more authentic to use a dedicated serial terminal. Real VT52-style terminals are expensive, and difficult to transport because they use CRTs. VGA and small HDMI monitors, however, are dirt cheap, as are USB...
Introducing a simple graphical browser for Project Gemini content; back to the 90s -- in a good way.
In the last few years there has been a revival of interest in 8-bit microcomputers from the 70s and 80s. Many of these were based on the Zilog Z80, and many ran CP/M. This article about getting started with CP/M using an emulator on Linux.
Back in the 70s, desktop computers booted to BASIC. In this article, I describe my efforts to implement a BASIC programming environment on the SparkFun Pro Micro, a small Arduino-like 8-bit microcontroller.
This article describes a method for deploying the Mosquitto MQTT message broker on OpenShift. Such an installation might potentially be useful in its own right, but the main purpose of the article is to discuss issues that are relevant packaging any application in an OpenShift-compatible way.
Both Apache ActiveMQ and Apache Artemis have infrastructure for creating networked message broker meshes. However, their implementations are rather different, which can be problematic for integrators who want to migrate from ActiveMQ to Artemis. This article describes how to replicate -- so far as possible -- ActiveMQ mesh behaviour in Artemis.
'Spy pixels' or 'tracking pixels' are surprisingly prevalent in email messages -- they are found, it seems, in perhaps 70% of all such communications. Is this cause for concern? How much personal data are they brokering?
Audiobook supplier Audible has recently caused controversy by changing its long-standing one-click, no-questions-asked returns policy. Why? And who stands to gain and lose from this change? What are the broader implications?
Introducing a series of articles on building a custom Linux installation for the Raspberry Pi, for appliance applications.
Camel-K is a relatively new technology for deploying Apache Camel routes directly to an OpenShift/Kubernetes cluster. There is a lot of hidden complexity; this article exposes some of it.
This article describes how to use Apache Avro to flatten a Java object, pass it through a JMS-compatible message broker, and reconstruct it again. Avro is a compact, schema-based data representation that is becoming increasingly important in messaging applications.
Implementing a program to run Conway's cell population simulation, using a 3D perspective view on the Linux framebuffer.
Using an Android device as a remotely-controllable music player.
Animated musical scores are quite common on YouTube, for educational and promotional purposes. This article explains how to create one, using OpenShot and other Linux tools.
The "big switch-off" of analogue radio services in the UK has been deferred repeatedly. One of the reasons for this is that the impact on energy efficiency is hard to assess. This article seeks to explain why.
We only see one face of the moon from the Earth, and that isn't a coincidence. The same process that causes this effect also affects other celestial bodies, often in more interesting ways.
Collecting sensor data, or low-level system status information, is a job that is often best done in C/C++. Distributing this kind of data to other system components in a way that is platform- and language-independent can be a challenge. This article suggests a way to do this use AMQP message distribution.
Audio CDs were recorded using a 44.1 kHz sample rate that is found almost nowhere else. If we have to resample this audio to suit more modern equipment, how much loss of audio quality will there be?
In praise of an iconic laptop computer.
It isn't often that coding theory can be used to evaluate a claim of a UFO encounter. Here is one instance where it can.
This article describes how to write a trivial program for Linux using no compiler tools at all, but entering machine language directly in hexadecimal. Because we can.
Sometimes it's helpful to be able to create an executable program that embeds all the data it needs, and provide that data as files. C/C++ do not provide any standard way to do this, but GCC has facilities that the developer can use.
The Apache ActiveMQ Artemis message broker holds out the possibility of real shared-nothing replication. The problem, though, lies in coordinating the active and passive brokers in the cluster. This article describes the new active/passive management framework, and how to use Apache Zookeeper as the source of authority on cluster roles.
Some guidance, mostly for science and engineering students, on how to write a scientific or technical paper. I've updated this slightly to deal with the rise in web-based publication but, frankly, I don't think that different standards apply to electronic and print reporting.
Functional interfaces are allow Java programmers to write methods whose arguments are lambda functions. How does this work, and why would it be useful?
This article describes how to deploy a container image direct from a local repository to an OpenShift 4 cluster, and instantiate a pod based on that image.
1999 was the golden year of palmtop computing. Within a couple of years, palmtops were obsolete. Why?
How to use basic Bash constructs, along with the Gnome gio utility, to assign folder icons to a set of directories.
How to use tools like curl and xsltproc to retrieve news headlines from the BBC, and display them using the manual viewer
Using a Linux Bash script to generate audio/visual cues for timing paced breathing exercises.
Using Linux command-line utilities to query an on-line database of Internet radio stations.
How to use Bash shell techniques to extract metadata (tags) from various audio file formats.
How to use Bash shell arithmetic to create a simple tide table
How to use tools like curl, sed, and groff to retrieve a weather forecast from the BBC, and format it for the terminal.
Using 'date' and 'timedatectl' to build a utility to help with scheduling meetings in different timezones.
Desktop Linux will take off next year -- or so people have been saying for years. Do desktop containerization technologies like Flatpak make this more, or less, likely?
Understanding the advantages and disadvantages of the various types of headphone that are currently available, without all the "audiophile" silliness.
Vintage vinyl records ought, perhaps, to be played on a vintage turntable. Although such appliances are still widely available, and can work well, they fall short of contemporary electrical safety standards.
Do balanced headphones provide an improvement in sound quality over conventional, single-ended designs? Unlikely. In fact, the increased complexity of these designs may actually reduce the accuracy of sound reproduction.
Bits are bits, right? If a CD transport just sends digital data to a DAC, is it even possible that different transports sound different?
You really can't improve your hi-fi system with a fancy mains cable. But why? And why do people think you can?
The availability of "better than CD" audio recordings is driving, and being driven by, more expensive and elaborate audio hardware, even in the consumer market. Is this a good thing?
Copying an audio CD -- perhaps to a portable music player -- is a common enough operation. There are strong opinions on how to do this, and what software to use. But does it really make any difference? Or is one bit the same as any other?
Why are sales of vinyl records increasing, when digital streaming services provide access to almost any recording ever made, in superior technical quality?
A number of reviews of the Leak Stereo 130 and CDT can be found online, but they are short on practical details. I've been using mine eight hours a day for several months; this is what I think of them.
Many portable and automotive media players accept USB memory sticks or SD cards containing audio files. Very often, these players have no sorting logic, and display files and directories in the arbitrary order they appear in the filesystem. This article describes how to sort a FAT filesystem using Linux utilities, to make playback more convenient.
The calculus of variations is a branch of mathematics that deals with finding functions that optimize systems. Although calculus of variations has its origins in the 18th century, it is still not widely taught, either to science or engineering students. This brief guide intends to explain the basic principles, with a fully-worked example, in...
It's common for hifi amplifiers and speakers to have a power rating expressed in terms of "RMS watts". Although RMS amplitude is an important concept in electronic engineering, it's meaningless here, and should be avoided.
Misrepresentations of scale are common in the literature of organizations that seek to deceive. However, it's sometimes difficult, or unhelpful, to draw diagrams to scale. This article tries to explain the difference between benign and pernicious distortions of scale. I'm picking on the flat-earthers for the purposes of illustration, but the...
A simple and inexpensive shift register can be used to increase the digital output provision of a Raspberry Pi or microcontroller. This well-know technique is easy to apply, but has some limitations that require careful consideration.
The HC-SR04 proximity sensor is an inexpensive and widely-used ultrasonic device. Connecting one to an HC-SR04 to a Raspberry Pi is a common educational exercise, but getting accurate, repeatable measurement of distance in a real application is actually quite difficult. This article explains why, and what can be done to improve matters.
Many battery-backed power supplies for the Raspberry Pi, and similar systems, use the INA219 current/voltage monitor IC. This device has an I2C interface by which the Pi can determine the battery voltage and current, and estimate the charge level and run-time. This article describes how to write C code that interacts with the INA219.
In this article I explain how to construct, and program in C, an IC interface to the popular HD44780 LCD display for the Raspberry Pi. Between the article and the accompanying source code, no technical details are concealed: I present the complete hardware design and every line of C code needed to operate it.
The Raspberry Pi doesn't offer much in the way of analog outputs, or even hardware controlled PWM. Software-controlled PWM is an alternative in some applications, but it needs to be used carefully, if inefficiencies are to be avoided.
The use of dithering when mastering a CD is well-established, and its effectiveness is rarely challenged. But is it beneficial in other circumstances when we need to reduce the bit depth of an audio stream?
Implementing a webservice in C and Java, to see which performs better in terms of throughput and resource usage.
Using a Camel application based on Quarkus to provide a way to route messages to and from a message broker using HTTP requests
A mains inverter is a very useful device, but inexpensive models create significant electrical safety hazards. This article explains why.
AMQP is not a trivially-straightforward protocol to understand, but it's necessary to get to grips with it to write effective software that uses the Qpid Proton AMQP library. Perhaps one of the simplest ways to understand AMQP is to use Proton's own packet-tracing features, as this article explains.
This article describes the fundamentals of setting up the Apache Artemis message broker to use an Oracle database as the message data store.
This article is the second on my series on using the Oracle database as the message data store for the Apache Artemis message broker. In it, I describe the database schema, and how it supports messaging operations.
The Raspberry Pi is widely used as part of a more complex electronic project or construction. There's a misconception that such a construction can be powered from the same cheap, nasty USB charger that is suitable to power a Pi on its own. Attempting to do this often leads to undervoltage situations. This article explains why, and what...
This article describes how to create a self-contained CP/M-based microcomputer using a Z80 single-board computer, a Raspberry Pi Zero, and some assorted electrical parts.
This article continues my explanation of using Keycloak as an authentication provider for Apache Artemis, by showing how to use a bearer token to authenticate a JMS client.
Using the 1989 HI-TECH C compiler on CP/M, and some general observations about CP/M programming with real hardware.
Is it really possible to design an operating system for a computer built from scavenged parts after civilization has failed?
CP/M has no timing or delay functions, because CP/M never stipulated that compatible hardware have any kind of clock. So how do we implement short (fractions of a second) delays in a CP/M program?
CP/M only recognized four serial devices. How did application cope when more than four serial ports were installed?
Because -- why not?
Constructing and programming a real-time clock board for my Z80 CP/M system
This article describes a couple of methods for sharing data and code between a CP/M system with RomWBW BIOS and a Linux system.
A step-by-step guide to building and installing a modified version of the RomWBW firmware on a CP/M Z80 board.
An 80's-style 8-bit computer has to be cable of making 80's 8-bit sound. In this article I describe adding a sound board to my RC2014 system.
The Pi Pico is an impressive microcontroller for its size and cost, but it lacks specific non-volatile memory. This article explains how to use the program flash ROM for that purpose.
No 80s computer is complete without the chucka-chucka-chucka sound of a floppy disk drive doing its thing.
Shared subscriptions are a 'new' feature in JMS, that seems to be poorly understood, particularly in a clustered environment. In this article, I explain how shared subscriptions are supposed to work, and what the implications are for load sharing and fault tolerance.
The Cowon D2 DAB was a media player ahead of its time. There was nothing like it in 2005, and there still isn't.
The Pronto offers a salutary lesson in how an excellent product can die, leaving a gaping hole in the market that nobody wants to fill.
Using an RC2014-based retrocomputer with genuine RS232 peripherals requires support for voltage level conversion. Although converter modules are inexpensive and widely available, I wanted to design something that would plug into an RC2014 backplane, just for neatness.
This is a landing page for my various articles on building a period-appropriate CP/M system using the RC2014 bus.
Is it possible to live without Google and the like, and still use modern, portable computing devices? I still don't know.
The screen resolution of smartphones has increased dramatically over the last ten years. Have we reached a point where further improvement is just a waste of money?
Despite its low initial price, the Shield K1 continues to put modern Android tablets to shame.
This question is not particularly easy to answer, but understanding the implications helps.
Using simple file and string handling techniques in the Bash shell.
Why an expensive smart watch is still less good than a cheap Timex, when it comes to telling the time.
People are increasingly using smart watches and fitness watches for tracking health metrics. Is it wise to do so? (Short answer: probably not.)
This simple analog computer has served humanity for more than four centuries. Shouldn't we try to preserve it?
ActiveMQ and Kafka are both open-source, Java-based, message brokers with applications in inter-process communication. But can they be used interchangeably?
The Vectrex used an entirely novel display technology that was superior to the TV-based displays of the time. Why didnt it catch on?
What happens when we have to make real-world construction match unrealistic mathematical models, that we happen to know how to simulate?
This article provides a very simple example of setting up the Apache Artemis message broker to authenticate against a Keycloak server.
How Java's "container awareness" feature works with simple (Docker/Podman) containers, and OpenShift pods.
Is it safe to sell a used hard drive without securely erasing all the data? And is it even possible to erase all the data, even if we want to?
'Separation of variables' is one of the first methods usually taught to math and engineering students for solving differential equations, and yet the method as taught is mathematically very sloppy. That's not to say it doesn't work, but rather that it isn't made clear why it works, and whether similar methods will work elsewhere. This article...
Even seasoned Linux developers speak of Gentoo in hushed tones. It's not for the faint-hearted, that's for sure. But how stout-hearted must you be, for Gentoo to be appropriate?
It's not that difficult, but there's no built-in support.
Regardless of the subjective merits of 'bit-perfect' audio, is it technically possible on Linux?
Not everybody likes Pulse audio or PipeWire. But is it practicable to abandon them in favour of traditional ALSA at this point?
Will my Gentoo journey be coming to an end after the first month?
The REX was the world's first, and last, credit-card-sized personal computing device. Why did it fail?
The elegant simplicity and serviceability of this compact power ampliifer has given it an enthusiastic following for nearly forty years.
The Vim text editor is almost ubiquitous on Linux systems, and for good reasons. This is the first article in a series which seeks to uncover some handy features of Vim, that don't seem to be widely known.
Although Lineage OS installation is pretty well-documented, there are a few things that might benefit from some more detailed explanation.
What's the real reason that cellphone manufacturers stopped fitting this simple, robust connector?
For a Linux user in particular, which of these popular services is the most effective?
This article is about how programming for CP/M, usng a 40-year-old C compiler, differs from modern C development, even for console applications.
Can you fit an NVMe solid-state drive into a computer that was made long before NVMe was invented? And should you?
Lineage OS is based on the Android Open-Source Project, whose primary maintainer is Google. To what extent can it be considered Google-free?
It isn't easy to run Linux well on ten-year-old laptops -- Linux distribution maintainers no longer see this as a worthwhile endeavour. In this article I compare Gentoo and MX Linux as potential solutions to this problem.
What can the software industry learn from the Log4J security debacle?
Java decompilers usually make a good job of recovering program structure and the names of classes and methods; why do they make such a bad job of recovering variable names?
There was a time when we didn't hate printers. Unfortunately, it was forty years ago.
Nothing says '80s pop' like a DX7.
As the Microsoft Windows user experience continues to worsen, what should Linux advocates do?
There was a time when merely being a Linux user set you apart from the common herd. These days, with Linux so ubiquitous, you'll need to take additional steps to make yourself out as one of the elite.
Wayland isn't new, but many of us have been able to avoid it until recently. With many Linux distributions now pushing Wayland hard -- even for the Raspberry Pi -- it's getting harder to justify ignoring it. This article is for people who have been hoping until now that Wayland will go away, particularly X developers, and don't know much about...
I don't want to post yet another anti-systemd rant, but I think the ubiquity of systemd could eventually create real problems for embedded Linux. I just wish I knew what to do about it.
Camel's IRC support makes it relatively easy to implement an IRC conversation agent, that can process IRC messages and produce responses.
Artix is a low-resource Linux that can be configured to run well on old, low-powered computer hardware. In this article, I describe my first attempts at setting it up.
There are relatively few good reasons for writing C code without using a standard C library. However, doing so provides valuable insights into how compilers and operating systems work, and is worth doing if only for its educational value.
Many of the standard Java APIs make extensive use of anonymous inner classes, to provide features that in other language would be provided using lambda functions or closures. However, anonymous inner classes have limitations that many developers find difficult to understand and to work with. This article explains why this is the case.
Using Linux date calculations to displaying a running countdown time in the terminal.
Encryption of home directories is out of favour in modern Linux distributions, but it offers some compelling advantages over the alternatives, if used with care.
The first part in a series on concurrency management in multi-threaded Java programs. This article deals with monitor objects and their use for demarcation of non-concurrent sections.
Why half a million people learned to program in Pascal, when you'd think they had no earthly reason to.
Modern portable media players are generally smartphones without an antenna. So why not repurpose a real smartphone as a media player?
Using a Raspberry Pi as a media player is by no means a new idea. However, using one as a self-contained hifi component is not common, and requires a bit of work.
Some thoughts on my first experiments with the design of electronics enclosures for laser cutting.
Following on from my article on the rudiments of the Kafka Streams API, this one introduces stateful operations like counting and aggregation.
Kafka Streams is a Java library and framework for creating applications that consume, process, and return Apache Kafka messages. This article provides a tutorial about implementing a very basic Streams application.
One of the earliest mass-market car satnav units, the Garmin Nuvi 300 still has features that modern devices lack. Why is that?
We're used to computing devices being electronic. But what can we do with a purely mechanical approach? This article looks at how eclipse prediction might have worked in the Antikythera Mechanism, c.2300 years ago.
How to use Bash shell arithmetic, along with the 'date' utilty, to calculate the phase of the Moon on a particlar day.
The Bold 9700 was a premium cellphone from a company at the top of its game. Does it merit the fawning reviews it collected in 2009?
This article describes what I think is the simplest possible Kafka Connect on Strimzi -- the Kubernetes implementation of Kafka. If follows from an earlier article about using Kafka Connect on bare metal.
This article describes what I think is the simplest possible Kafka Connect set-up, using a single-node Kafka installation. To ensure that the principles are clear, I use only a text editor and command-line tools to run the Connect infrastructure and deploy the connector.
Attaching high-capacity hard disks has always been a bit of a problem for the Raspberry Pi. In this article I describe a simple modification to a Waveshare USB HAT, that allows it to power both the attached drives and also the Pi itself.
The Raspberry Pi has a bunch of GPIO pins we can use to connect push-buttons. But how do we interface push-buttons to an application that expects only keyboard input?
This article is part of a series on building a custom Linux installation for a Raspberry Pi-based appliance. It explains how to make a bootable SD card with Pi firmware, a Linux kernel, and a shell. It's about as minimal as a Linux system can be.
Was there ever a golden age of the apostrophe, when everybody used it the same? No.
You think Apple was an innovator in the world of personal media players? Think again.
Most image editing applications provide a 'saturation' adjustment; some provide adjustments of 'brilliance', 'chroma', and other things. This article explains what these terms actually mean.
Darktable isn't supposed to be an alternative to Adobe Lightroom, but many people hope to use it as one. After all, Darktable's (free) pricing is very appealing. Here are my views on whether a move to Darktable makes sense.
Mapping keyboard keys to key codes on Linux is well-documented for the graphical desktop. But what about console applications on embedded Linux systems? There's not much documentation in this area.
This article continues my original framebuffer "just the essentials" article, by describing how to handle less straightforward framebuffer configurations.
The absolute minimum information needed to start using the Linux framebuffer as a graphical display in C/C++ applications.
This article describes how to construct a desktop photo clock using a Raspberry Pi Pico and some solder-free peripherals.
The Maxim DS3231 I2C real-time clock is a reasonably accurate, inexpensive device, that is easy to interface to the Raspberry Pi Pico.
This article describes how to generate and use compressed, anti-aliased font data, for use in a microcontroller application.
I've been using the Raspberry Pi Pico for embedded projects for the last two years or so. What do I think of it now?
This is a versatile touchscreen display module with a strikingly low cost. But is it any good?
An oddity of the GCC C compiler that can lead to strange results, particularly in an embedded application
This is the second of (at least) two articles on loading and running arbitrary executable code into RAM on the Pico, and running it.
This is the first of (at least) two articles on loading and running arbitrary executable code into RAM on the Pico, and running it.
The Pi Pico has USB host support, and can work with a USB keyboard. Although there are some programming examples, the general approach to programming USB host operations is not well documented.
This article provides a brief overview of the rdkafka library, illustrated by a simple test application in C.
Administrators of middleware message brokers often struggle to get adequate throughput. A lot of time and effort can be wasted, if the administrator doesn't appreciate the crucial role of synchronous disk writes in these installations.
Does controlling web search rankings amount to censorship? Does it matter if it does?
Building a CP/M implementation of the notorious Wordle game.
or thestates that in many data sets, the first digit of each value tends to be small. This is not at all obvious, but it has significant implications.
How an oddity in the way UTF-8 encoding works can cause all sorts of problems for unwary developers, including security weaknesses.
"Juice-jacking" is the alleged practice of getting unauthorized access to the contents of a cellphone by subverting public USB charging points. It doesn't happen, and probably never has; so why has there been a recent increase in scare stories?
There's been a recent scare that Unicode reading direction characters could be used to conceal malicious code in open-source projects. This is undoubtedly true, but that fact doesn't make it significantly harder to ensure the security of open-source code than it already is.
How to use Microsoft's Macro80 and Link80 utilities on CP/M, to build a program consisting of multiple assembly-language files.
A series of simple, progressive examples that demonstrate the essential features of programming in ARM assembly language.
It's still possible to write "text adventure" games for CP/M and other small, vintage computers. Here is one approach, using Linux as the development platform.
A detailed description of a method for performing this common numerical conversion, with C source code.
How to construct a custom networked storage (NAS) unit based on a Raspberry Pi and two mirrored USB hard drives -- and why you might want to.
You've created a custom Linux installation for the Raspberry Pi. How do you turn that into a bootable SD card image that can be distributed?
In this age of instant, world-wide communications, does it matter if a hundred year-old radio culture fades away?
We've all gotten so used to graphical desktops that we're losing sight of how much can be accomplished on Linux using only a console. This is a shame, because efficient console-only operation is possible on a computer that would otherwise be fit only for landfill, and on modern high-efficiency devices with limited computing power.
A specific application of the Pico7219 library that I described in an earlier article.
Kotlin is a Java-compatible programming language that has increased in popularity very quickly over the last few years. This article provides the briefest of overviews, for experienced Java developers who might be considering using Kotlin.
This article describes the concepts of finite fields, from the ground up, to a level at which it is possible to understand modern encryption algorithms. I assume only a high-school understanding of math.
My purpose in this article is not to explain that homeopathy doesn't work -- for all I know it might -- but that widespread acceptance of homeopathy is damaging to the scientific enterprise, and ultimately to society. I will also make the suggestion that the increased interest in homeopathy, and in other forms of alternative medicine, is a...
The advantages and disadvantages of Samsung DeX on an Android cellphone, compared with a desktop or laptop computer.
A small step in the right direction, or political correctness gone mad?
The modern World-Wide Web is broken. Is Gemini the repair?
The ease of installation and use of modern desktop Linux distributions comes at a price. I review a couple of low-complexity alternatives to mainstream Linux distributions: Alpine and Devuan.
Why was the non-existent planet Vulcan so frequently sighted by astronomers in the nineteenth century, and what can contemporary scientists and science students learn from this episode?
There are many kits and plans available for constructing miniature mechanical keyboards. But what do you do if you want a layout the nobody else seems to use? Build it from scratch.
Although connecting a USB keyboard to an Arduino-type microcontroller without addition hardware can be tricky, there are no such problems with many 90s keyboards. This article is about giving new life to old keyboards, by using them as input devices for microcontroller projects.
Why do so many IT professionals like to tinker with vintage computers and software?
Peli cases have a reputation of robustness, and look like a promising way to implement a rugged terminal using a Raspberry Pi.
The first step towards designing and building a custom keyboard, from the very first principles, using an Arduino-type microcontroller.
Although building and deploying a simple program to an Arduino board is a point-and-click operation using the Arduino IDE, implementing more complex programs requires more robust build tools. This article describes how to build on Linux using command-line tools -- a process that is nowhere near as easy as it should be. If we can build using...
This is a design for a robust, wooden enclosure for a Raspberry Pi, battery power supply, and touchscreen, that can be made using hand tools.
This article is part of a series on building a customer Linux installation for a Raspberry Pi-based appliance. It explains how to install and set up the minimum software to get audio playback working.
This article is part of a series on building a customer Linux installation for a Raspberry Pi-based appliance. It explains how to set up a system which hitherto only boots to a root shell, to a network-aware installation with service management.
This article is part of a series on building a customer Linux installation for a Raspberry Pi-based appliance. It explains how to obtain and install fundamental utilities for use in a system with a read-only filesystem, and no package manager.
It's entirely possible to run simple, X-based applications in an appliance-based Linux installation: you just have to dispense with the graphical desktop and all its baggage. This article explains how.
Switching loads of an amp or two with a Raspberry Pi or a microcontroller can be accomplished using a small number of inexpensive components. Suitable circuits are widely published, but the details of operation are not always described.
This article is about using an I2C analogue-to-digital device for applications like reading sensor values or monitoring backup batteries. With all the technical bits left in.
Writing graphical applications for minimal and embedded Linux systems can present a challenge. One of the problems is producing nicely-rendered text without the facilities that a graphical desktop would provide. This article describes how to use the FreeType library to render text to the Linux framebuffer.
See how OpenShift 3/4 deployment works in detail, using only command-line tools.
In many cases, "pitch" is just the musician's way of saying "frequency". However, pitch has a perceptual element to it, and the ear can be fooled. This article explains one of the ways in which this can happen, and why it isn't correct to use the terms "pitch" and "frequency" interchangeably in music.