Banker. Scientist. Nerd.

Explore my thoughts on finance, technology, AI, and the future of humanity.

Scroll down for my recent posts.

Connect With Me.

Reference Materials

Published 04 October 2026

Note: This is a living document. It contains sources that I consider valuable reference material, organised by topic.

Last Update: 04 October 2026

Personal Finance

Science

YouTube Channels

Derivatives

Crypto

  • Bitcoin White Paper. Worth a read if you haven't already. Pump through AI if it all gets too much.

Data

Mathematics

Coding

Python

An Old Classic

Published 02 May 2026

I find it difficult to dispose of my electronic devices. Over the years, this has meant I have accumulated something of a collection of devices in various states of disrepair and/or malfunction — from my first Sony Ericsson phone, to my recent retirement of a much-loved 2012 MacBook Pro (I squeezed a good 14 years out of it).

There is one device that has caught my eye many times over the years, because of the particular attachment I had to it and the way it let me down at the end of its first life. The hardware in question is my 120GB silver iPod Classic (Gen 6.5), which was my first iPod and a device that I treasured for many years after saving up what was, for me at the time, a substantial sum. When I was a teenager, it was the central hub of my growing music collection, and it was constantly 'synchronised' with my iTunes library, kept up to date with software updates, and generally treated with love.

It was all fun and games until it wasn't. There was never an 'accident'. No hard crack as that stainless steel case hit the kitchen tiles. No gurgle as the slab of high technology sliced gracelessly through a bubble bath. No thief snatching the gleaming thing from my grip. The 30-pin cable was never ripped out of its socket; I always safely ejected first, then carefully uplugged.

It left me before its time: the hard drive was corrupted. There was nothing to be done.

In the back of my mind, I always hoped there were only two things wrong with the iPod: it needed a new hard drive and a new battery. Back when it happened, a new hard drive was going to cost cost more than I could afford. It also wasn't clear if that was the only issue and there was no guarantee that replacing it would be enough to bring the iPod back.

Researching the art of the possible in 2026, I found an online community of iPod Classic lovers and modders, and the concept of the iFlash adaptors, allowing which let you bypass an expensive hard drive altogether and stick an SD card inside. This has the added benefit of prolonging battery life, since flash storage draws far less power than a spinning disk.

I bit the bullet, and forked out for the £33 iFlash uDual, some nifty pry tools, and a new battery from Amazon for £13. I considered upgrading to a larger battery, but I didn't want to squeeze more into the back case than it could comfortably hold, so I decided to stick with the original capacity. If I end up suffering from poor battery life in the future, I can always pop the thing open and have another go.

I would ordinarily stick with a reliable SanDisk SD card, but after reading reports of compatibility issues between these cards and the iFlash adaptor (here on the SD card tab), I opted for an SD card that no one had reported issues with: the Lexar Silver Plus 128GB microSD card.

Why 128GB and not larger? The standard firmware for this iPod can only support 120GB of data, so additional storage capacity would not be accessible. SD cards are also getting expensive, and I don't have 128GB of music. Having said that, I went for the uDual, so I can always pop in a second SD card at a later stage, though I suspect that would mean a full wipe and restore.

Now to the installation. There are plenty of guides online, but they all agree on one thing: the iPod Classics of generations 6 and 7 are among the most difficult to open. It was tricky, as promised, but I got there in the end without causing any material damage. Once open, I was in my element — carefully removing ribbon cables and inspecting the interior for any damage. It was easy enough to remove the old battery, stick the new one in, and click the new uDual adaptor into the slot vacated by the hard drive. The old drive, that corrupt piece of tech, will go back into my collection. Perhaps one day I'll have the time and energy to crack it open and take a peek at the platters.

Once I had all the components reconnected, I was delighted to see it power on. This is the part that surprised me the most. My new MacBook Pro running macOS Tahoe was fully capable of recognising and syncing the iPod Classic. I used an original Apple 30-pin cable with a USB-A to USB-C adaptor to plug this directly into my Mac. When I first plugged it in, it was detected as an iPod Classic and appeared in Finder, with a warning that it was corrupt and needed to be restored. I clicked the button to download the iPod firmware and let it attempt the restore. Nothing appeared to happen, and after five minutes I assumed it had failed and ejected the iPod. It had not given a success message, but it had in fact worked. After restarting the iPod and plugging it back it in, it was treated as a new device, and using the Finder menu to synch it with my iTunes library set the wheels in motion.

A short while later, I had a fully functional iPod Classic, with a historical snapshot of my music library it was when, without knowing it, in time from 15 years ago.

It's now time to put down the pen and travel back in time to a world before Spotify. This isn't quite enough for me to cancel my Spotify subscription, but there's a real different experience in selecting an album or track from your own library. The one you curated yourself, no 5G required.

It's time to put down the pen and travel back to a world before streaming. I won't be cancelling my subscriptions just yet, but there's something different about scrolling that click wheel through a library I built myself, album by album, as a teenager. Every track on it is there because I chose it. No algorithm, no signal, no 5G required.

