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 - 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) -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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
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 -
Godot: Dragging and dropping physics objects video -
Godot: 2D shapes bouncing off each other video -
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
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 -
Elm makes me happy (old: Elm 0.17) -
Which Raspberry Pi photo was funniest? -
Raspberry Pi Funniest Photo Game -
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 -
Treat warnings as errors in a (Gnu) Makefile -
Java game programming: image rendering hints make no difference to rendering time -
Encapsulation as passing on responsibility -
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 -
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 -
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++ -
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 -
2013
Avoid backslashes anywhere in Java code (Java error "illegal unicode escape") -
Using if:set, unless:set etc. with macrodefs in Ant -
Using if:set, unless:set etc. to execute a task conditionally in Ant -
Behaviour of Java String.split() when some answers are the empty string -
Checking the case of a filename on Windows -
Passing several values through a pipe in bash -
Goodness in programming languages, part 4 - Ownership & Memory -