Programming

2024

Mini-rust in Rust 008: Refactoring our parser -

Mini-rust in Rust 007: Evaluating an operation -

Mini-rust in Rust 006: Parsing an operation -

Mini-rust in Rust 005: Making our lexer an iterator -

Mini-rust in Rust 004: Refactoring our lexer -

Mini-rust in Rust 003: Much prettier errors -

Mini-rust in Rust 002: Errors while lexing -

Mini-rust in Rust 001: Lexing an int -

Rust 101 - 53: Exercises for module G (q4) -

Rust 101 - 52: Exercises for module G (q3) -

Rust 101 - 51: Exercises for module G (q2) -

Rust 101 - 50: Exercises for module G (q1) -

Rust 101 - 49: Foreign function interfaces (interacting with other languages) -

Rust 101 - 48: Exercises for module F (q3) -

Rust 101 - 47: Exercises for module F (q2) -

Rust 101 - 46: Exercises for module F (q1) -

Rust 101 - 45: Unsafe types and examples -

Rust 101 - 44: Undefined behaviour -

Rust 101 - 43: The two meanings of "unsafe" in Rust -

Rust 101 - 42: Why do we need unsafe? -

Rust 101 - 41: Exercises for module E (q2b) -

Rust 101 - 40: Exercises for module E (q2a) -

Rust 101 - 39: Exercises for module E (q1b) -

Rust 101 - 38: Exercises for module E (q1a) -

Rust 101 - 37: Async runtimes -

Rust 101 - 36: What async and await really do -

Rust 101 - 35: Futures -

Rust 101 - 34: What is async? -

Rust 101 - 33: Exercises for module D (q3) -

Rust 101 - 32: Exercises for module D (q2) -

Rust 101 - 31: Exercises for module D (q1) -

Rust 101 - 30: Good patterns and not so good -

Rust 101 - 29: Trait objects and object safety -

Rust 101 - 28: Dynamic dispatch -

Rust 101 - 27: Exercises for module C (q2) -

Rust 101 - 26: Exercises for module C (q1) -

Rust 101 - 25: Threads, Mutexes, channels, Send and Sync -

Rust 101 - 24: Parallelism and Rayon -

Rust 101 - 23 Exercises for module B (q3) -

Rust 101 - 22 Exercises for module B (q2) -

Rust 101 - 21 Exercises for module B (q1) -

Rust 101 - 20: Unit, integration and benchmark tests -

Rust 101 - 19: Creating a nice API -

Rust 101 - 18: Dependencies and Cargo.toml -

Rust 101 - 17: Exercises for module A3 (part 2) -

Rust 101 - 16: Exercises for module A3 (part 1) -

One import per line is best -

Rust 101 - 15: Lifetime bounds -

Rust 101 - 14: Some standard library traits -

Rust 101 - 13: Type Parameters and Associated Types -

[Fixed in FF 123] Deleting an Indexed DB store can be incredibly slow on Firefox -

Keep your Indexed DB keys and values small if you want good performance! -

Rust 101 - 9: Vecs, Boxes and slices -

Rust 101 - 8: Writing methods using impl blocks -

Rust 101 - 7: Error handling with panic and Result -

2023

Rust 101 - 6: Structs and Enums -

Rust 101 - 3: Memory and ownership -

Rust 101 - 2: Language basics -

Rust 101 - 1: Course intro -

Combining two function types with & (ampersand) in TypeScript (intersection) -

Accessing services on the host from a Docker container or a Podman one -

Rust WASM hello world - no need for webpack! -

Estimating software tasks and stories: avoid time-based estimates -

Live code reviews make life better -

2022

Setting the text selection in a browser: just use setBaseAndExtent -

Tips for contenteditables -

Matrix is a Distributed Real-time Database Video -

Building cross-platform Rust for Web, Android and iOS - a minimal example -

2021

Providing MapLibre-compatible style JSON from openstreetmap-tile-server -