Just my music, exactly as I left it.

Classic.

Creative Coding: Transience

Published 14 April 2025

Creative coding explores the intersection between art and code. I find it challenging to devote much time to this interest, but I wanted to see how easy it would be to revive something I made many years ago using p5.js and embed it here in a post.

I've enjoyed watching many videos by Daniel Schiffman from The Coding Train over the years, which inspired me to experiment using p5.js.

Created on 15 October 2017 by Joseph Hosier


Creating an Interactive Particle System with p5.js

Have you ever wanted to build your own particle system from scratch—complete with decaying trails, drag, and dynamic acceleration? Well, dust off your sliders, because that's exactly what this p5.js sketch does. In this post, we’ll step through the code and show how each part works, using snippets and explanations to make it all clear.


1. Global Variables and Tuning Knobs

We begin by declaring our essential variables:

var system;
var acc_Slider;

var acc_coefficient = 0.01;
var init_v_max = 5;
var lifespan = 550;
var drag_coefficient = 10 / 100000;
  • system: our particle manager.
  • acc_Slider: a slider to dynamically tweak particle acceleration.
  • acc_coefficient: this is what the slider controls.
  • Other constants define speed, drag, and how long each particle lives.

2. Setting up the Canvas and Slider

We create a canvas and attach a slider for real-time acceleration control:

function setup() {
  const parentWidth = document.getElementById('sketch-holder').offsetWidth;
  const canvas = createCanvas(parentWidth, parentWidth * 0.5);
  canvas.parent('sketch-holder');

  acc_Slider = createSlider(0, 0.1, 0.01, 0.001);
  acc_Slider.parent('slider-holder');

  system = new ParticleSystem();
  clear();
}
  • The canvas scales with the container (but only checks the size when the page is reloaded).
  • The slider appears below the canvas and ranges from 0 to 0.1.
  • A ParticleSystem instance is born. We'll dive into that shortly.

3. Main Loop – draw()

In each frame, we:

  • Read the slider value.
  • Clear the screen.
  • Spawn 8 new particles.
  • Run the system.
function draw() {
  acc_coefficient = acc_Slider.value();
  clear();
  for (let i = 0; i < 8; i++) {
    system.addParticle();
  }
  system.run();
}

This keeps the sketch alive, responsive, and delightfully chaotic.


4. Particle Lifecycle: Born, Live, Die

Each Particle is an object and has its own internal logic that handles the laws of physics. A partical has a state consisting of four parameters: life, position, acceleration and velocity. When a Particle instance is created, it is assigned a remaining life of lifespan, a random velocity (in the x-y plane) and 0 acceleration.

var Particle = function(position) {
  this.acceleration = createVector(0, 0);
  this.velocity = createVector(random(-init_v_max, 0), random(-init_v_max / 10, init_v_max / 10));
  this.position = position.copy();
  this.life = lifespan;
};

In update() we define how acceleration evolves:

Particle.prototype.update = function() {
  if (this.life / lifespan > 0.66) {
    this.acceleration = createVector(-0.05, 0); // Birth
  } else if (this.life / lifespan > 0.33) {
    this.acceleration = createVector(acc_coefficient * (width / 2 - this.position.x), 0); // Life
  } else {
    this.acceleration = createVector(-0.5, 0); // Death
  }

  this.velocity.add(this.acceleration);
  this.drag = p5.Vector.mult(this.velocity, -drag_coefficient * (lifespan - this.life));
  this.velocity.add(this.drag);
  this.position.add(this.velocity);
  this.life -= 2;
};

And the visual:

Particle.prototype.display = function() {
  stroke(256, 256);
  strokeWeight(0);
  fill((lifespan - this.life) * 256 / lifespan, 0, this.life * 256 / lifespan, 256);
  ellipse(this.position.x, this.position.y, 3, 3);
};

Particles fade as they die, their color shifting from blue to red as their life parameter reduces towards 0.


5. Managing the Swarm

The ParticleSystem class spawns and cleans up:

var ParticleSystem = function() {
  this.particles = [];
};

ParticleSystem.prototype.addParticle = function() {
  this.particles.push(new Particle(createVector(width, random(0, height))));
};

ParticleSystem.prototype.run = function() {
  for (var i = this.particles.length - 1; i >= 0; i--) {
    var p = this.particles[i];
    p.run();
    if (p.isDead()) {
      this.particles.splice(i, 1);
    }
  }
};

No ghosts, no clutter—just ephemeral motion.


Conclusion

This project is a dance of code and control: particles come to life, react to your hand via the slider, then vanish into the ether. Whether you’re new to p5.js or refining your generative art toolkit, this sketch invites you to tweak, tinker, and transform it into something your own.


If you're interested in making your version interactive, visual, or even musical—consider hooking up more sliders or audio input. The sky isn’t the limit—your imagination is.

Explore the rest of my posts.