Miskatonic University Press


john.cage theatre

“You just happened to be sitting in the right seat.” So true.

Tonight I went to see Cage at Soulpepper. I didn’t know anything about it except it starred Diego Matamoros and had something to do with John Cage, so I couldn’t miss it. It was wonderful.

Seats were set up in two rows in a square around the set in the middle. The set was a very large clear box.

Cage cage.
Cage cage.

On all sides and in the corners were tables with equipment: computers, radios, a violin, a mixing board, and more things I couldn’t see, some of which turned out to be ping pong balls, an abacus and an egg.

Cage displays.
Cage displays.

There was an upright piano with the front taken off, which looked interesting, and it had an empty seat beside it, so I sat there. It was on my right. A man was moving around checking things. Here he is at the violin.

Cage preparation.
Cage preparation.

A test pattern, or something like it, was being projected on displays made up of large index cards with drawings and what I think were John Cage quotes and Zen sayings.

Cage index cards.
Cage index cards.

Three people in grey came in and sat at desks. The show began. The lights went out, then neon bulbs flickered off and on and slowly the stage lit up. A wild seventy minutes began: closely miked sounds of water being poured, ping pong balls bouncing, an egg being whisked, an abacus being shook, and a lot more, all to what seemed to be a very tightly arranged score; Diego Matamoros in a white suit telling us, with increasing entropy, an anecdote (true?) about his childhood; Diego Matamoros being a gorilla in the cage; people running around; smoke; a kettle boiling; hundreds of ping pong balls being poured onto the stage; and much more.

Midway through one of the three, the one who’d been checking things, and later played that very violin, was walking around the cage, taking pictures on his phone of Matamoros inside. He showed some to some audience members on the other side. When he got over to my side, he took a few, then asked me if I’d take a picture of him in front of the cage. “Sure,” I said, and snapped a few. “How about we get a selfie together in front of him?” he asked. I got up (limping a bit because my leg had fallen asleep), smiled, and he took a few. I sat back down.

Cage selfie.  Photograph © Richard Feren (2017).
Cage selfie. Photograph © Richard Feren (2017).

My first thought: I wasn’t expecting that. My second: I trod the boards with Diego Matamoros!

A few seconds later that image was being projected on the displays on all four sides of the stage, on top of the index cards. It’s surprising enough to be pulled into a performance, but it’s even more so when your digitally manipulated face is all around you in a theatre.

My third thought: What a night!

Later Matamoros began moving the cage, spinning it on stage, at one point knocking into the theremin that was across from me, but an audience member grabbed it. The cage got painted. By the end of the show, it looked like this.

Cage cage at end of show.
Cage cage at end of show.

Matamoros made tea and set four small cups out in squares of light. He and the three sat down by them. The displays read 4’ 33”. A triangle sounded and the clock began to tick down, second by second. We all sat in silence. One by one, the four left. The clocked ticked down to 0. The lights slowly came back to normal. We sat, unsure, then eventually began to clap.

A quote from Cage was on the screens:

Our intention is to affirm this life, not to bring order out of chaos, nor to suggest improvements in creation, but simply to wake up to the very life we’re living, which is so excellent once one gets one’s mind and desires out of its way and lets it act of its own accord.

Cage quote.
Cage quote.

We clapped for quite a while, but of course after an ending like no one is going to take a bow.

In the lobby I saw the man who’d done the selfie with me and asked if I could get a copy. He said sure, and sent me a copy. I told him what a great show it had been, and asked him to give my congratulations to everyone. He thanked me for pitching in, and said, “You just happened to be sitting in the right seat.” Damn right I did.

When I got home and looked in the program, I saw that man was Richard Feren, who was behind @TOMayorFrod and @WKRPinTO!

I checked my email to look at the photo, and my old friend Andrew Kines had emailed to ask if I’d been to see Cage and maybe had my photo taken during the show. It turns out he was at university with Feren and has known him for decades, and had seen the picture when Feren posted it on Facebook.

This was a night of many coincidences and chance arrangements. This was a John Cage night.

Between the show and getting home, I was on the streetcar. Passing Yonge and King, I saw a woman, panhandling, sitting in the intersection. It was night, she was in dark clothes, sitting on the street, smoking a cigarette and waving an empty coffee cup around. People were walking by. Cars were pulling away to avoid her. I called 911. A woman answered and said something I couldn’t make out, but I knew she was asking which emergency service I needed. “Police.”