Self-hosting maps on my laptop -

Streaming to Twitch and PeerTube simultaneously using nginx on Oracle cloud -

New game: Tron - frantic multiplayer retro action -

New Job at Element (Matrix) -

What to cache when building Rust using Gitlab CI or similar -

Printing the version of a Maven project -

Minimal example of a Maven pom for a mixed Kotlin and Java project -

Importing/migrating from one peertube server to another -

Why write an entire game (including Graphics) in a single, hand-coded JavaScript file? -

Writing Snake in Terraform Video -

Suspending the computer using Kupfer -

Uploading to PeerTube from the command line -

Republishing Bartosz Milewski's Category Theory lectures -

Announcing I-DUNNO 1.0 and web-i-dunno -

Automatically filling in the UK COVID test results page with Selenium IDE -

Questions about RFC 8771 -

Announcing Rust I-DUNNO -

Limiting the number of open sockets in a tokio-based TCP listener -

Is your program a function or a service? -

2020

Shutdown order consistency: how Rust helps -

Edge computing providers -

Schema upgrades should be reversible (also other transformations, actually) -

Announcing Smolpxl Scores - a high score table for your game -

Profile a Java unit test (very quickly, with no external tools) -

Why a Free Software web games site? -

Code your first game: Snake in JavaScript (on Raspberry Pi) -

Play and create little retro games at Smolpxl -

shareon.js.org now has a Share to Mastodon button -

Coding a tiny game in JavaScript video -

short - command line tool to truncate lines to fit in the terminal -

How to send an SMS using netcat (via SMPP) -

Example Android project with repeatable tests running inside an emulator -

Creating a tiny Docker image of a Rust project -

Keeping track of podcast times with a simple bash script on Linux -

Custom Bash tab completion for my program -

Struggling with Rust to figure out the right types for a function signature -

React Concepts Video -

2019

Dependency Injection frameworks: reasons to avoid them video -

Coding workshop example worksheets -

Building an all-in-one Jar in Gradle with the Kotlin DSL -

Creating a self-signed certificate for Apache and connecting to it from Java -

ACCU Talk "How Kotlin makes your Java code better" -

ACCU Talk "How Git really works" -

Examples of Kotlin making your Java code better video -

What is a Monad? Video -

Scheduling a task in Java within a CompletableFuture -

Convert a video to a GIF with reasonable colours -

Python Async basics video (100 million HTTP requests) -

Keybase chat bot in 10 lines of bash -

Performance of Java 2D drawing operations (part 3: image opacity) -

Performance of Java 2D drawing operations (part 2: images) -

Performance of Java 2D drawing operations (part 1: types of operation) -

London Python Meetup January 2019 - Async Python and GeoPandas -

2018

Code Like a Girl T-shirts -

Interesting Characters (UTF-16, utf-8, Unicode, encodings) video -

Elm makes me happy (updated for Elm 0.19) video -

Godot: make new objects at runtime (instancing) video -

You must rewind your incoming buffer when you fail to encode a character in a CharsetEncoder or you'll get an IllegalArgumentException -

Godot: Dragging and dropping physics objects video -

Godot: 2D shapes bouncing off each other video -

Elm JSON decoder examples -

Worksheet: "Tell a story by making animations with code" -

My experience upgrading to Elm 0.19 -

Example of a systemd service file -

Installing Flarum on Ubuntu 18.04 -

How to write a programming language articles -

Clever Things People Do In Groovy So You Have To Know About Them video -

Ideas on how lexing will work in Pepper3 -

Questions and answers about Pepper3 -

2017

HTML5 CSS Toolbar + zoomable workspace that is mobile-friendly and adaptive -

Adding a day in Python datetimes - use timedelta, not the datetime constructor -

Broken Levels Challenge - Egham Raspberry Pi Jam July 2017 -

Running a virtualenv with a custom-built Python -

Adding a concurrency limit to Python's asyncio.as_completed -

