77 Categories
[ACCU]9 [Android]24 [Ant]3 [Async programming]2 [bash]8 [BOOST]4 [C]48 [Cloud]1 [Diffident]2 [Docker]7 [Dojo]2 [Elm]9 [FreeGuide]27 [Games]44 [git]18 [GNOME]7 [Godot]3 [Gradle]3 [Graft]3 [Groovy]3 [GSSMP]6 [Haskell]2 [IGCC]1 [j2ee]1 [Java]77 [JavaScript]28 [JSON]2 [Keybase]1 [Kotlin]5 [Lean and Agile]5 [Linux]13 [Lisp]19 [Loki]2 [Lubuntu]6 [MATE]2 [Matrix]9 [Maven]2 [Meta]7 [Metaprogramming]8 [Minecraft]1 [Misc]20 [My First Raspberry Pi Game]13 [NNDB]2 [PeerTube]4 [Pepper]4 [Performance]19 [PHP]2 [Pinephone]1 [Podman]1 [Programming]232 [Programming Languages]128 [Python]60 [Rabbit Escape]17 [Raspberry Pi]21 [React]1 [Record TV]2 [Regular Expressions]1 [rest]8 [ruby]2 [Rust]74 [Scheme]22 [Scratch]1 [Scrum]1 [Smolpxl]3 [SQL]1 [STL]10 [systemd]1 [Tech]412 [Template Metaprogramming]4 [Test Driven]25 [TypeScript]3 [Ubuntu]4 [Uncategorized]18 [Videos]149 [vim]4 [Writing]11 [Xfce]1
ACCU
How to write a programming language articles -
Blog aggregator/planet in WordPress using FeedWordPress -
How to write a programming language ACCU talk -
A story about magic and how we treat each other -
Mocks are Bad, Layers are Bad -
Best GCC warning flags for compiling C++ -
C++14 "Terse" Templates - an argument against the proposed syntax -
Android
Building cross-platform Rust for Web, Android and iOS - a minimal example -
Example Android project with repeatable tests running inside an emulator -
Rabbit Escape 0.12 out now, with water -
Make Android Gradle display unit test failure messages -
Automated UI tests on Android -
Submitting a package to F-Droid -
Android: using a TextView to show rich text in an AlertDialog -
Rabbit Escape out now on Android! -
Code for detecting when you leave an Android app -
Detecting whether an Android app is stopping (or starting) -
Order of Android Activity lifecycle events -
Rabbit Escape 0.3.1 - now with zoom! -
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 -
Android development - saving state -
Android development - Rabbit Escape really working on Android -
Android programming - a non-Android, Android Game -
Android programming - drawing bitmaps in a game loop -
Android programming - a menu using Activities and Intents -
Android programming - setting up Android Studio -
Entertain your baby using your Android phone -
Ant
Using if:set, unless:set etc. with macrodefs in Ant -
Using if:set, unless:set etc. to execute a task conditionally in Ant -
Everybody loves build.xml (test-driven Ant) -
Async programming
Rust 101 - 24: Parallelism and Rayon -
Limiting the number of open sockets in a tokio-based TCP listener -
bash
Keeping track of podcast times with a simple bash script on Linux -
Custom Bash tab completion for my program -
Convert a video to a GIF with reasonable colours -
Keybase chat bot in 10 lines of bash -
Batch-converting audio files to be louder (on Linux) -
Passing several values through a pipe in bash -
Bash associative array examples -
BOOST
Anatomy of an interpreter: the Parser -
NNDB 0.1 -
C
Showing urgent (flashing) windows on all desktop in LXDE's taskbar (window list) in Lubuntu -
Goodness in programming languages, part 4 - Ownership & Memory -
Goodness in programming languages, part 3 " not doing the same thing more than once -
Goodness in programming languages, part 2 " getting your code running -
IGCC - a real-eval-print loop for C/C++ -
Finally released last.fm support for GSSMP -
C++ iterator wrapping a stream not 1-1 -
C++ iterator wrapper/adaptor example -
C++ iterator example (and an iterable range) -
Absolute Truth in programming languages -
Best GCC warning flags for compiling C++ -
Avoid mocks by refactoring to functional -
Goodness in programming languages, part 4 - Ownership & Memory -
C++14 "Terse" Templates - an argument against the proposed syntax -
Goodness in programming languages, part 3 " not doing the same thing more than once -
Tail Call Optimisation in C++ - lightning talk video -
Tail Call Optimisation in C++ published in Overload journal -
Generalising tail call optimised C++ -
Performance of tail call optimised C++ -
Tail call optimisation in C++ -
Lighting talk - Tail call optimisation in C++ -
Goodness in programming languages, part 2 " getting your code running -
Anatomy of an interpreter: the Evaluator -
Anatomy of an interpreter: the Parser -
Anatomy of an interpreter: the Lexer -
Subs Scheme Lisp Interpreter -
Don't design for performance until it's too late -
NNDB 0.1 -
Firefox keyword search for finding C++ keywords -
IGCC - a real-eval-print loop for C/C++ -
Debugging memory use and fragmentation on Windows using Address Space Monitor -
Cloud
Streaming video with Owncast on a free Oracle Cloud computer -
Diffident
Diffident - command line side-by-side diff editor -
Docker
Accessing services on the host from a Docker container or a Podman one -
Creating a tiny Docker image of a Rust project -
Build with a different Java version (e.g. 11) using Docker -
Run bash inside any version of Linux using Docker -
ZX Spectrum BASIC Web Server -
Changing the Docker daemon options in systemd on Ubuntu 15.04 -
Docker fails to start on Ubuntu 15.04 -
Dojo
Running Dojo DOH tests in a browser without a web server -
Running Dojo 1.7+ DOH unit tests on the command line with Rhino -
Elm
Elm makes me happy (updated for Elm 0.19) video -
My experience upgrading to Elm 0.19 -
Mousedown events delayed or sluggish on mobile -
Elm resizeable SVG canvas filling the screen -
Elm makes me happy (old: Elm 0.17) -
FreeGuide
An actual difficult bug fixed -
Public bzr branch of FreeGuide -
FreeGuide updated to latest XMLTV, and bug fixes -
FreeGuide - putting recording on hold -
(Badly wrong) usage statistics for FreeGuide -
Another FreeGuide release candidate -
FreeGuide 0.10.4 release candidate -
FreeGuide source layout (and SVN migration) -
Donation -
FreeGuide packaging and plugins -
What is going on with FreeGuide? -
Games
New game: Tron - frantic multiplayer retro action -
Why write an entire game (including Graphics) in a single, hand-coded JavaScript file? -
Making Smolpxl work on phones and tablets -
Streaming video with Owncast on a free Oracle Cloud computer -
Make levels for Rabbit Escape using the level editor! -
Announcing Smolpxl Scores - a high score table for your game -
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 -
Coding a tiny game in JavaScript video -
Rabbit Escape 0.12 out now, with water -
Godot: make new objects at runtime (instancing) video -
Godot: Dragging and dropping physics objects video -
Godot: 2D shapes bouncing off each other video -
Recording gameplay videos on RetroPie -
Elm resizeable SVG canvas filling the screen -
Rabbit Escape 0.3.1 - now with zoom! -
Java game programming: image rendering hints make no difference to rendering time -
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 -
Android programming - drawing bitmaps in a game loop -
Android programming - a menu using Activities and Intents -
Android programming - setting up Android Studio -
My First Raspberry Pi Game " Part 12 " Scoring, done! -
My First Raspberry Pi Game " Part 11 " Being less rude -
My First Raspberry Pi Game " Part 09 " Lots more words -
My First Raspberry Pi Game " Part 08 " Success and failure -
Entertain your baby using your Android phone -
Prince of Persia - The Sands of Time -
git
ACCU Talk "How Git really works" -
Deleting commits from the git history -
"git what" is "git status" on steroids -
New open source project on work time - git-history-data -
Difficult merges in Git - don't panic! -
Options for code reviews with Git -
What git server should I use? -
Passing several values through a pipe in bash -
Why use git for source control? -
Diffident - command line side-by-side diff editor -
Public bzr branch of FreeGuide -
GNOME
Toggle window decorations on Linux GTK3 with Python3 -
Desktop sharing not working in Lubuntu 14.04 -
rdesktop swallows keyboard events -
Reclaiming desktop space with Ubuntu's window-picker-applet -
Switching workspace in GNOME via the command line -
Fixing the vertical panel window list on Ubuntu Hardy -
Godot
Godot: make new objects at runtime (instancing) video -
Godot: Dragging and dropping physics objects video -
Godot: 2D shapes bouncing off each other video -
Gradle
Gradle: what is a task, and how can I make a task depend on another task? -
Clever Things People Do In Groovy So You Have To Know About Them video -
Make Android Gradle display unit test failure messages -
Graft
Graft Animation Language on Raspberry Pi -
Worksheet: "Tell a story by making animations with code" -
Example of a systemd service file -
Groovy
Gradle: what is a task, and how can I make a task depend on another task? -
Clever Things People Do In Groovy So You Have To Know About Them video -
GSSMP
Finally released last.fm support for GSSMP -
Haskell
Basic Haskell project setup (unit tests, code, formatting) -
IGCC
IGCC - a real-eval-print loop for C/C++ -
j2ee
Programmatic equivalents of web.xml sections for Tomcat -
Java
Printing the version of a Maven project -
Minimal example of a Maven pom for a mixed Kotlin and Java project -
Shutdown order consistency: how Rust helps -
Profile a Java unit test (very quickly, with no external tools) -
Example Android project with repeatable tests running inside an emulator -
KotlinJS: First impressions (formed by writing Snake) video -
Dependency Injection frameworks: reasons to avoid them video -
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" -
Examples of Kotlin making your Java code better video -
Build with a different Java version (e.g. 11) using Docker -
Scheduling a task in Java within a CompletableFuture -
Gradle: what is a task, and how can I make a task depend on another task? -
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) -
maven-assembly-plugin descriptor for a simple tarball with dependencies -
Make Android Gradle display unit test failure messages -
Iterating over the lines of a file in Java -
Setting up a sane Maven project -
Simple example of Netty 4 usage -
Ambiguous names in Java due to non-normalised unicode - but all OK in Python -
How to analyse a .phd heap dump from an IBM JVM -
Java HTTPS to a server with a self-signed certificate -
Code for detecting when you leave an Android app -
Rabbit Escape 0.3.1 - now with zoom! -
Java game programming: image rendering hints make no difference to rendering time -
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 -
JAX-RS (using Apache CXF) in embedded Tomcat example -
Using hexdump to represent a binary file in Java source code -
Android development - saving state -
Android development - Rabbit Escape really working on Android -
Android programming - a non-Android, Android Game -
Android programming - drawing bitmaps in a game loop -
Android programming - a menu using Activities and Intents -
Android programming - setting up Android Studio -
Avoid mocks by refactoring to functional -
Using the final keyword in interface method parameters does nothing -
Avoid backslashes anywhere in Java code (Java error "illegal unicode escape") -
Behaviour of Java String.split() when some answers are the empty string -
Checking the case of a filename on Windows -
Goodness in programming languages, part 4 - Ownership & Memory -
setUp and tearDown considered harmful -
Everybody loves build.xml (test-driven Ant) -
Everybody hates build.xml (code reuse in Ant) -
Dry run mode for Ant (ant -n, ant --dry-run) -
Launching an OSGi app on the command line -
Goodness in programming languages, part 3 " not doing the same thing more than once -
Goodness in programming languages, part 2 " getting your code running -
Entertain your baby using your Android phone -
An actual difficult bug fixed -
Public bzr branch of FreeGuide -
FreeGuide updated to latest XMLTV, and bug fixes -
FreeGuide - putting recording on hold -
(Badly wrong) usage statistics for FreeGuide -
JavaScript
[Fixed in FF 123] Deleting an Indexed DB store can be incredibly slow on Firefox -
Don't store normal arrays of numbers in Indexed DB - use UInt8Array instead -
Keep your Indexed DB keys and values small if you want good performance! -
Setting the text selection in a browser: just use setBaseAndExtent -
New game: Tron - frantic multiplayer retro action -
Why write an entire game (including Graphics) in a single, hand-coded JavaScript file? -
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 -
KotlinJS: First impressions (formed by writing Snake) video -
Mousedown events delayed or sluggish on mobile -
Simple example of Netty 4 usage -
Elm resizeable SVG canvas filling the screen -
Elm makes me happy (old: Elm 0.17) -
Snowflake Christmas card web page on the Raspberry Pi -
Is it ok to represent dates as Unix time (seconds since the epoch) in JSON? -
Running Dojo DOH tests in a browser without a web server -
Running Dojo 1.7+ DOH unit tests on the command line with Rhino -
Goodness in programming languages, part 3 " not doing the same thing more than once -
JSON
Keybase chat bot in 10 lines of bash -
Is it ok to represent dates as Unix time (seconds since the epoch) in JSON? -
Keybase
Keybase chat bot in 10 lines of bash -
Kotlin
Minimal example of a Maven pom for a mixed Kotlin and Java project -
KotlinJS: First impressions (formed by writing Snake) video -
Building an all-in-one Jar in Gradle with the Kotlin DSL -
ACCU Talk "How Kotlin makes your Java code better" -
Examples of Kotlin making your Java code better video -
Lean and Agile
Diffident - command line side-by-side diff editor -
An actual difficult bug fixed -
Linux
Toggle window decorations on Linux GTK3 with Python3 -
Set the date (EXIF) of a photo on Linux -
Example of a systemd service file -
Installing Flarum on Ubuntu 18.04 -
Preventing Audacity from crashing when using PulseAudio -
Prediction result: corporate Linux -
Preventing Kupfer switching to existing windows -
Rabbit Escape 0.3.1 - now with zoom! -
Switching Xfce to use metacity -
fetchmail complaining about GoDaddy SSL certificate -
Rabbit Escape v0.1 out now for Linux, Windows and Mac video -
Lisp
Absolute Truth in programming languages -
Goodness in programming languages, part 3 " not doing the same thing more than once -
Tail Call Optimisation in C++ - lightning talk video -
Tail Call Optimisation in C++ published in Overload journal -
Scheme 4: Recursion - how to write functions in Scheme video -
Scheme 2: Basics - pairs and lists video -
Scheme 1: Feel the cool video -
Generalising tail call optimised C++ -
Scheme: pairs, lists and recursion -
Anatomy of an interpreter: the Evaluator -
Anatomy of an interpreter: the Parser -
Anatomy of an interpreter: the Lexer -
Subs Scheme Lisp Interpreter -
Loki
NNDB 0.1 -
Lubuntu
Disabling screensaver on LXDE -
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 -
Desktop sharing not working in Lubuntu 14.04 -
Using xscreensaver to lock the screen in Lubuntu -
MATE
Suspending the computer using Kupfer -
Allow drag-to-side, but not drag-to-top in Ubuntu MATE (Marco) -
Matrix
Message order in Matrix: right now, we are deliberately inconsistent -
Elected to the Matrix Foundation Governing Board! -
Standing for the Matrix Governing Board -
IETF115 Trip Report (Can Matrix help messaging standardisation through MIMI?) -
Outreachy August 2022 update -
Matrix is a Distributed Real-time Database Video -
Comparison of Matrix events before and after "Extensible Events" -
Providing MapLibre-compatible style JSON from openstreetmap-tile-server -
Maven
Minimal example of a Maven pom for a mixed Kotlin and Java project -
maven-assembly-plugin descriptor for a simple tarball with dependencies -
Meta
Heartfelt apologies for the feed URL change -
DIYBlog -
RSS -
Metaprogramming
Goodness in programming languages, part 3 " not doing the same thing more than once -
Scheme 1: Feel the cool video -
Minecraft
Raspberry Pi Minecraft Python summer project screenshots -
Misc
New Baby -
Caution: numbers that feel prime may be divisible by 3 -
I spawn -
London -
The dangers of learning to code -
Honestly my last post about my viva -
Mnemonic -
My First Raspberry Pi Game
Resources for year 6 teachers on coding and programming -
My First Raspberry Pi Game " Part 12 " Scoring, done! -
My First Raspberry Pi Game " Part 11 " Being less rude -
My First Raspberry Pi Game " Part 10 " Red square -
My First Raspberry Pi Game " Part 09 " Lots more words -
My First Raspberry Pi Game " Part 08 " Success and failure -
My First Raspberry Pi Game " Part 07 " A green circle -
My First Raspberry Pi Game " Part 06 " A better class of waiting -
My First Raspberry Pi Game " Part 05 " Say something -
My First Raspberry Pi Game " Part 04 " A small black screen -
My First Raspberry Pi Game " Part 03 " It's like a magic spell -
My First Raspberry Pi Game " Part 02 " Saying hello -
My First Raspberry Pi Game - Part 01 - Before we start -
NNDB
NNDB 0.1 -
PeerTube
Importing/migrating from one peertube server to another -
Uploading to PeerTube from the command line -
Python Async basics video (100 million HTTP requests) -
Migrating videos from YouTube to PeerTube inside a Docker container -
Pepper
Ideas on how lexing will work in Pepper3 -
Questions and answers about Pepper3 -
Performance
Rust 101 - 23 Exercises for module B (q3) -
[Fixed in FF 123] Deleting an Indexed DB store can be incredibly slow on Firefox -
Don't store normal arrays of numbers in Indexed DB - use UInt8Array instead -
Keep your Indexed DB keys and values small if you want good performance! -
Python Async basics video (100 million HTTP requests) -
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) -
Adding a concurrency limit to Python's asyncio.as_completed -
Making 100 million requests with Python aiohttp -
Python 3 - large numbers of tasks with limited concurrency -
Basic ideas of Python 3 asyncio concurrency -
Java game programming: image rendering hints make no difference to rendering time -
Tail Call Optimisation in C++ - lightning talk video -
Tail Call Optimisation in C++ published in Overload journal -
Generalising tail call optimised C++ -
Don't design for performance until it's too late -
Separate regular expressions, or one more complex one? -
PHP
Announcing Smolpxl Scores - a high score table for your game -
Installing Flarum on Ubuntu 18.04 -
Pinephone
Podman
Accessing services on the host from a Docker container or a Podman one -
Programming
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 -
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 -
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 -
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? -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
setUp and tearDown considered harmful -
Why use git for source control? -
Programming Languages
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 - 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 -
Rust 101 - 6: Structs and Enums -
Rust 101 - 3: Memory and ownership -
Rust 101 - 2: Language basics -
Maths: The Fun Parts - Sets video -
Writing Snake in Terraform Video -
Republishing Bartosz Milewski's Category Theory lectures -
Shutdown order consistency: how Rust helps -
Struggling with Rust to figure out the right types for a function signature -
ACCU Talk "How Kotlin makes your Java code better" -
Examples of Kotlin making your Java code better video -
London Python Meetup January 2019 - Async Python and GeoPandas -
Elm makes me happy (updated for Elm 0.19) video -
Godot: Dragging and dropping physics objects video -
Godot: 2D shapes bouncing off each other video -
Graft Animation Language on Raspberry Pi -
Worksheet: "Tell a story by making animations with code" -
My experience upgrading to Elm 0.19 -
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 -
TECH(K)NOW Day workshop on "Writing a programming language" -
Adding a concurrency limit to Python's asyncio.as_completed -
Basic ideas of Python 3 asyncio concurrency -
How to write a programming language ACCU talk -
Iterating over the lines of a file in Java -
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 -
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) -
ZX Spectrum BASIC Web Server -
Absolute Truth in programming languages -
Using the final keyword in interface method parameters does nothing -
Goodness in programming languages, part 4 - Ownership & Memory -
C++14 "Terse" Templates - an argument against the proposed syntax -
My First Raspberry Pi Game " Part 07 " A green circle -
My First Raspberry Pi Game " Part 06 " A better class of waiting -
My First Raspberry Pi Game " Part 05 " Say something -
My First Raspberry Pi Game " Part 04 " A small black screen -
My First Raspberry Pi Game " Part 03 " It's like a magic spell -
My First Raspberry Pi Game " Part 02 " Saying hello -
My First Raspberry Pi Game - Part 01 - Before we start -
Bash associative array examples -
Goodness in programming languages, part 3 " not doing the same thing more than once -
Tail Call Optimisation in C++ - lightning talk video -
Tail Call Optimisation in C++ published in Overload journal -
Scheme 4: Recursion - how to write functions in Scheme video -
Scheme 2: Basics - pairs and lists video -
Scheme 1: Feel the cool video -
Generalising tail call optimised C++ -
Performance of tail call optimised C++ -
Tail call optimisation in C++ -
Lighting talk - Tail call optimisation in C++ -
Scheme: pairs, lists and recursion -
Goodness in programming languages, part 2 " getting your code running -
Goodness in programming languages, part 1 - syntax and layout -
Anatomy of an interpreter: the Lexer -
Python
Suspending the computer using Kupfer -
Toggle window decorations on Linux GTK3 with Python3 -
Python Async basics video (100 million HTTP requests) -
London Python Meetup January 2019 - Async Python and GeoPandas -
Graft Animation Language on Raspberry Pi -
Example of a systemd service file -
How to write a programming language articles -
TECH(K)NOW Day workshop on "Writing a programming language" -
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 -
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 -
Basic ideas of Python 3 asyncio concurrency -
How to write a programming language ACCU talk -
Iterating over the lines of a file in Java -
Raspberry Pi Jam "Chaos Car!" -
How to write a programming language - Part 3, The Evaluator -
How to write a programming language - Part 2, The Parser -
How to write a programming language - Part 1, The Lexer -
Ambiguous names in Java due to non-normalised unicode - but all OK in Python -
Which Raspberry Pi photo was funniest? -
Raspberry Pi Funniest Photo Game -
Launch an urgent window using Python and Xlib with the UrgencyHint flag -
Raspberry Pi Minecraft Python summer project screenshots -
Absolute Truth in programming languages -
OpenID security in a REST API -
Token-based security in a REST API -
Goodness in programming languages, part 4 - Ownership & Memory -
My First Raspberry Pi Game " Part 12 " Scoring, done! -
My First Raspberry Pi Game " Part 11 " Being less rude -
My First Raspberry Pi Game " Part 10 " Red square -
My First Raspberry Pi Game " Part 09 " Lots more words -
My First Raspberry Pi Game " Part 08 " Success and failure -
My First Raspberry Pi Game " Part 07 " A green circle -
My First Raspberry Pi Game " Part 06 " A better class of waiting -
My First Raspberry Pi Game " Part 05 " Say something -
My First Raspberry Pi Game " Part 04 " A small black screen -
My First Raspberry Pi Game " Part 03 " It's like a magic spell -
My First Raspberry Pi Game " Part 02 " Saying hello -
My First Raspberry Pi Game - Part 01 - Before we start -
Goodness in programming languages, part 3 " not doing the same thing more than once -
What timezone Python thinks I'm in -
Goodness in programming languages, part 2 " getting your code running -
Goodness in programming languages, part 1 - syntax and layout -
My Address Book 1.9.0 - rewritten from scratch -
Separate regular expressions, or one more complex one? -
Rabbit Escape
Make levels for Rabbit Escape using the level editor! -
Rabbit Escape 0.12 out now, with water -
Performance of Java 2D drawing operations (part 2: images) -
Performance of Java 2D drawing operations (part 1: types of operation) -
Installing Flarum on Ubuntu 18.04 -
Automated UI tests on Android -
Submitting a package to F-Droid -
Rabbit Escape out now on Android! -
Code for detecting when you leave an Android app -
Detecting whether an Android app is stopping (or starting) -
Rabbit Escape 0.3.1 - now with zoom! -
Java game programming: image rendering hints make no difference to rendering time -
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 -
Raspberry Pi
Graft Animation Language on Raspberry Pi -
Worksheet: "Tell a story by making animations with code" -
Recording gameplay videos on RetroPie -
Broken Levels Challenge - Egham Raspberry Pi Jam July 2017 -
Raspberry Pi Jam "Chaos Car!" -
Which Raspberry Pi photo was funniest? -
Raspberry Pi Funniest Photo Game -
Snowflake Christmas card web page on the Raspberry Pi -
Snowflake Christmas card in Scratch on the Raspberry Pi -
Raspberry Pi Minecraft Python summer project screenshots -
My First Raspberry Pi Game " Part 12 " Scoring, done! -
My First Raspberry Pi Game " Part 11 " Being less rude -
My First Raspberry Pi Game " Part 10 " Red square -
My First Raspberry Pi Game " Part 09 " Lots more words -
My First Raspberry Pi Game " Part 08 " Success and failure -
My First Raspberry Pi Game " Part 05 " Say something -
My First Raspberry Pi Game " Part 04 " A small black screen -
My First Raspberry Pi Game " Part 03 " It's like a magic spell -
My First Raspberry Pi Game " Part 02 " Saying hello -
My First Raspberry Pi Game - Part 01 - Before we start -
React
Record TV
CBeebies and other channels not working with mplayer -
Regular Expressions
Separate regular expressions, or one more complex one? -
rest
JAX-RS (using Apache CXF) in embedded Tomcat example -
OpenID security in a REST API -
Token-based security in a REST API -
ruby
Absolute Truth in programming languages -
Rust
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 - 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 -
Rust 101 - 11: Exercises for module A2 -
Rust 101 - 9: Vecs, Boxes and slices -
Rust 101 - 8: Writing methods using impl blocks -
Rust 101 - 7: Error handling with panic and Result -
Rust 101 - 6: Structs and Enums -
Rust 101 - 4: Exercises for module A1 -
Rust 101 - 3: Memory and ownership -
Rust 101 - 2: Language basics -
Rust WASM hello world - no need for webpack! -
Building cross-platform Rust for Web, Android and iOS - a minimal example -
What to cache when building Rust using Gitlab CI or similar -
Announcing I-DUNNO 1.0 and web-i-dunno -
Limiting the number of open sockets in a tokio-based TCP listener -
Shutdown order consistency: how Rust helps -
short - command line tool to truncate lines to fit in the terminal -
Creating a tiny Docker image of a Rust project -
Struggling with Rust to figure out the right types for a function signature -
Questions and answers about Pepper3 -
Scheme
Absolute Truth in programming languages -
Goodness in programming languages, part 3 " not doing the same thing more than once -
Tail Call Optimisation in C++ - lightning talk video -
Tail Call Optimisation in C++ published in Overload journal -
Scheme 4: Recursion - how to write functions in Scheme video -
Scheme 2: Basics - pairs and lists video -
Scheme 1: Feel the cool video -
Generalising tail call optimised C++ -
Tail call optimisation in C++ -
Lighting talk - Tail call optimisation in C++ -
Scheme: pairs, lists and recursion -
Anatomy of an interpreter: the Evaluator -
Anatomy of an interpreter: the Parser -
Anatomy of an interpreter: the Lexer -
Scratch
Snowflake Christmas card in Scratch on the Raspberry Pi -
Scrum
Smolpxl
New game: Tron - frantic multiplayer retro action -
Why write an entire game (including Graphics) in a single, hand-coded JavaScript file? -
Making Smolpxl work on phones and tablets -
SQL
Examples of SQL join types (LEFT JOIN, INNER JOIN etc.) -
STL
Batch-converting audio files to be louder (on Linux) -
Tail Call Optimisation in C++ - lightning talk video -
Anatomy of an interpreter: the Parser -
Don't design for performance until it's too late -
NNDB 0.1 -
Firefox keyword search for finding C++ keywords -
IGCC - a real-eval-print loop for C/C++ -
systemd
Changing the Docker daemon options in systemd on Ubuntu 15.04 -
Tech
Mini-rust in Rust 008: Refactoring our parser -
Mini-rust in Rust 007: Evaluating an operation -
Mini-rust in Rust 006: Parsing an operation -
Message order in Matrix: right now, we are deliberately inconsistent -
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) -
Elected to the Matrix Foundation Governing Board! -
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 -
Why I won't link to AI resources -
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) -
Automated backups from Signal to Nextcloud -
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 -
Rust 101 - 11: Exercises for module A2 -
[Fixed in FF 123] Deleting an Indexed DB store can be incredibly slow on Firefox -
Don't store normal arrays of numbers in Indexed DB - use UInt8Array instead -
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 -
Follow this blog on the fediverse! -
Rust 101 - 6: Structs and Enums -
Rust 101 - 4: Exercises for module A1 -
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 -
Maths: The Fun Parts - Graphs video -
Maths: The Fun Parts - Groups video -
Maths: The Fun Parts - Sets video -
Live code reviews make life better -
Outreachy August 2022 update -
Transcoding video files for playback in a browser -
Matrix is a Distributed Real-time Database Video -
Building cross-platform Rust for Web, Android and iOS - a minimal example -
Improving my vimrc live on stream -
Comparison of Matrix events before and after "Extensible Events" -
Streaming to Twitch and PeerTube simultaneously using nginx on Oracle cloud -
New game: Tron - frantic multiplayer retro action -
Preventing Virgin Media hijacking my DNS -
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 -
Matrix is the only (chat) game in town -
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 -
Toggle window decorations on Linux GTK3 with Python3 -
Making Smolpxl work on phones and tablets -
Recommendation against the use of WhatsApp in your company -
Streaming video with Owncast on a free Oracle Cloud computer -
Is your program a function or a service? -
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 -
Dovecot not working after upgrade to Ubuntu 20.04.1 (dh key too small) -
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 -
Set the date (EXIF) of a photo on Linux -
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 -
Converting HTML slides to a PDF with Firefox -
Support the Software Freedom Conservancy -
KotlinJS: First impressions (formed by writing Snake) video -
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 -
Rabbit Escape 0.12 out now, with water -
Convert a video to a GIF with reasonable colours -
Python Async basics video (100 million HTTP requests) -
London Python Meetup January 2019 - Async Python and GeoPandas -
Run bash inside any version of Linux using Docker -
Windows missing from grub menu after Ubuntu install -
Interesting Characters (UTF-16, utf-8, Unicode, encodings) video -
Graft Animation Language on Raspberry Pi -
My experience upgrading to Elm 0.19 -
Bulk adding items to Wunderlist using wunderline on Ubuntu MATE -
Writing a new Flarum extension on Ubuntu -
Ubuntu "compose" key for easy unicode character input -
Redirecting all requests to https and www using .htaccess in Apache -
Example of a systemd service file -
Installing Flarum on Ubuntu 18.04 -
Connecting to Slack from an IRC client using slirc -
Using Matrix to connect to Slack from an IRC client on Ubuntu -
Clever Things People Do In Groovy So You Have To Know About Them video -
Examples of SQL join types (LEFT JOIN, INNER JOIN etc.) -
Fixing Slack emojis in HexChat -
Ideas on how lexing will work in Pepper3 -
Deleting commits from the git history -
Questions and answers about Pepper3 -
TECH(K)NOW Day workshop on "Writing a programming language" -
FileZilla with proxy not working with strange characters in the password -
HTML5 CSS Toolbar + zoomable workspace that is mobile-friendly and adaptive -
Broken Levels Challenge - Egham Raspberry Pi Jam July 2017 -
Women Who Code workshop on "Write your own programming language" -
Running a virtualenv with a custom-built Python -
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 -
Basic ideas of Python 3 asyncio concurrency -
C++ iterator wrapping a stream not 1-1 -
How to write a programming language ACCU talk -
C++ iterator wrapper/adaptor example -
C++ iterator example (and an iterable range) -
Make Android Gradle display unit test failure messages -
A story about magic and how we treat each other -
Automated UI tests on Android -
Submitting a package to F-Droid -
Resources for year 6 teachers on coding and programming -
Setting up a sane Maven project -
How to write a programming language - Part 3, The Evaluator -
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 -
Gracefully shutting down Firefox, to avoid the crash/session dialog -
Elm makes me happy (old: Elm 0.17) -
New open source project on work time - git-history-data -
Vim as editor for Claws Mail -
Avoiding postfix error "status=deferred (unable to look up host" -
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! -
ZX Spectrum BASIC Web Server -
Docker fails to start on Ubuntu 15.04 -
Preventing Audacity from crashing when using PulseAudio -
Code for detecting when you leave an Android app -
Mocks are Bad, Layers are Bad -
Prediction result: corporate Linux -
Detecting whether an Android app is stopping (or starting) -
Order of Android Activity lifecycle events -
Preventing Kupfer switching to existing windows -
Rabbit Escape 0.3.1 - now with zoom! -
Treat warnings as errors in a (Gnu) Makefile -
Encapsulation as passing on responsibility -
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 -
JAX-RS (using Apache CXF) in embedded Tomcat example -
Vim persistent buffer list combined with saved sessions -
LibreOffice spell check not working in Lubuntu -
Is it ok to represent dates as Unix time (seconds since the epoch) in JSON? -
Using hexdump to represent a binary file in Java source code -
Disabling screensaver on LXDE -
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 -
Don't use email auto-forwarding (emails will go missing) -
Fetchmail "mda" option makes emails bypass the spamassassin filter in postfix -
Android programming - a menu using Activities and Intents -
Android programming - setting up Android Studio -
Absolute Truth in programming languages -
Best GCC warning flags for compiling C++ -
What git server should I use? -
Renewing self-signed certificate for ejabberd -
OpenID security in a REST API -
avconv performance slow in Ubuntu 14.04 trusty -
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 -
Using xscreensaver to lock the screen in Lubuntu -
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 -
Using gnome-mplayer to play DVB radio without asking whether you want to resume -
C++14 "Terse" Templates - an argument against the proposed syntax -
setUp and tearDown considered harmful -
Why use git for source control? -
Set the volume in OpenBox/LXDE (or on the command line) with PulseAudio and Ubuntu -
Everybody loves build.xml (test-driven Ant) -
Everybody hates build.xml (code reuse in Ant) -
Dry run mode for Ant (ant -n, ant --dry-run) -
My First Raspberry Pi Game " Part 12 " Scoring, done! -
My First Raspberry Pi Game " Part 11 " Being less rude -
My First Raspberry Pi Game " Part 10 " Red square -
My First Raspberry Pi Game " Part 09 " Lots more words -
My First Raspberry Pi Game " Part 08 " Success and failure -
My First Raspberry Pi Game " Part 07 " A green circle -
Launching an OSGi app on the command line -
My First Raspberry Pi Game " Part 06 " A better class of waiting -
My First Raspberry Pi Game " Part 05 " Say something -
My First Raspberry Pi Game " Part 04 " A small black screen -
Length of Open Source licenses -
My First Raspberry Pi Game " Part 03 " It's like a magic spell -
My First Raspberry Pi Game " Part 02 " Saying hello -
My First Raspberry Pi Game - Part 01 - Before we start -
Running Dojo DOH tests in a browser without a web server -
Bash associative array examples -
Running Dojo 1.7+ DOH unit tests on the command line with Rhino -
Goodness in programming languages, part 3 " not doing the same thing more than once -
Tail Call Optimisation in C++ - lightning talk video -
Tail Call Optimisation in C++ published in Overload journal -
Scheme 4: Recursion - how to write functions in Scheme video -
Scheme 2: Basics - pairs and lists video -
Scheme 1: Feel the cool video -
Generalising tail call optimised C++ -
Performance of tail call optimised C++ -
Tail call optimisation in C++ -
Lighting talk - Tail call optimisation in C++ -
Scheme: pairs, lists and recursion -
What timezone Python thinks I'm in -
Freeview dvb-t scan gives "tuning failed!!!" after 18th April switchover -
Goodness in programming languages, part 2 " getting your code running -
Goodness in programming languages, part 1 - syntax and layout -
Ethernet not working on Ubuntu with Realtek RTL8111/8168B -
Entertain your baby using your Android phone -
rdesktop swallows keyboard events -
Reclaiming desktop space with Ubuntu's window-picker-applet -
Switching workspace in GNOME via the command line -
Anatomy of an interpreter: the Evaluator -
How to ask technical questions in person -
Ubuntu Lucid upgrade - a catalogue of disaster and pain -
Don't design for performance until it's too late -
Technorati appear to have broken openid delegation -
NNDB 0.1 -
CBeebies and other channels not working with mplayer -
Firefox keyword search for finding C++ keywords -
Flaws in the software patents system -
IGCC - a real-eval-print loop for C/C++ -
Diffident - command line side-by-side diff editor -
Separate regular expressions, or one more complex one? -
Fixing the vertical panel window list on Ubuntu Hardy -
An actual difficult bug fixed -
Public bzr branch of FreeGuide -
Finally released last.fm support for GSSMP -
lighttpd on Ubuntu - alias.url doesn't work when included in a module config file -
FreeGuide updated to latest XMLTV, and bug fixes -
FreeGuide - putting recording on hold -
(Badly wrong) usage statistics for FreeGuide -
Procmail Maildir messages disappearing -
lastfmsubmitd on Ubuntu Dapper -
Digital TV on Dapper with my Hauppauge WinTV Nova-T card -
Restoring a backup with Duplicity -
Remote encrypted backup with duplicity -
Creating .deb and RPM packages -
Another FreeGuide release candidate -
FreeGuide 0.10.4 release candidate -
A Quick and desperate introduction to data recovery -
Keyboard layout change in Ubuntu -
FreeGuide source layout (and SVN migration) -
Donation -
Setting up my ideal email system 4 -
Setting up my ideal email system 3 -
Setting up my ideal email system 2 -
Setting up my ideal email system -
Prince of Persia - The Sands of Time -
The dangers of learning to code -
Constantly changing passwords -
FreeGuide packaging and plugins -
DIYBlog -
RSS -
What is going on with FreeGuide? -
Google -
Template Metaprogramming
Goodness in programming languages, part 3 " not doing the same thing more than once -
NNDB 0.1 -
Test Driven
Profile a Java unit test (very quickly, with no external tools) -
Make Android Gradle display unit test failure messages -
Code for detecting when you leave an Android app -
Mocks are Bad, Layers are Bad -
Rabbit Escape (a bit like Lemmings) v0.1 released for Linux, Windows and Mac -
Android development - saving state -
Android development - Rabbit Escape really working on Android -
Android programming - a non-Android, Android Game -
Does test-driven development harm clarity? -
Avoid mocks by refactoring to functional -
setUp and tearDown considered harmful -
Everybody loves build.xml (test-driven Ant) -
Everybody hates build.xml (code reuse in Ant) -
Dry run mode for Ant (ant -n, ant --dry-run) -
Running Dojo DOH tests in a browser without a web server -
Running Dojo 1.7+ DOH unit tests on the command line with Rhino -
Anatomy of an interpreter: the Evaluator -
Anatomy of an interpreter: the Parser -
An actual difficult bug fixed -
TypeScript
[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! -
Combining two function types with & (ampersand) in TypeScript (intersection) -
Ubuntu
Installing Flarum on Ubuntu 18.04 -
Changing the Docker daemon options in systemd on Ubuntu 15.04 -
Docker fails to start on Ubuntu 15.04 -
Uncategorized
Choosing who to vote for in the 2024 UK General Election -
Letter to my MP: using starvation as a weapon -
Why I'm voting tactically against you - letter to my Conservative MP -
Air-Source Heat Pump - 1 year later -
Deporting desperate people from the UK -
Air-Source Heat Pump - our experience so far, 2 months in -
Letter to my MP about climate emergency -
Letter to my MP on the overseas aid budget. -
Letter to my MP on racism in the US and UK -
Poor performance in Chrome (especially on mobile) - caused by SVG background images -
Annual cost of clean water for every human -
Out-of-school education settings -
Assassination of individuals by the state -
Letter to my MP on UK government assassination of British Citizens in Syria -
Videos
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 -
New home for my videos: video.infosec.exchange -
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 -
Rust 101 - 11: Exercises for module A2 -
Rust 101 - 9: Vecs, Boxes and slices -
Rust 101 - 8: Writing methods using impl blocks -
Rust 101 - 7: Error handling with panic and Result -
Rust 101 - 6: Structs and Enums -
Rust 101 - 4: Exercises for module A1 -
Rust 101 - 3: Memory and ownership -
Rust 101 - 2: Language basics -
Maths: The Fun Parts - Graphs video -
Maths: The Fun Parts - Groups video -
Maths: The Fun Parts - Sets video -
Matrix is a Distributed Real-time Database Video -
Improving my vimrc live on stream -
Writing Snake in Terraform Video -
Republishing Bartosz Milewski's Category Theory lectures -
Streaming video with Owncast on a free Oracle Cloud computer -
Code your first game: Snake in JavaScript (on Raspberry Pi) -
Coding a tiny game in JavaScript video -
Keeping track of podcast times with a simple bash script on Linux -
Converting HTML slides to a PDF with Firefox -
KotlinJS: First impressions (formed by writing Snake) video -
Dependency Injection frameworks: reasons to avoid them video -
ACCU Talk "How Git really works" -
Python Async basics video (100 million HTTP requests) -
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 -
Migrating videos from YouTube to PeerTube inside a Docker container -
How to write a programming language - Part 3, The Evaluator -
How to write a programming language - Part 2, The Parser -
How to write a programming language - Part 1, The Lexer -
Basic Concepts of Christianity video -
Elm makes me happy (old: Elm 0.17) -
Difficult merges in Git - don't panic! -
Rabbit Escape out now on Android! -
How to make your own levels for Rabbit Escape -
Rabbit Escape v0.1 out now for Linux, Windows and Mac video -
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 -
Android programming - a non-Android, Android Game -
Android programming - drawing bitmaps in a game loop -
Android programming - a menu using Activities and Intents -
Android programming - setting up Android Studio -
OpenID security in a REST API -
Token-based security in a REST API -
Why use git for source control? -
Everybody loves build.xml (test-driven Ant) -
Everybody hates build.xml (code reuse in Ant) -
My First Raspberry Pi Game " Part 12 " Scoring, done! -
My First Raspberry Pi Game " Part 11 " Being less rude -
My First Raspberry Pi Game " Part 10 " Red square -
My First Raspberry Pi Game " Part 09 " Lots more words -
My First Raspberry Pi Game " Part 08 " Success and failure -
My First Raspberry Pi Game " Part 07 " A green circle -
My First Raspberry Pi Game " Part 06 " A better class of waiting -
My First Raspberry Pi Game " Part 05 " Say something -
My First Raspberry Pi Game " Part 04 " A small black screen -
My First Raspberry Pi Game " Part 03 " It's like a magic spell -
My First Raspberry Pi Game " Part 02 " Saying hello -
My First Raspberry Pi Game - Part 01 - Before we start -
Tail Call Optimisation in C++ - lightning talk video -
Scheme 2: Basics - pairs and lists video -
Scheme 1: Feel the cool video -
vim
Improving my vimrc live on stream -
Vim as editor for Claws Mail -
Vim persistent buffer list combined with saved sessions -
Writing
Heads-up: moving away from WordPress -
Rust 101 - 33: Exercises for module D (q3) -
Converting HTML slides to a PDF with Firefox -
How to write a programming language articles -
TECH(K)NOW Day workshop on "Writing a programming language" -
Movie podcast "The Good Robot Andys" -
Mocks are Bad, Layers are Bad -
Tail Call Optimisation in C++ published in Overload journal -
How to ask technical questions in person -