“What is the emergency?”

“There is a woman, a panhandler, sitting in the street at the southeast corner of Yonge and King. Not on the sidewalk, in the street.”

“You mean in the roadway, where she might get hit by a car?”


“We’ll send someone right over. Thank you.”

I made it home all right. I hope everyone else did too.

(Credits: the show was created by Diego Matamoros (performer and writer), Richard Feren (composer and sound designer) and Lorenzo Savoini (production designer). Feren took the photo of me and him. He posted it on Facebook, which I gave permission for, and said I’d post it on my site too. He said OK. I hope they don’t mind the other photos.)



The year before last I installed CyanogenMod on my Samsung Galaxy S3. I said “it’s like having a new phone.” A little while after writing that, I realized: but one that isn’t as good as my old phone. It kept dropping off the phone network! Of all the things a phone should be able to do, making phone calls is at the top of the list. Going underground on the subway and coming back out meant it could take up to two minutes to reconnect to the cell network, too. That’s not good. Still, almost all the time, the phone worked, and if I had my problems, they were minor in the grand scheme of things. I can handle technical problems. They are dispreferred indifferents, and ultimately not really important—except, pragmatically, if there’s an emergency and I need to call 911, which, I’m happy to say, never happened.

Installing CyanogenMod took me to a newer version of Android than my phone company was providing, but I didn’t upgrade it, so until last week I was running Android 4.4, which was very out of date and a big security problem. Also, the battery life was terrible. Sometimes when I was using the phone I could see the battery percentage ticking down as I did things. Late last year I decided I really had to do something, but CyanogenMod died and LineageOS took over.

Two cats.
Two cats.

On the weekend I upgraded to LineageOS 14.1, so now I’m running Android 7.1.1. It’s much better. It really is like having a new phone. Here’s an outline of what I did:

  • Made a list of all the apps I had installed, from the Play Store and F-Droid.
  • Turned on adb.
  • Backed up half a dozen things I really need, like my Tasker config, with adb, for example cd ~/android/backups/Tasker; adb pull -a /sdcard/Tasker/ . or my ringtones, with cd ~/android/backups/Ringtones, adb pull -a /sdcard/Ringtones/ . Made sure to back up my contacts information, which I don’t synchronize to Google.
  • Did a full backup of everything (making sure to OK it on the phone): adb backup -apk -shared -all
  • Noted important information from apps I couldn’t back up.
  • Forgot to back up my Signal messages. Ah well.

(There are a lot of ways to copy files off your Android device. If you grok the command line, adb is the nicest.)

I had TWRP installed, but doing a backup in it ran out of space, so I deleted a lot of apps and data on my phone until a backup worked. Then I updated TWRP:

  • Downloaded the latest image.
  • Connected phone with adb.
  • adb push twrp-3.1.0-0-d2att.img /sdcard/
  • Rebooted phone into TWRP.
  • Followed the instructions: “Go to install and find and select the Images… button. Browse to the image that you downloaded and select it. Choose recovery and swipe to flash.”
  • Rebooted.

Then I was ready to upgrade to LineageOS.

  • Followed the d2att instructions.
  • Downloaded the LineageOS install package.
  • adb push lineage-14.1-20170313-nightly-d2att-signed.zip /sdcard/
  • Got the ARM 7.1 nano distribution of Open GApps.: Google Apps.
  • adb push open_gapps-arm-7.1-nano-20170319.zip /sdcard/
  • Got the su add-on (ARM binary, in my case).
  • adb push addonsu-arm-signed.zip /sdcard/

I rebooted into recovery and installed all of those images. No problem.

I rebooted from recovery and it got stuck in boot, just showing the moving logo thingie. I got a bit worried: had a I bricked my phone? I powered it off, rebooted from cold, and then it worked! I made a test phone call and it worked. My phone was OK! Now it was all up to reinstalling apps and data.

One cat.
One cat.

In settings, About Phone, I tapped seven times on the build number to enable developer options. Then I began installing everything I need on my phone:

  • Disabled synchronizing information to Google.
  • Pushed contacts with adb and imported them.
  • Downloaded and installed F-Droid (had to permit installation of unknown apps).
  • Tweaked and fiddled with various settings.
  • Began reinstalling the apps I use.