"git what" is "git status" on steroids -

Making 100 million requests with Python aiohttp -

Python - printing UTC dates in ISO8601 format with time zone -

Python 3 - large numbers of tasks with limited concurrency -

How to write a programming language ACCU talk -

Iterating over the lines of a file in Java -

Raspberry Pi Jam "Chaos Car!" -

Resources for year 6 teachers on coding and programming -

2016

Writing a unit test in Elm -

How to write a programming language - Part 3, The Evaluator -

Basic Haskell project setup (unit tests, code, formatting) -

How to write a programming language - Part 2, The Parser -

Mousedown events delayed or sluggish on mobile -

How to write a programming language - Part 1, The Lexer -

Simple example of Netty 4 usage -

Elm resizeable SVG canvas filling the screen -

Ambiguous names in Java due to non-normalised unicode - but all OK in Python -

Snake in Python 3 + Qt 5 -

Elm Basics Video -

Elm makes me happy (old: Elm 0.17) -

What's new in Java 8 -

Which Raspberry Pi photo was funniest? -

Raspberry Pi Funniest Photo Game -

Snake in Elm -

2015

Finding the download count of GitHub releases -

Android: using a TextView to show rich text in an AlertDialog -

Difficult merges in Git - don't panic! -

Code for detecting when you leave an Android app -

Mocks are Bad, Layers are Bad -

Detecting whether an Android app is stopping (or starting) -

Order of Android Activity lifecycle events -

Snake in Dart -

Tweetable Art Code -

Treat warnings as errors in a (Gnu) Makefile -

Java game programming: image rendering hints make no difference to rendering time -

Snake in ZX Spectrum BASIC -

Encapsulation as passing on responsibility -

Snake in Ruby -

Batch-converting audio files to be louder (on Linux) -

Why Rabbit Escape is Open Source / Free Software -

How to make your own levels for Rabbit Escape -

Rabbit Escape v0.1 out now for Linux, Windows and Mac video -

Rabbit Escape (a bit like Lemmings) v0.1 released for Linux, Windows and Mac -

Snake in Groovy -

Programmatic equivalents of web.xml sections for Tomcat -

2014

Snowflake Christmas card web page on the Raspberry Pi -

Snowflake Christmas card in Scratch on the Raspberry Pi -

Encoding URLs in Java -

Android development - saving state -

Android development - Rabbit Escape really working on Android -

Showing urgent (flashing) windows on all desktop in LXDE's taskbar (window list) in Lubuntu -

Launch an urgent window using Python and Xlib with the UrgencyHint flag -

Android programming - a non-Android, Android Game -

Android programming - drawing bitmaps in a game loop -

Android programming - a menu using Activities and Intents -

Raspberry Pi Minecraft Python summer project screenshots -

Android programming - setting up Android Studio -

Absolute Truth in programming languages -

Options for code reviews with Git -

Best GCC warning flags for compiling C++ -

What is node.js? -

A mini mocking framework -

Simple template programming -

Five Quines video -

OpenID security in a REST API -

Does test-driven development harm clarity? -

Token-based security in a REST API -

Avoid mocks by refactoring to functional -

Using the final keyword in interface method parameters does nothing -

Security in a REST API -

Searching in a REST API -

2013

Paging in a REST API -

A Basic REST API -

Avoid backslashes anywhere in Java code (Java error "illegal unicode escape") -

What is REST? -

Bash arrays -

Using if:set, unless:set etc. with macrodefs in Ant -

Using if:set, unless:set etc. to execute a task conditionally in Ant -

Vim for Fun -

Working with others in git -

Merging in git -

Behaviour of Java String.split() when some answers are the empty string -

Checking the case of a filename on Windows -

Branches in git -

Passing several values through a pipe in bash -

Goodness in programming languages, part 4 - Ownership & Memory -

How to use git (the basics) -

setUp and tearDown considered harmful -

Why use git for source control? -