Tweets from May 2018

Came for the jellied pork; stayed for the Slav food nostalgia. :D https://www.youtube.com/watch?v=FwbnzEJSbRg&list=PLbS0HkS8Xsorrdr3pPk4lP80tUAzfyxP1

Sun May 06 19:26:38 +0000 2018


https://imgur.com/a/yfxK9z9

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… https://twitter.com/i/web/status/995414533001883650

Sat May 12 21:24:53 +0000 2018


Rosemary Kirstein will be doing a Reddit AMA on June 14! http://www.rosemarykirstein.com/2018/05/upcoming-reddit-ask-me-anything-on-june-14th/ If you haven't read the Steerswoma… https://twitter.com/i/web/status/995922062425427968

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,… https://twitter.com/i/web/status/996712760443588609

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… https://twitter.com/i/web/status/996713845661069313

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… https://twitter.com/i/web/status/996714306946420737

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… https://twitter.com/i/web/status/996714507685847041

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… https://twitter.com/i/web/status/996731540372680706

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… https://twitter.com/i/web/status/996731767758475264

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… https://twitter.com/i/web/status/998881663907135488

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. https://bundleofholding.com/presents/Mindjammer

Tue May 22 11:26:47 +0000 2018


Vampires vs Werewolves https://www.youtube.com/watch?v=gE80Mdv7eTs

Tue May 22 16:49:52 +0000 2018


Sofia Samatar is doing an AMA in /r/Fantasy! https://www.reddit.com/r/Fantasy/comments/8lro18/hi_im_sofia_samatar_sf_and_fantasy_writer_ama/

Thu May 24 11:55:21 +0000 2018


The Rabbit in Yellow. I want one! https://twitter.com/prostheticknowl/status/999388851016732673

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… https://twitter.com/i/web/status/1001014943355895808

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… https://twitter.com/i/web/status/1001017049097916416

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… https://twitter.com/i/web/status/1001052182299512832

Mon May 28 10:46:53 +0000 2018


Remember Voice of Baceprot? They have a music video! https://www.youtube.com/watch?v=4aZX-C8HKJc

Wed May 30 11:05:35 +0000 2018


Maths joke! Paging @astrolabe_cat https://www.smbc-comics.com/comic/math-and-war

Wed May 30 15:25:53 +0000 2018

Tweets from April 2018

Tweets from March 2018

https://www.youtube.com/watch?v=DIBw9dSVKdU

Fri Mar 02 17:26:21 +0000 2018


Yay, a trailer for The Expanse S3! https://www.youtube.com/watch?v=MowKgO0IeyU

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… https://twitter.com/i/web/status/973185015084474369

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… https://twitter.com/i/web/status/973185685741080576

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 --… https://twitter.com/i/web/status/973186156065099776

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… https://twitter.com/i/web/status/975303926592491520

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… https://twitter.com/i/web/status/976724912676261889

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… https://twitter.com/i/web/status/976969770426949632

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… https://twitter.com/i/web/status/976971235279228928

Thu Mar 22 23:57:48 +0000 2018


Awesome life hack. https://www.youtube.com/watch?v=WkCxXErb2Ag

Tue Mar 27 14:39:42 +0000 2018

Tweets from February 2018

Paging @autumnal_akika and @DarkOutThere :D https://twitter.com/storybrewers/status/959911301865660416

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… https://twitter.com/i/web/status/962443887582302208

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… https://twitter.com/i/web/status/962444350406955009

Sat Feb 10 21:53:09 +0000 2018


@TheRiver It's not mine! It comes from here: https://www.tor.com/2010/09/28/the-suck-fairy/ -- I've always liked the metaphor. I disliked… https://twitter.com/i/web/status/962459792483717120

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… https://twitter.com/i/web/status/962460997020766210

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. https://www.groundup.org.za/article/stop-drought-conspiracy-theories/

Mon Feb 26 10:35:44 +0000 2018


It's unclear whether Bradbury is rolling in his grave, but this looks pretty cool. https://www.youtube.com/watch?v=UEhsFEgsI5U

Tue Feb 27 10:53:00 +0000 2018