I’ll do another post about those apps and my current configuration, but the important thing is that it all worked. I’ve even flashed a LineageOS update between the big change and writing this. I had to power off and do a cold restart again, but it worked, and

About my phone.
About my phone.

Executive summary: It worked.

RSS feed analysis

blogs r ruby

I follow over sixty one hundred and twenty blogs and feeds, split between two different readers: Planet Venus for regular checking with my browser during the day (this is the same system behind Planet Code4Lib) and Elfeed in Emacs at home. My planet has frequently-updated feeds, things I don’t want to miss, and shorter posts; Elfeed I use for infrequently updated sites or sites with long complex content I may want to read later.

My planet is hosted at Pair, where I have access to a shared server, but the script kept getting killed off because it was using too much CPU time. I decided to do some analysis to figure out which sites post the most and how to best arrange feeds between the planet and Elfeed to suit my reading habits.

The Elfeed config file looks like this (in part):

(setq elfeed-feeds
	"https://www.miskatonic.org/feed.xml" ;; Miskatonic University Press
	;; Libraries
	"http://www.open-shelf.ca/feed/" ;; Open Shelf
	;; Sciences
	"http://blog.stephenwolfram.com/feed/atom/" ;; Stephen Wolfram
	"http://www.animalcognition.org/feed/" ;; Animal Cognition
	"http://around.com/feed" ;; James Gleick
	;; Literature and writing
	"https://feeds.feedburner.com/ivebeenreadinglately" ;; Levi Stahl
	"https://picturesinpowell.com/feed/" ;; Pictures in Powell

The planet config (stored on my hosted service) looks like this (in part)

name = Q2 Music Album of the Week

name = Ethan Iverson

name = Cathy ONeil

name = Pen Addict

To pick out all of the live (not commented) feeds I use the prepare directive in this makefile (which is in ~/src/geblogging/, where I run all these commands):

all: prepare fetch

	grep -v \;\; ~/.emacs.d/setup/setup-elfeed-subscriptions.el | grep http > feedlist.txt
	scp host:planet/planet-config.ini .
	grep -v \# planet-config.ini | grep http | grep -v link >> feedlist.txt
	rm planet-config.ini

	gebloggen.rb feedlist.txt > feeditems.csv

make prepare does the following:

  • delete everything after ;; (comments; this is Lisp) in each line in the Elfeed config then pick out all the lines containing http, and put them in a file
  • download my planet config
  • pick out all the lines in the planet config that don’t start with # (comments; this is an ini file), then pick out all the lines containing http, ignore any lines mentioning link (there is one, part of the planet config), and add them to the file
  • delete the downloaded planet config

feedlist.txt looks like this:


Next I run gebloggen.rb, which reads in that list, picks out the URL from the formatting, downloads the feed, and outputs a simple CSV. I’ll leave my commented-out debugging lines.

#!/usr/bin/env ruby

require "csv"
require "feedjira"

puts "source,feed,date"

ARGF.each do |feed_url|
  source = ""
  if feed_url =~ /"/
    # In setup-elfeed-subscriptions.el the feeds are in quotes,
    # so pick them out and ignore everything else on the line.
    feed_url = feed_url.match(/"(.*)"/)[1]
    source = "E"
  if feed_url =~ /\[/
    # In setup-elfeed-subscriptions.el the feeds are in quotes,
    # so pick them out and ignore everything else on the line.
    feed_url = feed_url.match(/\[(.*)\]/)[1]
    source = "P"
  # puts feed_url + " ..."
    feed = Feedjira::Feed.fetch_and_parse(feed_url)
    # puts "Title: #{feed.title}"
    feed.entries.each do |item|
      puts [source, feed.url.chomp, item.last_modified.to_date.to_s].to_csv ## item.title.gsub("\n", "")
      # puts item.title
  rescue StandardError => e
    STDERR.puts "ERROR: #{feed_url}: #{e}"

If I run make then both the prepare and fetch directives are run, and the CSV, feeditems.csv, is made from scratch. It takes a little while to download all the feeds, but when it’s done it looks like this:


A source of E means Emacs (or Elfeed), and P means Planet.

This file is easy to load up into R for some analysis.

items <- read_csv("feeditems.csv")

With the data loaded into a data frame, it’s easy to parse in a few ways. First, posts by date.

items %>% filter(date >= Sys.Date() - months(6)) %>% group_by(date) %>% summarise(count = n()) %>% ggplot(aes(x = date, y = count)) + geom_bar(stat = "identity") + labs(title = "Dates of posts in last six months", x = "", y = "")
Posts per day in the last six months.
Posts per day in the last six months.

Next, items per feed.

items %>% filter(date >= Sys.Date() - months(6)) %>% group_by(feed) %>% summarise(count = n())  %>% ggplot(aes(count)) + geom_bar() + labs(title = "Items per feed in last six months", x = "", y = "")
Items per feed, in the last six months.
Items per feed, in the last six months.

That spike there is 10: a lot of RSS and Atom feeds show the most recent ten posts. The outlier there at 98 is British music magazine The Wire.

A table listing items per feed is easy (in all these tables I only show a few example lines):

items %>% filter(date >= Sys.Date() - months(6)) %>% group_by(source, feed) %>% summarise(count = n()) %>% arrange(source, desc(count))
| source | feed                                | count |
| E      | https://www.miskatonic.org          |    20 |
| E      | http://www.open-shelf.ca            |    10 |
| E      | http://accessconference.ca          |     3 |
| P      | https://www.penaddict.com/          |    20 |
| P      | https://ethaniverson.com            |    10 |
| P      | https://mathbabe.org                |    10 |

This lists the feeds that have not posted in the last six months, and gives the date of the most recent post:

items %>% group_by(source, feed) %>% mutate(latest = max(date)) %>% ungroup %>% distinct(source, feed, latest) %>% filter(latest <= Sys.Date() - months(6)) %>% arrange(source, latest)
| source | feed                                  |     latest |
| E      | https://praxismusic.wordpress.com     | 2016-01-04 |
| E      | https://blogs.princeton.edu/librarian | 2016-03-24 |
| E      | https://www.zotero.org/blog           | 2016-04-13 |

Frequency of posts is interesting. This figures out the number of days between posts in the feed as it is. 1 means about one post per day, 34 means on average less than one post per month.

items %>% filter(date >= Sys.Date() - months(6)) %>% group_by(source, feed) %>% mutate(date_range = max(date) - min(date)) %>% group_by(source, feed, date_range) %>% summarise(count = n()) %>% mutate(frequency = round(date_range / count), 1) %>% select(source, feed, frequency) %>% arrange(source, desc(frequency))
| source | feed                                   | frequency |
| E      | http://accessconference.ca             |        42 |
| E      | http://www.animalcognition.org         |        34 |
| P      | http://www.thewire.co.uk/home/         |         1 |
| P      | https://ethaniverson.com               |         1 |
| P      | https://www.penaddict.com/             |         1 |

The first thing all this analysis helped me do was identify blogs that I wasn’t very interested in and that also didn’t post much. Cleaning those out was a great first step. Then looking at these tables told me what I needed to know to shuffle around where I read the different feeds, and now everything is working pretty well. I’ll keep tweaking as needed.

Jughead is hip


Jughead is hip.

Archie buys tickets to Lenny Z.
Archie buys tickets to Lenny Z.

Jughead knows the scene. You don’t go see some easy-listening clown who comes to Riverdale.

Jughead lays it out.
Jughead lays it out.

Is Jughead also cool? That requires more thought. He is definitely hip. Being a drummer helps.

Archie, for all his merits, is neither hip nor cool.

Per cent signs in crontabs


I learned something new—very minor, but still new—about cron jobs this week: if you use a per cent sign in the scheduled command, you need to escape it.

The documentation about cron can be hard to find. man cron shows “cron (8) - daemon to execute scheduled commands” (the 8, according to man man, meaning it’s a system administration command). But if you’re trying to figure out how to schedule a job, you don’t want to know about the daemon that takes care of the work. man crontab shows “crontab (1) - maintain crontab files for individual users”, which is the command to edit the crontab. The format of the crontab is found with man 5 crontab (5 meaning it’s to do with “file formats and conventions”), which shows “crontab (5) - tables for driving cron”.

I always forget how to schedule cron jobs beyond minute and hour, so pretty much every time I set up a new one I need to run man 5 crontab. I must have looked at it hundreds of times, but I never noticed about % until I ran into a problem.

I had something like this set up:

0 5 * * * YYYYMMDD=`date +%Y%m%d`; touch ~/tmp-$YYYYMMDD.txt

That creates a date-stamped file at 5 am every day. It works fine on the command line, but when cronned up I got these errors in email:

/bin/bash: -c: line 0: unexpected EOF while looking for matching ``'
/bin/bash: -c: line 1: syntax error: unexpected end of file

That didn’t make any sense, but this explained it:

The ``sixth’’ field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the crontab file. Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input. There is no way to split a single command line onto multiple lines, like the shell’s trailing “\”.

This works:

0 5 * * * YYYYMMDD=`date +\%Y\%m\%d`; touch ~/tmp-$YYYYMMDD.txt

I’ve never had occasion to use % to send STDIN to a command, or seen it used, but there must be some reason for it somewhere in Unix history.

Review: Are Numbers Real?

mathematics reviews

Brian Clegg’s new book Are Numbers Real? The Uncanny Relationship of Mathematics and the Physical World caught my eye somewhere and I ordered a copy for the library where I work. When it came in I borrowed it and began it with interest, but it turns out it has nothing to do with whether numbers are real, and is an idiosyncratic, cursory and ultimately unfulfilling overview of the history of the relationship of mathematics and physics.

Screen capture from the Gobi book ordering system.
Screen capture from the Gobi book ordering system.

The book begins promisingly:

Our journey in this book will explore a question that is fundamentally important to scientists—and for that matter the rest of us. Yet it’s a question that most people, including scientists, rarely give a moment’s thought to. Are numbers real, and is the wider concept of mathematics, real?

You can point to two oranges or two chairs, but can you point to two? Does two exist? That seems to be the question the book is going to be about … except it isn’t. And this question is not “fundamentally important” to scientists or anyone else except mathematicians. People interested in the philosophy of mathematics care about this, but no one else really does. They use numbers—numbers that work very well to describe the world—but don’t wonder about where numbers come from or if they would exist if there were no intelligent beings in the universe. Did one or five or π exist just after the big bang? Do people discover mathematical truths, or invent them?

Outside the Royal Ontario Museum in Toronto.
Outside the Royal Ontario Museum in Toronto.

Who cares? Not many people, but for those who do, don’t read this book, because it’s not about that. There’s nothing serious about mathematical platonism or any other philosophy of mathematics. You get a cursory history of math and physics, with attention to the ancient Greeks, Roger Bacon (about whom Clegg also wrote a book—there are many mentions of his other books), Newton, Georg Cantor, and quantum mechanics and string theory, with some discussion of how in physics advances have been made by just dealing with the math and not caring about what it represents, and there’s mention of Wigner’s The Unreasonable Effectiveness of Mathematics in the Natural Sciences. That’s all well enough, but it’s a bit ramshackle.

Clegg concludes:

To come back to the question in the title of the book—numbers, I would suggest, are real at their most basic, but most of mathematics isn’t. It’s a fantasy world that sometimes mirrors and parallels our own, and as such can help provide us with tools to help understand reality. But it needs to be kept in its place. And as long as we (and scientists) remember this, we can’t go far wrong.

There is no discussion, much less justification, in the book for the idea that numbers are real. If they are, how do we apprehend them? Can we touch them? This is a serious issue. This book was no help. Time to go back to Benacerraf and Putnam’s classic Philosophy of Mathematics: Selected Readings.

Steve Reich is Calling


Seen on Ethan Iverson’s blog: Steve Reich is Calling.

Yardstick Covers


I was curious about needlepoint and wanted to see the rules and algorithms behind the stitches, and also just to learn more about how it works. I got The Needlepoint Book (3e) by Jo Ippolito Christensen from the library: it’s a thorough introduction and answered all my questions for now. Needlepoint looks like an interesting craft and hobby, but it’s not for me, at least right now. I’d rather have a pen or brush in hand.

Early in the book there’s a page that lists all the many purposes to which needlepoint can be put. They include: address book cover, bicycle seat cover, blender cover, bridge score pad cover, button cover, calculator cover, card table cover, cell phone cover, chair cover, checkbook cover, and many other things, usually covers. The penultimate is, for me, the ultimate: yardstick cover.

Yardstick cover.
Yardstick cover.

Yardstick cover.

List of all blog posts