Tweets from May 2018

Came for the jellied pork; stayed for the Slav food nostalgia. :D

Sun May 06 19:26:38 +0000 2018

Thu May 10 20:28:09 +0000 2018

@tonofbuns @zeynep It should replicate as closely as possible the experience of calling an automated helpline, but…

Sat May 12 21:24:53 +0000 2018

Rosemary Kirstein will be doing a Reddit AMA on June 14! If you haven't read the Steerswoma…

Mon May 14 07:01:37 +0000 2018

Whether this petition directly influences studio execs or not, it's generating a lot of positive buzz for the show,…

Wed May 16 11:23:34 +0000 2018

Anyway, if you love SF and you've never heard of The Expanse, check it out. It builds slowly -- the first few epi…

Wed May 16 11:27:53 +0000 2018

This is the last of my Expanse-related flood, I promise. Fan renewal campaigns are often disappointing, but they so…

Wed May 16 11:29:43 +0000 2018

Lots of people are coming out of the woodwork on Reddit to say that they had literally never heard of the show unti…

Wed May 16 11:30:31 +0000 2018

Of course I managed to screw up one of the hashtags. Reposted!

Wed May 16 11:31:05 +0000 2018

@gvwilson Guilty. Whenever it becomes so cluttered that I can't find anything I move a bunch of stuff into STUFF_TO…

Wed May 16 12:38:12 +0000 2018