(OK, he only mostly hated television. http://mentalfloss.com/article/78834/what-kurt-vonnegut-and-ray-bradbury-thought-about-television)

Tue Feb 27 10:55:04 +0000 2018


And now, for something completely different. https://www.youtube.com/watch?v=7vDnjU_3X1o

Tue Feb 27 15:55:38 +0000 2018


Heeeey, the Bundle of Holding has an Unknown Armies bundle. https://bundleofholding.com/presents/UnknownArmies2018

Wed Feb 28 21:36:26 +0000 2018

Tweets from January 2018

You had one job. https://twitter.com/JennMUA/status/949050453974814720

Sun Jan 07 01:40:15 +0000 2018


This is awesome. Comixology now offers DRM-free downloads of comics from participating publishers.… https://twitter.com/i/web/status/954798199662960641

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… https://twitter.com/i/web/status/956105172622692352

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. https://twitter.com/magpiekilljoy/status/955937681397157888

Wed Jan 24 10:06:25 +0000 2018


https://www.youtube.com/watch?v=FmNe7VjKjag

Tue Jan 30 08:30:28 +0000 2018

Tweets from December 2017

New Annihilation trailer looks pretty sweet: https://www.youtube.com/watch?v=89OP78l9oF0

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. https://www.humblebundle.com/books/galaxy-of-stars-books

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… https://twitter.com/i/web/status/944560024310964227

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… https://twitter.com/i/web/status/944560463232331776

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: https://www.humblebundle.com/books/be-a-coder-books

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… https://twitter.com/i/web/status/928261553899614208

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 https://www.youtube.com/watch?v=VrS6akzR3sk

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… https://twitter.com/i/web/status/928678639172050945

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… https://twitter.com/i/web/status/928893739275309056

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… https://twitter.com/i/web/status/929221522824327168

Sat Nov 11 05:37:29 +0000 2017


Caution: use headphones if you have cats. https://twitter.com/frantakeery/status/927753966422765568

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… https://twitter.com/i/web/status/929626800845737985

Sun Nov 12 08:27:55 +0000 2017


@firstconversion During / after work is another interesting issue. Sometimes people will come to daytime coding eve… https://twitter.com/i/web/status/929627390187274241

Sun Nov 12 08:30:16 +0000 2017


Here's a really cool data visualisation project: http://www.dear-data.com/theproject -- 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… https://twitter.com/i/web/status/930889930586427398

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… https://twitter.com/i/web/status/930891019675160576

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: http://confluence.locustforge.net/blog/posts/isfdb-calibre/

Sat Oct 07 13:51:10 +0000 2017


"Cat's Eye of Sauron" http://confluence.locustforge.net/blog/posts/isfdb-calibre/

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: https://pictorial.jezebel.com/this-video-of-how-medieval-people-walked-is-oddly-compe-1819217663

Sat Oct 07 14:53:43 +0000 2017


And this is what I've been doing instead of working on the Calibre plugin: http://confluence.locustforge.net/blog/posts/not-tetris-ubuntu/

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… https://twitter.com/i/web/status/916966067959934976

Sun Oct 08 09:58:41 +0000 2017


@TheRiver In related news, I quite liked this article about the original: https://www.tor.com/2017/10/03/this-future-looks-familiar-watching-blade-runner-in-2017/

Sun Oct 08 09:59:44 +0000 2017


This SF book bundle includes a bunch of really cool books: https://www.humblebundle.com/books/adventures-in-science-fiction-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
wget https://launchpad.net/ubuntu/+archive/primary/+files/love_0.7.2-1build1_amd64.deb

# 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 'http://stabyourself.net/dl.php?file=nottetris2/nottetris2-linux.zip'

# Unpack
unzip nottetris2-linux.zip
rm nottetris2-linux.zip

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

echo 'love-0.7 ~/Games/NotTetris/Not\ Tetris\ 2.love' > 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]
Encoding=UTF-8
Value=1.0
Type=Application
Name=Not Tetris
GenericName=Not Tetris
Exec=nottetris
Categories=Game

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.

Edit: I am now focusing on the reimplementation -- the fork is pretty much abandoned.

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.

Edit: Recent versions of the lz4 library require you to import lz4.block explicitly.

isfdb_ids_from_firefox.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python3

firefox_session_path="/home/confluence/.mozilla/firefox/mhxsxkg0.default/sessionstore-backups/recovery.jsonlz4"

import lz4.block
import json
import re

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

tabs = []

for w in session["windows"]:
    tabs.extend(w["tabs"])

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

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

The Record Creation Script

calibre-add-from-isfdb.sh (marvel at my consistent naming conventions):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash

while read id
#for id in `cat $@`
do
  calibredb add -e -I isfdb:$id
  added_id=`calibredb search -l 1 identifiers:isfdb:$id`
  if [ -n "$added_id" ]
  then
    calibredb set_custom "shelf" $added_id "SFF"
    calibredb set_custom "read" $added_id "1"
  fi
#done
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:

isfdb_ids_from_firefox.py | calibre-add-from-isfdb.sh

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).