Andy Balaam's Blog
Mini-rust in Rust 045: Combining two types when we add things
Why I don't use AI
Mini-rust in Rust 044: Finding the type of a symbol
Mini-rust in Rust 043: Expressions on the left of operators
Mini-rust in Rust 042: An unexpected token means stop this expression
Mini-rust in Rust 041: While conditions that are not operations
Mini-rust in Rust 040: While conditions should be bool
Mini-rust in Rust 039: Spans should be ranges
Mini-rust in Rust 038: Avoiding a String allocation for each token
Mini-rust in Rust 037: Complex expressions in mutation statements
Mini-rust in Rust 036: Evaluating code blocks
Mini-rust in Rust 035: Tidying up the evaluator
Mini-rust in Rust 034: Our first program, actually working
Mini-rust in Rust 033: Evaluating operators like plusequals and timesequals
Mini-rust in Rust 032: Supporting a Unit type and type checking mutations
Mini-rust in Rust 031: Getting "while" through the type checker
Mini-rust in Rust 030: Expressions after while loops
Mini-rust in Rust 029: Parsing plus-equals
Mini-rust in Rust 028: Lexing plus-equals
Standing again for the Matrix Governing Board
Testing nonexistence
Mini-rust in Rust 027: Parsing blocks of code
Mini-rust in Rust 026: Parsing an empty while loop
Mini-rust in Rust 025: Parsing let mut
Mini-rust in Rust 024: Lexing the <= sign
Mini-rust in Rust 023: Refactor to share structure of the syntax tree
Rust tracing basic setup
Mini-rust in Rust 022: Stop lying about types in errors
Mini-rust in Rust 021: Including type information in our syntax tree
Mini-rust in Rust 020: Gaps in our type checker
Mini-rust in Rust 019: Type checking an actual type error
Mini-rust in Rust 018: Type checking, the happy path
Mini-rust in Rust 017: Handling float literals
Mini-rust in Rust 016: Tidying our parser
Mini-rust in Rust 015: Parsing a typed assignment
Mini-rust in Rust 014: Evaluating an assignment
Mini-rust in Rust 013: Fixing a bug in our lexer
Mini-rust in Rust 012: Parsing with backtracking
Mini-rust in Rust 011: Parsing an assignment plus expression
Mini-rust in Rust 010: Lexing an assignment
Mini-rust in Rust 009: Handling parsing errors
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)
19 years of blogging
Deployment is important
Rust 101 - 48: Exercises for module F (q3)
Rust 101 - 47: Exercises for module F (q2)
Heads-up: moving away from WordPress
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)
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
New home for my videos: video.infosec.exchange
Why I won't link to AI resources
Rust 101 - 27: Exercises for module C (q2)
Rust 101 - 26: Exercises for module C (q1)
Choosing who to vote for in the 2024 UK General Election
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
Standing for the Matrix Governing Board
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)
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
Rust 101 - 12: Traits
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
Rust 101 - 10: Strings
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
Letter to my MP: using starvation as a weapon
Santa Circles 0.3 is out!
Follow this blog on the fediverse!
Rust 101 - 6: Structs and Enums
Rust 101 - 5: References
Rust 101 - 4: Exercises for module A1
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
Why I'm voting tactically against you - letter to my Conservative MP
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
GitHub API GraphQL snippets
Live code reviews make life better
Air-Source Heat Pump - 1 year later
Deleted my Twitter account
IETF115 Trip Report (Can Matrix help messaging standardisation through MIMI?)
Setting the text selection in a browser: just use setBaseAndExtent
Tips for contenteditables
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
Deporting desperate people from the UK
Improving my vimrc live on stream
Comparison of Matrix events before and after "Extensible Events"
Air-Source Heat Pump - our experience so far, 2 months in
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
Preventing Virgin Media hijacking my DNS
Letter to my MP about climate emergency
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?
Matrix is the only (chat) game in town
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
Toggle window decorations on Linux GTK3 with Python3
Questions about RFC 8771
Announcing Rust I-DUNNO
Letter to my MP on Yemen
Making Smolpxl work on phones and tablets
Limiting the number of open sockets in a tokio-based TCP listener
Recommendation against the use of WhatsApp in your company
Streaming video with Owncast on a free Oracle Cloud computer
Pinephone update
Is your program a function or a service?
Shutdown order consistency: how Rust helps
Edge computing providers
Schema upgrades should be reversible (also other transformations, actually)
Make levels for Rabbit Escape using the level editor!
Announcing Smolpxl Scores - a high score table for your game
Dovecot not working after upgrade to Ubuntu 20.04.1 (dh key too small)
Letter to my MP on the overseas aid budget.
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
Set the date (EXIF) of a photo on Linux
How to send an SMS using netcat (via SMPP)
Letter to my MP on racism in the US and UK
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
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
What is a Monad? Video
Build with a different Java version (e.g. 11) using Docker
Rabbit Escape t-shirts
Scheduling a task in Java within a CompletableFuture
Rabbit Escape 0.12 out now, with water
Convert a video to a GIF with reasonable colours
Gradle: what is a task, and how can I make a task depend on another task?
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
Run bash inside any version of Linux using Docker
Windows missing from grub menu after Ubuntu install
New home page design
Code Like a Girl T-shirts
Poor performance in Chrome (especially on mobile) - caused by SVG background images
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
Graft Animation Language on Raspberry Pi
Worksheet: "Tell a story by making animations with code"
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
Rabbit Escape 0.11 out now!
Migrating videos from YouTube to PeerTube inside a Docker container
How to write a programming language articles
Allow drag-to-side, but not drag-to-top in Ubuntu MATE (Marco)
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
Examples of Pepper3 code
Recording gameplay videos on RetroPie
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
maven-assembly-plugin descriptor for a simple tarball with dependencies
Blog aggregator/planet in WordPress using FeedWordPress
Adding a day in Python datetimes - use timedelta, not the datetime constructor
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
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
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
Planet Code updates
A story about magic and how we treat each other
Annual cost of clean water for every human
Iterating over the lines of a file in Java
Raspberry Pi Jam "Chaos Car!"
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
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
Gracefully shutting down Firefox, to avoid the crash/session dialog
Snake in Python 3 + Qt 5
Basic Concepts of Christianity video
Elm Basics Video
How to analyse a .phd heap dump from an IBM JVM
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
Out-of-school education settings
New open source project on work time - git-history-data
Java HTTPS to a server with a self-signed certificate
Vim as editor for Claws Mail
Using GitHub and GitLab
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
Assassination of individuals by the state
Difficult merges in Git - don't panic!
ZX Spectrum BASIC Web Server
Letter to my MP on UK government assassination of British Citizens in Syria
Rabbit Escape out now on Android!
Changing the Docker daemon options in systemd on Ubuntu 15.04
Docker fails to start on Ubuntu 15.04
Preventing Audacity from crashing when using PulseAudio
Movie podcast "The Good Robot Andys"
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
Snake in Dart
Preventing Kupfer switching to existing windows
Using Kupfer on MATE
Tweetable Art Code
Rabbit Escape 0.3.1 - now with zoom!
Treat warnings as errors in a (Gnu) Makefile
Switching Xfce to use metacity
Java game programming: image rendering hints make no difference to rendering time
Snake in ZX Spectrum BASIC
fetchmail complaining about GoDaddy SSL certificate
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
What is a good company?
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
JAX-RS (using Apache CXF) in embedded Tomcat example
Vim persistent buffer list combined with saved sessions
Snowflake Christmas card web page on the Raspberry Pi
Snowflake Christmas card in Scratch on the Raspberry Pi
Encoding URLs in Java
Books that changed my life
Why I use Linux
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
Android programming - drawing bitmaps in a game loop
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
Raspberry Pi Minecraft Python summer project screenshots
Android programming - setting up Android Studio
What is a string?
Absolute Truth in programming languages
Options for code reviews with Git
Desktop sharing not working in Lubuntu 14.04
Best GCC warning flags for compiling C++
What git server should I use?
Renewing self-signed certificate for ejabberd
Letter to my MP on DRIP
What is node.js?
A mini mocking framework
Simple template programming
Five Quines video
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
Security in a REST API
Searching in a REST API
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)
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
Lambda functions timeline
Goodness in programming languages, part 3 " not doing the same thing more than once
Tail Call Optimisation in C++ - lightning talk video
Cool Raspberry Pi Projects
Scheme 7: Macros video
Scheme 6: Lambda video
Tail Call Optimisation in C++ published in Overload journal
Scheme 5: Quotation video
Scheme 4: Recursion - how to write functions in Scheme video
Scheme 3: Closures video
Scheme 2: Basics - pairs and lists video
Scheme 1: Feel the cool video
Generalising tail call optimised C++
JavaScript WTFs Videos
Closures in Scheme
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
Scheme: feel the cool
JavaScript WTFs
Goodness in programming languages, part 2 " getting your code running
Building jEdit from source
Goodness in programming languages, part 1 - syntax and layout
Ethernet not working on Ubuntu with Realtek RTL8111/8168B
FreeGuide usage stats
Entertain your baby using your Android phone
rdesktop swallows keyboard events
Reclaiming desktop space with Ubuntu's window-picker-applet
My Address Book 1.9.0 - rewritten from scratch
Switching workspace in GNOME via the command line
Anatomy of an interpreter: the Evaluator
How to ask technical questions in person
Anatomy of an interpreter: the Parser
Anatomy of an interpreter: the Lexer
Subs Scheme Lisp Interpreter
Scalable Graph Coverage
Ubuntu Lucid upgrade - a catalogue of disaster and pain
FreeGuide 0.10.11
Don't design for performance until it's too late
Technorati appear to have broken openid delegation
NNDB 0.1
NNDB's Not a Database
Diffident 0.3
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
Random background in GNOME
Analog literals
Separate regular expressions, or one more complex one?
New Baby
Talk in code
Fixing the vertical panel window list on Ubuntu Hardy
An actual difficult bug fixed
FreeGuide 0.10.9
Wii repaired free!
Another one
FreeGuide 0.10.8
Debugging memory use and fragmentation on Windows using Address Space Monitor
C++ is an expert language
Templated test code?
Public bzr branch of FreeGuide
Public git repo for GSSMP
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
duckmaze 0.2
Caution: numbers that feel prime may be divisible by 3
Announcing Record TV
FreeGuide 0.10.5
FreeGuide SVN now useable
Heartfelt apologies for the feed URL change
FreeGuide - putting recording on hold
New Baby arrived safely
(Badly wrong) usage statistics for FreeGuide
Procmail Maildir messages disappearing
last.fm in GSSMP
lastfmsubmitd on Ubuntu Dapper
Obviously, there was a bug
Watching TV: a simpler way
GSSMP 1.0
Choose channel dialog
Digital TV on Dapper with my Hauppauge WinTV Nova-T card
Restoring a backup with Duplicity
Remote encrypted backup with duplicity
GSSMP goes beta
Recording in FreeGuide
My daily backup
Creating .deb and RPM packages
Moved to WordPress
Two new babies
New games!
Linux Journal - Forgiveness
Another FreeGuide release candidate
FreeGuide 0.10.4 release candidate
A Quick and desperate introduction to data recovery
FreeGuide fan mail
Over-engineering gone mad
Keyboard layout change in Ubuntu
FreeGuide source layout (and SVN migration)
Letter to Linux Journal
Linux Journal slides
Donation
FreeGuide update
Faster Poker Analysis
Poker Analysis
Podcasts I listen to
Setting up my ideal email system 4
I spawn
Setting up my ideal email system 3
FreeGuide 0.10pre2
Setting up my ideal email system 2
Setting up my ideal email system
Just a little bit longer...
BashPodder
Python objects in C++
CD writing on Fedora Core 3
Prince of Persia - The Sands of Time
Personal stuff is boring
Sourceforge
London
London terrorist attacks
The dangers of learning to code
Train gaming
Constantly changing passwords
Gaming on the move
ATV Palm export
Nearing a new release
DIYPlanet
Re-implementing
Honestly my last post about my viva
Corrections
Viva today
Mnemonic
FreeGuide's TODO list
FreeGuide packaging and plugins
DIYBlog
RSS working?
Prediction: corporate Linux
Guilty Expression
RSS
A real job
What is going on with FreeGuide?
Google
Beginning blog