@gvwilson (It's like other people's desktops, except that I don't have a desktop in my window manager. My home dire…

Wed May 16 12:39:06 +0000 2018

@Fancierfancier Half an hour of silence?!

Sat May 19 20:18:52 +0000 2018

@pierre_nel @highvoltage The headline is jumping the gun; they're in talks but nothing has been finalised. Promisin…

Tue May 22 11:02:01 +0000 2018

Do you like RPGs? Do you like SF literature? Check out this Bundle of Holding for the Mindjammer roleplaying game.

Tue May 22 11:26:47 +0000 2018

Vampires vs Werewolves

Tue May 22 16:49:52 +0000 2018

Sofia Samatar is doing an AMA in /r/Fantasy!

Thu May 24 11:55:21 +0000 2018

The Rabbit in Yellow. I want one!

Fri May 25 08:43:25 +0000 2018

Gardner Dozois has passed away. His annual Mammoth Book Of Best New SF / Year's Best SF anthology was always excell…

Mon May 28 08:18:55 +0000 2018

Provenance by Ann Leckie: it took me an embarrassingly long time to finish this, because life kept interfering. I q…

Mon May 28 08:27:17 +0000 2018

The amount of time I have spent on the phone to @TelkomZA trying to resolve the dumpster fire which should have bee…

Mon May 28 10:46:53 +0000 2018

Remember Voice of Baceprot? They have a music video!

Wed May 30 11:05:35 +0000 2018

Maths joke! Paging @astrolabe_cat

Wed May 30 15:25:53 +0000 2018

Tweets from April 2018

Tweets from March 2018

Fri Mar 02 17:26:21 +0000 2018

Yay, a trailer for The Expanse S3!

Sun Mar 11 21:37:10 +0000 2018

An Oath of Dogs by Wendy N. Wagner: I just couldn't get into this. On paper it's exactly the kind of book I like, b…

Mon Mar 12 13:12:43 +0000 2018

The Wonder Engine by T. Kingfisher (Ursula Vernon) -- part II of a two-parter. Did not disappoint. I loved the gnol…

Mon Mar 12 13:15:23 +0000 2018

Binti: the Night Masquerade by Nnedi Okorafor: I didn't enjoy this as much as the first two books in the series --…

Mon Mar 12 13:17:15 +0000 2018

The Stone Sky by N. K. Jemisin: a satisfying conclusion to the trilogy. I need to re-read all three books; I know I…

Sun Mar 18 09:32:31 +0000 2018

.@TelkomZA Trying to transfer an account into my name. SMSes you sent me suggest you have captured my name (and th…

Thu Mar 22 07:39:00 +0000 2018

@TelkomZA I phoned the branch (an option not suggested by either of your consultants); confirmed the issue; was tol…

Thu Mar 22 23:51:59 +0000 2018

@TelkomZA So my issue is now probably resolved, but the process to get here was absurdly inefficient.

Thu Mar 22 23:54:36 +0000 2018

@patrick_vine @TelkomZA I found it tragic and hilarious that their on-hold music is interspersed with cheery sugges…

Thu Mar 22 23:57:48 +0000 2018

Awesome life hack.

Tue Mar 27 14:39:42 +0000 2018

Tweets from February 2018

Paging @autumnal_akika and @DarkOutThere :D

Sun Feb 04 13:02:43 +0000 2018

@TheRiver I really liked some elements (Quellcrist; Thug Grandma; Abboud; Overly Attached Hotel; a lot of the suppo…

Sat Feb 10 21:51:18 +0000 2018

@TheRiver The abundant asymmetrical sexualised violence, for a start. On the one hand, I get that this is a future…

Sat Feb 10 21:53:09 +0000 2018

@TheRiver It's not mine! It comes from here: -- I've always liked the metaphor. I disliked…

Sat Feb 10 22:54:30 +0000 2018

@TheRiver Arguably, the show is set in a dystopia where this amazing technology is wasted on a narrow range of uses…

Sat Feb 10 22:59:18 +0000 2018

@dammitZA Well, I, for one, welcome our new quadruped robot overlords.

Tue Feb 13 10:37:25 +0000 2018

If only we could drink stupidity.

Mon Feb 26 10:35:44 +0000 2018

It's unclear whether Bradbury is rolling in his grave, but this looks pretty cool.

Tue Feb 27 10:53:00 +0000 2018

(OK, he only mostly hated television.

Tue Feb 27 10:55:04 +0000 2018

And now, for something completely different.

Tue Feb 27 15:55:38 +0000 2018

Heeeey, the Bundle of Holding has an Unknown Armies bundle.

Wed Feb 28 21:36:26 +0000 2018

Tweets from January 2018

You had one job.

Sun Jan 07 01:40:15 +0000 2018

This is awesome. Comixology now offers DRM-free downloads of comics from participating publishers.…

Sat Jan 20 19:30:04 +0000 2018

@faassen I think that she's well-known for The Dispossessed, The Left Hand of Darkness, etc., among *science fictio…

Wed Jan 24 10:03:31 +0000 2018

@faassen Sociology is a science!

Wed Jan 24 10:04:52 +0000 2018

Can I spend an entire day on Twitter communicating almost entirely in Le Guin quotes? I don't see why not.

Wed Jan 24 10:06:25 +0000 2018

Tue Jan 30 08:30:28 +0000 2018

Tweets from December 2017

New Annihilation trailer looks pretty sweet:

Thu Dec 14 08:38:50 +0000 2017

The new SF Humble Bundle includes Octavia Butler's entire Seed to Harvest series and the Cyberiad by Stanisław Lem.

Sat Dec 23 13:11:08 +0000 2017

The Long List Anthology vol 1 & 2 edited by David Steffen: as expected, these were excellent selections of stories…

Sat Dec 23 13:27:13 +0000 2017

Clockwork Boys book 1 by Ursula Vernon: if you have a Pratchett-shaped hole in your life, and you like fantasy RPG…

Sat Dec 23 13:28:58 +0000 2017

Tender by Sofia Samatar: a collection of short stories. I especially liked the novella (novelette?) about a generation starship.

Sat Dec 23 13:31:06 +0000 2017

Trees and Other Wonders by Stephen Case: a collection of stories, many of them about trees, in various genres. I liked it.

Sat Dec 23 18:09:20 +0000 2017

Want to learn programming? Have a look at this coding-focused Humble Bundle:

Tue Dec 26 16:38:14 +0000 2017

Tweets from November 2017

Upside Down: Inverted Tropes in Storytelling (anthology): I found this very hit-and-miss -- a lot of the stories we…

Wed Nov 08 14:02:55 +0000 2017

Longer, more rambling book reviews without obscr abbrvtns brought to you by Twitter's expanded character limit.

Wed Nov 08 14:05:28 +0000 2017

Adorable spider animation

Wed Nov 08 15:04:27 +0000 2017

For all my CLAWs peeps: parallel evolution in the wilds of Tumblr produces a CLAWmarks Archbigot of the Necropolis…

Thu Nov 09 17:40:16 +0000 2017

The Just City by Jo Walton: a story about a social experiment complicated by gods and robots. Does not require exte…

Fri Nov 10 07:55:00 +0000 2017

An interesting thread about the rationale behind organising community tech events in pubs in Australia. (Here the d…

Sat Nov 11 05:37:29 +0000 2017

Caution: use headphones if you have cats.

Sat Nov 11 08:43:02 +0000 2017

@firstconversion Yeah, my concern would be excluding people who for various reasons won't go somewhere where alcoho…

Sun Nov 12 08:27:55 +0000 2017

@firstconversion During / after work is another interesting issue. Sometimes people will come to daytime coding eve…

Sun Nov 12 08:30:16 +0000 2017

Here's a really cool data visualisation project: -- mentioned in @c_h_a_r_l's talk at #dotAstronomy 9.

Tue Nov 14 13:53:48 +0000 2017

Best uses of extended Twitter name field seen so far: 1. criticism of Twitter's abuse policies; 2. Bobby Tables jokes.

Wed Nov 15 09:16:32 +0000 2017

@AstroBrigi @iva_momcheva @eteq @kellecruz @dotastronomy @aperio_software SWC focuses on beginner stuff, partially…

Wed Nov 15 20:07:09 +0000 2017

@AstroBrigi @iva_momcheva @eteq @kellecruz @dotastronomy @aperio_software SWC is intended to be an in-person worksh…

Wed Nov 15 20:11:28 +0000 2017

Tweets from October 2017

This birb is extremely interested in our food. #pyconza17 DLY6BvJWAAAc_tS.jpg

Thu Oct 05 16:53:58 +0000 2017

My SFF-reading, Calibre-using friends, I blogged about cataloguing my book collection:

Sat Oct 07 13:51:10 +0000 2017

"Cat's Eye of Sauron"

Sat Oct 07 14:40:48 +0000 2017

SCA peeps, here's a video explanation of how people used to walk in the Middle Ages:

Sat Oct 07 14:53:43 +0000 2017

And this is what I've been doing instead of working on the Calibre plugin:

Sat Oct 07 17:27:46 +0000 2017

Somewhere Beneath Those Waves by Sarah Monette: I really enjoyed most of the stories in this collection, and recommend it.

Sun Oct 08 07:14:30 +0000 2017

@TheRiver I remember seeing a review that said something like "I'm not really sure why this movie exists, but apart…

Sun Oct 08 09:58:41 +0000 2017

@TheRiver In related news, I quite liked this article about the original:

Sun Oct 08 09:59:44 +0000 2017

This SF book bundle includes a bunch of really cool books: Particular shout-out to Eleanor Arnason.

Mon Oct 09 08:28:46 +0000 2017

Installing Not Tetris on a recent Ubuntu version

Not Tetris is an awesome game which is just like Tetris except not. Everyone should play this game. Unfortunately, it was built with a very old version of the Löve game engine, which makes it tricky to install on a modern system.

Building Löve 0.7.2 on Ubuntu Zesty is failing for me for some reason, although hopefully this is a fixable issue. Edit: you fix it by installing headers for SDL 1.2 and Lua 5.1 -- then you can check out and build the source, which is much simpler. The executable from the 0.7.2 Ubuntu Precise package works just fine, however -- here are streamlined instructions for extracting it and instaling it locally in your own bin directory.

(You can also just install the package with dpkg, copy the executable and then uninstall it (so that it isn't overwritten by the updated version of the same package), but it's much less tedious to extract the package without installing it.)

# Work in a subdirectory to make it easier to clean up
mkdir tmp
cd tmp

# This is the package for amd64; replace with other architecture if applicable

# Extract
ar x love_0.7.2-1build1_amd64.deb
tar -xzf data.tar.gz

# Copy executable
cp usr/bin/love-0.7 ~/bin/

# Clean up
cd ..
rm -rf tmp

Make sure your ~bin is in your path.

Now you can get Not Tetris!

# Get the ZIP and put it in a sensible place
mkdir -p ~/Games/NotTetris
cd ~/Games/NotTetris
wget ''

# Unpack

First let's make an executable wrapper you can run on the commandline:

echo 'love-0.7 ~/Games/NotTetris/Not\ Tetris\' > bin/nottetris
chmod +x bin/nottetris

Now you should be able to launch the game with the command nottetris. You can also integrate it into the XDG menu. Put this into ~/.local/share/applications/nottetris.desktop:

[Desktop Entry]
Name=Not Tetris
GenericName=Not Tetris

Now it should also appear in your menu under Games.

Happy Not Tetrising!

Using Calibre to catalogue a physical speculative fiction book collection

The problem

I have a large collection of paper books, which I am slowly entering into Calibre as empty book records, so that I can have a more easily accessible record of what I do and do not own.

I initially thought that I could make the data capture trivial by scanning the ISBN barcodes of the books with a phone app. Then I would enter a list of ISBNs into Calibre, push a button to fetch metadata for them automatically, and everything would Just Work, like magic.

I was wrong for various reasons:

  • A lot of my books predate the existence of ISBNs.

  • I want my virtual book records to match my physical books as closely as possible -- but an ISBN is not an unambiguous identifier of a particular edition of a book. Multiple editions with completely different covers can share the same ISBN.

  • Calibre wasn't really designed for this kind of pedantic cataloguing of physical objects, so it doesn't really care about these distinctions. It also helpfully smushes metadata records together if their ISBNs match, and there is no way to make it stop.

  • The default public metadata sources that Calibre uses don't even have metadata for the vast majority of old editions of SFF books.

The solution

A really good source of metadata for old SFF books is ISFDB, the Internet Speculative Fiction Database. And there is a plugin for Calibre which scrapes metadata from it! Unfortunately it hasn't been updated in several years, and ISFDB's HTML periodically changes. So I am maintaining a fork, which I tweak whenever I enter a new batch of books and discover that something has broken. I have also started a reimplementation, in which I hope to include all the little bits of data entry glue that I am about to describe.

My current workflow

  1. I take a pile of books and look them up on ISFDB in my browser (Firefox). I usually process one author at a time, since it's the most efficient way to find multiple book titles at once. I search each title page for the specific edition which most closely matches the physical copy I have. This record is uniquely identified with an ISFDB ID which appears in the URL and on the publication page.

  2. At this point I would previously laboriously copy the ISFDB IDs from all the open ISFDB pages by hand into a text file, and then run a script to create entries in Calibre with these identifiers. The manual copying became very annoying very quickly, so I hacked together a Python script which automatically extracts these identifiers from the currently open tabs in a running Firefox session. Now I can pipe the output of this script to the script which creates records.

  3. At this point I have some empty records with only the ISFDB ID set (and also some custom columns which are not related to the metadata). Now to avoid the record-smushing issue I disable all metadata sources except ISFDB (important!) and fetch metadata for all the records. If an ISFDB ID is present, my fork of the plugin will ignore all other data (like author and title) and use only the ID in its search, so assuming that I have found the correct records in step one the download is guaranteed to fetch the correct data.

  4. Now I do some manual cleanup, like fetching or correcting cover images which were missing from ISFDB.

The Horrible Firefox Hack

Edit: The latest versions of Firefox store the session in an lz4-compressed json file rather than an uncompressed json file, which necessitates the update below (thanks, StackOverflow!). You will need to install the lz4 library.

#!/usr/bin/env python3


import lz4
import json
import re

f = open(firefox_session_path, "rb")
magic =
session = json.loads(lz4.block.decompress("utf-8"))

tabs = []

for w in session["windows"]:

urls = [t["entries"][-1]["url"] for t in tabs]

for u in urls:
    m ="www\.isfdb\.org/cgi-bin/pl\.cgi\?(\d+)", u)
    if m:

The Record Creation Script (marvel at my consistent naming conventions):


while read id
#for id in `cat $@`
  calibredb add -e -I isfdb:$id
  added_id=`calibredb search -l 1 identifiers:isfdb:$id`
  if [ -n "$added_id" ]
    calibredb set_custom "shelf" $added_id "SFF"
    calibredb set_custom "read" $added_id "1"
done < "${1:-/dev/stdin}"

In addition to creating a new record with the ISFDB ID filled into the identifier field with the appropriate prefix, I also set two custom columns to mark the book as read and file it in the correct category, which I have called a shelf. You can edit this to set whatever custom values you want, or remove it entirely.

Assuming that both scripts are executable and in your path, you can put them together like this: |

Future work

In the reimplementation I hope to incorporate an entry field for ISFDB IDs and the magical Firefox session scraping directly into the plugin, so that the whole process is more streamlined, not operating system-dependent, and more usable by other people. In the meantime, if you use some flavour of Unix, you may be able to use my very messy current setup with minor modifications.

If you have comments, questions or rotten tomatoes, contact me on Twitter or file an issue against the reimplementation on GitHub (even though it currently doesn't exist).