Author: Andy Balaam
-
ACCU Talk “How Kotlin makes your Java code better”
Here is the live version of my talk designed to help you advocate for adopting Kotlin:
-
ACCU Talk “How Git really works”
Here is the talk CB Bailey and I did at ACCU Conference 2019. This was the first talk I have done with someone else, and I really enjoyed it:
-
Examples of Kotlin making your Java code better video
People at work suggested Kotlin was “just syntactic sugar”, so I set out to explain how Kotlin can really make better code, and here is the result: Slides: Examples of Kotlin making your Java code better slides
-
What is a Monad? Video
Slightly jokey video about what a Monad is, but with a genuine explanation, all in just about 5 minutes. First given as a lightning talk at the ACCU Conference in 2019. Slides: What is a Monad? Slides
-
Build with a different Java version (e.g. 11) using Docker
To spin up a temporary environment with a different Java version without touching your real environment, try this Docker command: docker run -i -t –mount “type=bind,src=$PWD,dst=/code” openjdk:11-jdk bash (Change “11-jdk” to the version you want as li…
-
Rabbit Escape t-shirts
If you’d like to help promote Rabbit Escape, my free software Android/PC game, how about a t-shirt? Use the link below to design your shirt: Rabbit Escape t-shirt Note: there’s no profit in this for us – it’s just for promotion. If you’d like to contr…
-
Scheduling a task in Java within a CompletableFuture
When we want to do something later in our Java code, we often turn to the ScheduledExecutorService. This class has a method called schedule(), and we can pass it some code to be run later like this: ScheduledExecutorService executor = Executors.new…
-
Rabbit Escape 0.12 out now, with water
The newest feature of Rabbit Escape, water, has been brewing a long time, but we now think it’s ready: Water can flow, it can put out fires, and it can drown rabbits. Rabbots seem to be immune though… Check out the 20 new levels we have released! (T…
-
Convert a video to a GIF with reasonable colours
Here’s a little script I wrote to avoid copy-pasting the ffmpeg command from superuser every time I needed it. It converts a video to a GIF file by pre-calculating a good palette, then using that palette. Usage: ./to_gif input.mp4 output.gif The file t…
-
Gradle: what is a task, and how can I make a task depend on another task?
In an insane world, Gradle sometimes seems like the sanest choice for building a Java or Kotlin project. But what on Earth does all the stuff inside build.gradle actually mean? And when does my code run? And how do you make a task? And how do you persu…
-
Python Async basics video (100 million HTTP requests)
I found something difficult in Python, which was a bit of a first, so I wrote a whole blog series about it, and now a whole video: Slides: Python Async Basics slides Blog posts: asyncio basics, large numbers in parallel, parallel HTTP requests, addin…
-
Keybase chat bot in 10 lines of bash
I’ve been getting very excited about keybase.io recently, not least because it offers secure conversation, and you can have bots. I wrote a quick bot to simulate Arnold Schwarzenegger which I thought I’d share to demonstrate how easy it is. It is based…
-
Performance of Java 2D drawing operations (part 3: image opacity)
Series: operations, images, opacity Not because I was enjoying it, I seemed compelled to continue my quest to understand the performance of various Java 2D drawing operations. I’m hoping to make my game Rabbit Escape faster, especially on the Raspberry…
-
Performance of Java 2D drawing operations (part 2: images)
Series: operations, images, opacity In my previous post I examined the performance of various drawing operations in Java 2D rendering. Here I look at some specifics around rendering images, with an eye to finding optimisations I can apply to my game Ra…
-
Performance of Java 2D drawing operations (part 1: types of operation)
Series: operations, images, opacity I want to remodel the desktop UI of my game Rabbit Escape to be more convenient and nicer looking, so I took a new look at game-loop-style graphics rendering onto a canvas in a Java 2D (Swing) UI. For more on images,…
-
London Python Meetup January 2019 – Async Python and GeoPandas
It was a pleasure to go to the London Python Meetup organised by @python_london. There were plenty of friendly people and interesting conversations. I gave a talk “Making 100 million requests with Python aiohttp” (slides, Blog post) explaining the basi…
-
Run bash inside any version of Linux using Docker
Docker is useful for some things, and not as useful as you think for others. Here’s something massively useful: get a throwaway bash prompt inside any version of any Linux distribution in one command: docker run -i -t –mount “type=bind,src=$HOME/Deskt…
-
Windows missing from grub menu after Ubuntu install
Windows was missing from my grub menu after I installed Ubuntu. Fortunately it was fixed by running: sudo grub-mkconfig -o /boot/grub/grub.cfg and rebooting. Phew.
-
New home page design
After years of getting around to it, I have redesigned my home page at artificialworlds.net. It’s basically intended to make me look clever or productive or interesting or something. Alternatively, it gives you somewhere to find that thing you know I m…
-
Code Like a Girl T-shirts
There are lots of people missing from the programming world: lots of the programmers I meet look and sound a lot like me. I’d really like it if this amazing job were open to a lot more people. One of the weird things that has happened is that somehow w…
-
Poor performance in Chrome (especially on mobile) – caused by SVG background images
I have spent the last few hours investigating abysmal performance in my latest little game project Cross The Road. Firefox was fine, but Chromium and Chrome, especially on mobile, was rendering at about three frames per second. When I stopped using SVG…
-
Interesting Characters (UTF-16, utf-8, Unicode, encodings) video
In which I try to express the weird joy I felt learning about all the odd quirks of the simple task of turning bytes into characters, and characters into bytes. Slides: Interesting Characters slides
-
Elm makes me happy (updated for Elm 0.19) video
Series: Snake in Elm, Elm makes me happy, Elm Basics, Elm Unit Test, Elm JSON With up-to-date examples, and anecdotes from the last couple of years of continuing to enjoy writing web pages in Elm, here’s a new version of my Elm advert: Slides: Elm ma…
-
Godot: make new objects at runtime (instancing) video
Series: 2D Shapes, drag and drop, new objects My Godot 3 game is progressing, and I am starting to think I am actually writing the level editor. Here’s how I wrote code to make new versions of existing objects (by converting them to scenes): Godot ve…
-
You must rewind your incoming buffer when you fail to encode a character in a CharsetEncoder or you’ll get an IllegalArgumentException
I am writing a CharsetEncoder in Java, which is my kind of fun. I was getting a mysterious error when I identified that I could not encode certain characters: Exception in thread “main” java.lang.IllegalArgumentException at java.nio.Buffer.position(Bu…
-
Godot: Dragging and dropping physics objects video
Series: 2D Shapes, drag and drop, new objects Continuing to explore the Godot 3 game engine. I want to make a game where you drag blocks around and balance them on each other, but I couldn’t find much documentation on how to drag-and-drop objects (exce…
-
Godot: 2D shapes bouncing off each other video
Series: 2D Shapes, drag and drop, new objects In which I make a square and a triangle bounce on a rectangle using Godot 3: Godot version: v3.0.6.stable.official.8314054
-
Elm JSON decoder examples
Series: Snake in Elm, Elm makes me happy, Elm Basics, Elm Unit Test, Elm JSON I find JSON decoding in Elm confusing, so here are some thoughts and examples. Setup $ elm –version 0.19.0 $ mkdir myproj; cd myproj $ elm init … $ elm install elm/json …..
-
Graft Animation Language on Raspberry Pi
Because the Rapsberry Pi uses a slightly older Python version, there is a special version of Graft for it. Here’s how to get it: Open a terminal window by clicking the black icon with a “>” symbol on it at the top near the left. First we need to in…
-
Worksheet: “Tell a story by making animations with code”
I’m running a workshop at the Egham Raspberry Jam on 21st October. The workshop will introduce my little animation language Graft. We will tell a story using animations that we created ourselves using code. The worksheet for the workshop is here: PDF o…
-
My experience upgrading to Elm 0.19
Elm is unstable, so upgrading to the next version can be painful. Here’s what I needed to do to upgrade from 0.18 to 0.19. Replace elm-package.json and tests/elm-package.json with elm.json – e06f5a1728 Switch to the new elm-test – b964b7c7a Re-arrange…
-
Bulk adding items to Wunderlist using wunderline on Ubuntu MATE
If you use Wunderlist and want to be able to bulk-add tasks from a text file, first install and set up wunderline. Now, to be able to right-click a text file containing one task per line on Ubuntu MATE, create a file called “wunderlist-bulk-add” in ~/….
-
Writing a new Flarum extension on Ubuntu
In a previous post I described how to install Flarum locally on Ubuntu. Here is how I set up my development environment on top of that setup so I was able to write a new Flarum extension and test it on my local machine. Recap: I installed Apache and PH…
-
Ubuntu “compose” key for easy unicode character input
I found out on Mastodon recently that the Compose key exists, allowing you to enter special characters using easy-to-remember key sequences (e.g. “<compose>/=” gives you “≠“). To do this on Ubuntu (and probably many other systems), hold SHIFT, …
-
Redirecting all requests to https and www using .htaccess in Apache
I want all requests to artificialworlds.net/rabbit-escape/levels/ to get redirected to use the https protocol, and to include “www.” at the beginning of the URL, and I found lots of Stack Overflow articles, but nothing there worked perfectly for me. He…
-
Example of a systemd service file
Here is an almost-minimal example of a systemd service file, that I use to run the Mastodon bot of my generative art playground Graft. I made a dedicated user just to run this service, and installed Graft into /home/graft/apps/graft under that username…
-
Installing Flarum on Ubuntu 18.04
I am setting up a forum for sharing levels for my game Rabbit Escape, and I have decided to try and use Flarum, because it looks really usable and responsive, has features we need like liking posts and following authors, and I think it will be reasonab…
-
Rabbit Escape 0.11 out now!
The RABBOTS are coming! Get the latest version of Rabbit Escape: Android: Rabbit Escape on F-Droid (free, no ads) Android: Rabbit Escape Free on the Play Store (free, no ads) Android: Rabbit Escape on the Play Store (Pay about 60p, identical to the f…
-
Migrating videos from YouTube to PeerTube inside a Docker container
I have quite a few videos hosted on YouTube that I would like to upload to my new PeerTube location, but I don’t want to install all the PeerTube dependencies on my machine, so I did it all inside a Docker image. First I built and started a Docker cont…
-
How to write a programming language articles
Recent Overload journal issues contain my new articles on How to Write a Programming Language. Part 1: How to Write a Programming Language: Part 1, The Lexer Part 2: How to Write a Programming Language: Part 2, The Parser PDF of the latest issue: Overl…
-
Allow drag-to-side, but not drag-to-top in Ubuntu MATE (Marco)
I love the “tiling” feature in many window managers including Marco that means I can drag windows to the side of the screen and get them covering one half. However, I never use the similar feature that allows dragging a window to the top, and it often …
-
Connecting to Slack from an IRC client using slirc
I tried to get back to an IRC interface to Slack using Matrix, and it had some problems. Thanks to Colin Watson’s comment on that post, I tried Daniel Beer’s slirc, and so far it seems to be working pretty well. Here’s what I did: Get a Slack legacy to…
-
Using Matrix to connect to Slack from an IRC client on Ubuntu
Update: I found a better solution using slirc. I like using HexChat to talk to my colleagues, like one other guy. It is fast, and it pops up a new window when someone sends me a direct/private message. Recently, Slack shut down their IRC gateway, forci…
-
Clever Things People Do In Groovy So You Have To Know About Them video
Groovy has lots of interesting syntax that can be used for domain-specific languages, such as Gradle build files, and Jenkinsfiles. I try to demystify the syntax tricks a bit so you have a chance to read and understand what the code is actually doing: …
-
Examples of SQL join types (LEFT JOIN, INNER JOIN etc.)
I have 2 tables like this: > SELECT * FROM table_a; +——+——+ | id | name | +——+——+ | 1 | row1 | | 2 | row2 | +——+——+ > SELECT * FROM table_b; +——+——+——+ | id | name | aid | +——+——+——+ | …
-
Fixing Slack emojis in HexChat
If, like me, you are this person: (Source: xkcd.com/1782) You may want to fix the stupid :slightly_smiling_face: messages you receive from Slack via the IRC gateway. Obviously, I’d prefer they went away entirely, but it’s still better to see a characte…
-
Ideas on how lexing will work in Pepper3
I am trying to practice documentation-driven development in Pepper3, so every time I start on an area, I will write documentation explaining how it works, and include examples that are automatically verified during the build. I’ve started work on lexin…
-
Deleting commits from the git history
Today I wanted to fix a Git repo that contained some bad commits (i.e. git fsck complained about them). [I wanted to do this because GitLab was not allowing me to push the bad commits.] I wanted the code to look exactly as it did before, but the histor…
-
Questions and answers about Pepper3
Series: Examples, Questions My last post Examples of Pepper3 code was a reply to my friend’s email asking what it was all about. They replied with some questions, and I thought the questions and answers might shed some more light: Questions! Brillian…
-
Examples of Pepper3 code
Series: Examples, Questions I have restarted my effort to make a new programming language that fits the way I like things. I haven’t pushed any code yet, but I have made a lot of progress in my head to understand what I want. Here are some random examp…
-
Recording gameplay videos on RetroPie
Stop! This blog post is out of date – see Recording gameplay videos on RetroPie for a live version in github that may be more helpful. Credits: this is a slightly corrected and shortened version of How To Record A GamePlay Video From A RetroPie by sels…
-
TECH(K)NOW Day workshop on “Writing a programming language”
My OpenMarket colleagues and I ran a workshop at TECH(K)NOW Day on how to write your own programming language: A big thank you to my colleagues from OpenMarket who volunteered to help: Rowan, Jenny, Zach, James and Elliot. An extra thank you to Zach …
-
FileZilla with proxy not working with strange characters in the password
Today I found I could not connect out through my proxy server with FileZilla It stopped working when I changed my password to something containing a double quote “. The solution? Change to use WinSCP.
-
HTML5 CSS Toolbar + zoomable workspace that is mobile-friendly and adaptive
I have been working on a prototype level editor for Rabbit Escape, and I’ve had trouble getting the layout I wanted: a toolbar at the side or top of the screen, and the rest a zoomable workspace. Something like this is very common in many desktop appli…
-
maven-assembly-plugin descriptor for a simple tarball with dependencies
Today I was trying to make a simple tarball of a project + its dependent jar using the maven-assembly-plugin. I know this is a terrible way to do anything, but hey, just in case someone else wants to do something just as terrible, here are my pom.xml a…
-
Blog aggregator/planet in WordPress using FeedWordPress
I used to run Planet Code using Venus but that started breaking recently with 500 errors for SNI-enabled sites, and it looks very unmaintained. I considered some other static aggregators, but on shared hosting it’s hard to get the right Ruby version an…
-
Adding a day in Python datetimes – use timedelta, not the datetime constructor
If you want “tomorrow” in Python datetimes, don’t construct a datetime like this: from datetime import datetime, timedelta td = datetime.today() tm1 = datetime(td.year, td.month, td.day + 1, 14, 0, 0) # Don’t do this! Because it will work sometimes, b…
-
Broken Levels Challenge – Egham Raspberry Pi Jam July 2017
Today at the Egham Raspberry Pi Jam we did two things: 1. The Broken Levels Challenge Some nasty person came and broke our levels for our game Rabbit Escape and we need you to fix them! To play this game you will need a PC version of Rabbit Escape, ou…
-
Women Who Code workshop on “Write your own programming language”
On Wednesday 28th June 2017 a group of people from OpenMarket went to the Fora office space in Clerkenwell, London to run a workshop with the Women Who Code group, who work to help women achieve their career goals. OpenMarket provided the workshop “Wri…
-
Running a virtualenv with a custom-built Python
For my attempt to improve the asyncio.as_completed Python standard library function I needed to build a local copy of cpython (the Python interpreter). To test it, I needed the aiohttp module, which is not part of the standard library, so the easiest w…
-
Adding a concurrency limit to Python’s asyncio.as_completed
Series: asyncio basics, large numbers in parallel, parallel HTTP requests, adding to stdlib In the previous post I demonstrated how the limited_as_completed method allows us to run a very large number of tasks using concurrency, but limiting the number…
-
“git what” is “git status” on steroids
For when git status is not enough, I wrote git what: If you often have a few branches on the go, it could be useful.
-
Making 100 million requests with Python aiohttp
Series: asyncio basics, large numbers in parallel, parallel HTTP requests, adding to stdlib Update: slides of a talk I gave at the London Python Meetup on this: Talk slides: Making 100 million HTTP requests with Python aiohttp. Update: see how Cristian…
-
Python – printing UTC dates in ISO8601 format with time zone
By default, when you make a UTC date from a Unix timestamp in Python and print it in ISO format, it has no time zone: $ python3 >>> from datetime import datetime >>> datetime.utcfromtimestamp(1496998804).isoformat() ‘2017-06-09T09:00:…
-
Python 3 – large numbers of tasks with limited concurrency
Series: asyncio basics, large numbers in parallel, parallel HTTP requests, adding to stdlib I am interested in running large numbers of tasks in parallel, so I need something like asyncio.as_completed, but taking an iterable instead of a list, and with…
-
Basic ideas of Python 3 asyncio concurrency
Series: asyncio basics, large numbers in parallel, parallel HTTP requests, adding to stdlib Update: see the Python Async Basics video on this topic. Python 3’s asyncio module and the async and await keywords combine to allow us to do cooperative concur…
-
C++ iterator wrapping a stream not 1-1
Series: Iterator, Iterator Wrapper, Non-1-1 Wrapper Sometimes we want to write an iterator that consumes items from some underlying iterator but produces its own items slower than the items it consumes, like this: ColonSep items(“aa:foo::x”); // Prints…
-
How to write a programming language ACCU talk
My talk from ACCU Conference 2017 where I describe a tiny programming language I wrote: Slides: How to write a programming language Cell source code: github.com/andybalaam/cell
-
C++ iterator wrapper/adaptor example
Series: Iterator, Iterator Wrapper, Non-1-1 Wrapper If you want to wrap an iterable range with another that transforms the underlying iterators in some way and allows looping or constructing other objects: for (auto ch : Upper(“abcdef”)) { // Print…
-
C++ iterator example (and an iterable range)
Series: Iterator, Iterator Wrapper, Non-1-1 Wrapper To make your own iterable range in C++ that you can loop over or make a vector out of (mine is called Numbers): // Prints: // 3,4, for (auto n : Numbers(3, 5)) { std::cout << n << “,”;…
-
Make Android Gradle display unit test failure messages
By default, Gradle does not show you what happened when a unit test failed: $ ./gradlew test … MyTest > Black_is_white FAILED org.junit.ComparisonFailure at MyTest.java:6 ^^^ WHAT ACTUALLY FAILED???? … This is insane, and can be fixed (t…
-
Planet Code updates
I maintain an unofficial aggregator of blogs by people who are involved with ACCU and things they might be interested in. It’s called Planet Code. Today I made it look slightly less ugly, and added several new blogs after attending the excellent ACCU C…
-
A story about magic and how we treat each other
For a lightning talk at the ACCU Conference I wrote a little story: A story about magic and how we treat each other It describes one person’s journey towards realising that we need to act to be kind to each other, and not to expect it to happen automat…
-
Annual cost of clean water for every human
According to a 2010 WHO-backed study the cost of safe water for every human would be about 10 billion US dollars per year. The UK government revenue for 2010-2011 was about 639 billion US dollars. I would vote for a political party proposing to raise …
-
Iterating over the lines of a file in Java
If you’re trying to write a standard command-line tool in Java you are going to experience pain. In Python, if we want to do something with each line on input to your program, we can do something like: import sys for ln in sys.stdin: print(ln) # (…
-
Raspberry Pi Jam “Chaos Car!”
Raspberry Pi 1 + battery pack + Bluetooth USB dongle + i-racer bluetooth car + Raspberry Pi camera + some Python code + loads of sellotape = Chaos car! Here’s the code: #!/usr/bin/env python2 import os import random import bluetooth import sys import…
-
Automated UI tests on Android
I recently fought the Android emulator a lot to get my UI tests to run automatically during the build of Rabbit Escape, so I thought I’d better write down what I did before I forget. I already have tests that drive the Android UI (see e.g. SmokeTest.ja…
-
Submitting a package to F-Droid
Here’s what I needed to get a dev environment for F-Droid up and running on Ubuntu 16.10, using F-Droid server version 0.7.0 (commit id 8147f9235), so that I could submit a package for inclusion in the F-Droid repository. Doing this is apparently the b…
-
Resources for year 6 teachers on coding and programming
I have been introducing some year 6 (UK) teachers to coding by showing them how to lay out a simple web page by writing HTML. I promised I would find some links to resources for them, so here it is: HTML and JavaScript My examples of how to write HTML …
-
Setting up a sane Maven project
Today I have spent hours trying to get wrangle Maven into letting me set up a sane Java project. The hardest parts were enforcing warnings-as-errors, and getting Maven to shut up a bit. Some code that warns My first problem was writing some Java code t…
-
Writing a unit test in Elm
Series: Snake in Elm, Elm makes me happy, Elm Basics, Elm Unit Test, Elm JSON I’ve been having fun with Elm programming recently. Elm is a replacement for JavaScript that is pure functional and highly practical. Here’s how to go from nothing installed …
-
How to write a programming language – Part 3, The Evaluator
Series: Lexer, Parser, Evaluator. Finally, we get onto the actual magic of the little language I wrote (Cell) – the evaluator, which takes in syntax trees and finds their real value, in the context of the “environment”: the symbols that are defined aro…
-
Basic Haskell project setup (unit tests, code, formatting)
To start a programming project, we need to be able to build, format code, and run unit tests. Here’s what I have found makes a sensible starting point for a Haskell project. Full code: hunit-example. To build and run tests, just do:make setup make test…
-
How to write a programming language – Part 2, The Parser
Series: Lexer, Parser, Evaluator My little programming language, Cell (Cell Elementary Learning Language) is designed to be simple. I want to use it to explain how to write a programming language. The parser is only 81 lines long, so hopefully it’s not…
-
Mousedown events delayed or sluggish on mobile
I am learning about Elm and web apps by writing a little game called sootl. It’s all SVGs animated with requestAnimationFrame(), and you control your player by clicking or touch the screen. Everything seemed good on desktop browsers, but on mobile it t…
-
How to write a programming language – Part 1, The Lexer
Series: Lexer, Parser, Evaluator I wrote a little programming language, Cell which is supposed to be simple enough to help explain how a programming language works. Here’s the explanation of the lexer, which is the first part of a compiler or interpret…
-
Simple example of Netty 4 usage
I feel the title of this post over-promises, since I was not able to make an example that seemed simple to me. Anyway, here is a near-minimal example of how to use Netty to make a server that shouts back at you whatever you say: NettyExample.java:impor…
-
Elm resizeable SVG canvas filling the screen
I am toying with writing an SVG-based game in (exciting-looking JavaScript-replacement) Elm, and I wanted an SVG that filled the whole screen and resized when the screen resized. I found it harder than I expected, so here is what I came up with for you…
-
Ambiguous names in Java due to non-normalised unicode – but all OK in Python
In Java and several other languages, identifiers (e.g. method names) are allowed to contain unicode characters. Unfortunately, some combinations of unicode characters are logically identical. For example, á (one character: Latin Small Letter a with Ac…
-
Gracefully shutting down Firefox, to avoid the crash/session dialog
I normally have several Firefox profiles open, and when I log out without closing the Firefox windows I get the “session restore” dialog on my next login. This is because of Bug 336193 which says that Firefox should shut down gracefully when it receive…
-
Snake in Python 3 + Qt 5
Series: Groovy, Ruby, BASIC, Dart, Elm, Python3+Qt5 I’m writing the game Snake in lots of programming languages, for fun, and to try out new languages. Python 3 broke compatibility to fix some mistakes – was it worth it? Qt 5 continues to offer more an…
-
Basic Concepts of Christianity video
Update: my ideas have changed quite a bit since I recorded this, especially about the idea that “every crime requires a punishment”. If you’d like to explore more, try this sermon by my friend Jörg. As a Christian myself I thought it might be interest…
-
Elm Basics Video
Series: Snake in Elm, Elm makes me happy, Elm Basics, Elm Unit Test, Elm JSON A lot of the documentation about the new language I am really excited about, Elm focusses on the Elm Architecture and the ideas of Functional Reactive Programming, and while …
-
How to analyse a .phd heap dump from an IBM JVM
If you have been handed a .phd file which is a dump of the heap of an IBM Java virtual machine, you can analyse it using the Eclipse Memory Analyzer Tool (MAT), but you must install the IBM Monitoring and Diagnostic Tools first. Download MAT from eclip…
-
Elm makes me happy (old: Elm 0.17)
Updated version: Elm makes me happy (updated for Elm 0.19) Elm lets you write interactive web sites in a really clean and safe-feeling way, which is a contrast to the feeling I get when using JavaScript and HTML. It’s functional, but instead of that ma…
-
What’s new in Java 8
Java 8 makes some functional programming ideas available to the rest of us, using Lambda, function references and a streaming style (map, filter, replace etc.): Slides: What’s new in Java 8
-
Which Raspberry Pi photo was funniest?
We had a great day at the Egham Raspberry Pi Jam, and Rabbit Escape and our Photo Booth: seemed to go down well: But which photo was funniest? Here are some of the entries (I had to choose kids’ ones without faces to go on here, but there were some o…
-
Raspberry Pi Funniest Photo Game
For our latest Egham Raspberry Pi Jam, we worked on a photo booth program, using the Raspberry Pi camera. Here’s how we did it. Downloads: funniest-photo-game.odp, photo-booth.zip. Update 1: fixed a bug where it tried to create a directory that already…
-
Snake in Elm
Snake Series: Groovy, Ruby, BASIC, Dart, Elm, Python3+Qt5 Elm Series: Snake in Elm, Elm makes me happy, Elm Basics, Elm Unit Test, Elm JSON I’m writing the game Snake in lots of programming languages, for fun, and to try out new languages. Elm brings t…
-
Out-of-school education settings
Here is the comment I sent to the Government consultation on out-of-school education settings. Feel free to re-use, modify, distribute as you like. I am writing to express my opposition to the government’s plans to regulate the content of out-of-school…