Now available: Sub-articles: articles that I didn't get around to writing detailed expositions for.

RFC 7168: Hypertext Coffee Pot Control Protocol for Tea Efflux Appliances
An update to HTCPCP (RFC 2324) to allow for the connection of networked tea-brewing devices. Published under the RFC Informational series.
Let's Build a JPEG Decoder: Frames and Bitstreams
Continuing a series exploring the concepts behind JPEG image compression, this part begins delving into the relationship between the image, its colour constituents and the encoded data by breaking open the Start of Frame segment.
Let's Build a JPEG Decoder: Huffman Tables
Various levels of compression and encoding are employed in the production of a JPEG file. The first step in decompressing an image is decoding the data, which is compressed with a variant of Huffman encoding. This article looks at the data attached to a JPEG file which allows the Huffman decoding to proceed.
Let's Build a JPEG Decoder: File Structure
Aside from the concepts explored in the previous part of this series, the JPEG file format is composed of segments which encode the various portions of information needed to decode an image. This article implements a simple method of traversing the segments of a JPEG file.
Let's Build a JPEG Decoder: Concepts
The JPEG image format is a bit of a black box for many: files go in and images come out. Looking inside the box reveals a bunch of interesting algorithms and ideas, so writing a JPEG decoder makes for an interesting exercise. This article explores the concepts behind the compression techniques used by JPEG.
Steganography with Brainfuck
There are a number of techniques for encrypting or hiding information within an image, including the concept of hiding a program within the image which itself prints the secret information. This article explores the feasibility of encoding a Brainfuck program within the bitmap data of an image, with a detailed run-through of a simple example.
Augmented Reality with the Android NDK: Part 2
Concluding an introduction to the development of augmented reality software, this part looks at implementing an edge detection algorithm overlaid on an Android smartphone's camera preview, and how the process can be optimised through use of the Android Native Development Kit.
Augmented Reality with the Android NDK: Part 1
One of the major current trends in smartphone applications is augmented reality: a view of reality with information laid on top. This can be as simple as a view of what the camera is currently seeing, with calculations based on position and direction. In the first of a two-part article series on Android development, this article looks at how to set up a camera view and access a canvas for the rendering of overlay information.
GameBoy Emulation in JavaScript
A series of articles exploring the development of a GameBoy emulator, using JavaScript and HTML5. Currently on part 10; other parts are expected to follow.
Venn Diagrams in PHP and imagick
Visualising the overlap between two sets of data is often achieved through Venn diagrams, but such diagrams can be difficult to render in a web development environment. This article covers the mathematics and geometry behind the Venn diagram, and a simple implementation of the algorithms involved in calculating the appropriate dimensions.
Discordian Date Handling in Java
Date handling, and especially conversion between different calendars, can be a complex issue to deal with. This article introduces the concept of calendar conversion in Java, and the issues that need to be dealt with when performing such conversions, by building a handler for the Discordian calendar and investigating the mappings between months in the Gregorian calendar and the Discordian seasons.
linecolor.pl: Rule based Line Coloring in irssi
The irssi IRC client has a built-in capability for rule-based highlighting of nicknames, but does not allow for the full line to be highlighted; nor does irssi allow arbitrary colours to be set against different rules. linecolor is an extension script for irssi that allows for this functionality to be added, in an intuitive fashion.
Audio Captchas in PHP
The major compromise made when a website uses Captcha images is that between accessibility and security; those with bad eyesight or colour-blindness may have trouble viewing a Captcha image. One way around that is to provide an MP3 download option for the Captcha text, which gives another path of accessibility to the process. This article looks at how an audio Captcha can be generated, using common tools.
Implementing PayPal Website Payments Pro UK
PayPal is used across the world to authorise payments online, and a seamless credit card payment service is available through Website Payments Pro. Unfortunately, the documentation for implementing this can be confusing and contradictory, and getting your code working can take some time. In this article I've brought together the documentation and my experience with it, to provide a coherent source of information on Website Payments Pro.
Shooting Yourself in the Foot Part Two
At some point, most developers have come across 'Shooting yourself in the foot', the comparison of how different programming languages would implement the process of firing a gun at your foot. This article assumes success, and the lack of a significant portion of your leg; Part Two looks at how to rebuild your leg, in various languages.
JavaScript Tab Controls
Tabs have always been one of the most useful elements of a user interface, allowing an interface designer to pack a lot of information into a small space by only showing a section at a time. This article explores the implementation of a tabbing interface using HTML and JavaScript, and goes on to look at pages where more than one set of tabs is used at the same time.
Automated Deployment with Subversion
Version control systems and development testing servers go hand in hand; you work on your local working copy, and test on the development server. But what happens when you want to take your work live: to deploy the developments you've completed? This article presents one way to solve that problem, by using the scripting facilities provided by Subversion.
Extended Text Mode on the C64
When you mention the Commodore 64, most people think that it's an obsolete computer from the 80s which no-one could ever use nowadays. One of the major problems is that you can't fit enough information onto a C64's screen: the standard size of a work terminal is 80 characters by 25 lines, and 40x25 just isn't enough. In the first part of a series (which may take some time to complete), I look into rendering an 80x25 text screen on the Commodore 64, and how it can be done.
Building Complex Emails with PHP
The first script that a budding PHP developer builds is often a tool to send simple email messages from a website, with a couple of paragraphs of text inside. What these scripts lack is the ability to send HTML-formatted emails, or to attach documents and other files to the message. In this article, I cover the MIME standard for building complex emails, and how to format and send a MIME-compliant email message in PHP.
Intranet DNS Resolution with BIND Views
When you're working on a web site that's hosted in the same office, it can be a problem to see the fruits of your labour: the web site's domain resolves to the external IP of the office, and can't be routed from inside. It's quite easy to overcome this problem, by using the 'view' facility of BIND to provide two different views of the domain: one for the office LAN, and one for the outside world.
An Introduction to Compression
An exploration of the different types of compression, looking at the workings of lossless compression methods such as RLE and Huffman encoding, and taking an overview of perceptive compression and why it works. If you've ever wondered how a CD can be shrunk down from 650MB of sound to 65MB, this article tells you how it's done.
Whitelist SSH Access with OpenWRT
If you're tired of constant login attacks against your SSH server, you can use your OpenWRT router to implement a whitelisting firewall, allowing the people you know and trust to connect to your shell, and blocking everything else. It's even possible to automatically modify the whitelist from an intranet Web page, through the use of extensions to PHP; this article will show you how it's done.
Booting Linux from Flash
For those who build home theatre PCs and other computers which need to be quiet in operation, most of the noise from computer hardware can be eliminated: fans can be removed, heatsinks and smaller power supplies can be used. The largest remaining source of noise is the hard disk containing the operating system. If the HTPC is running Linux, it's possible to move that operating system from hard disk to a USB flash drive, and boot it from there; this article shows you how.
Running a Windows Partition in VMware
Virtualisation of operating systems is a big trend at the moment: running multiple servers on one physical box allows a hosting company to save space and power costs, and running different operating systems lets a Web developer test their work on various browsers and hosts. The problem with setting up a virtual machine is the loss of disk space on the host, to hold a disk image for the guest; what if you've already got an installation on another partition? This article shows how to use that physical installation in VMware, using the example of Linux as the host and Windows XP as the guest.
Bitwise Operators
For almost as long as the computer has existed, programmers and developers have had to deal with the computer's representation of numbers, the binary numbering system. The unique properties of binary allow the application of Boolean mathematics to common manipulations. This article provides a run-down of the common Boolean operations, including their syntax in C-derived programming languages, and provides examples of where such operations might be used in everyday development.
The Smallest NDS File
Embedded development is often focused on the size of the resultant binary, especially on platforms where this factor is important. On the Nintendo GBA and DS, the homebrew toolchain is able to generate well-optimised binaries, but programs with equivalent functionality tend to have very different sizes. This article looks into why that is the case, and explores the format of a Nintendo DS binary file in an attempt to make the smallest DS binary possible.
Virus Detection with Message Digests
One day in 2006, I was set a short challenge: write an article of around 500 words on the topic of MD5 digests. This article was the result: an explanation of what it means when a computer generates a digest of a message, and a look at where message digests can be used. In particular, focus is given to automatic generation of digests for executable files, and how this can be used to detect possible manipulations of the files by viruses.
DOM Manipulation and CSS Trees
Details regarding the implementation of a collapsible tree-style nested list using standards-compliant HTML and CSS, utilising JavaScript and the Document Object Model.
Get the RSS feed