Moving forward after the election

I’ve been mulling over what happened in the election, and what I should do now.

I think these things are key:

  • Just a small difference in turnout would have turned the election around. Any conclusions about the American people that we draw based on that election would still hold true if Hillary had won. Racism, misogyny, xenophobia? They’ve been major components of our culture all along, and that would still be the case if Trump had lost.
  • Michael Moore’s explanation of why Trump would win, in retrospect, was pretty dead on. But there’s one thing I think he gets wrong: “The left has won the cultural wars.” We’re winning — with bare majorities — on some vital issues, but we haven’t won yet. Winning would mean a candidate like Trump would never have had a chance.
  • Education is one of the things that makes the biggest difference, and it’s one we can change. In recent elections, education has not been a great differentiator of voting Republican vs. Democrat. This time it was. Combine that with age and it’s even more dramatic. This is closely related to progress in the culture wars; especially in the case of younger college graduates, there’s a shared vocabulary to talk about social justice and privilege, and a conceptual framework that has become part of our everyday social and political lives rather just abstract academic jargon.

So here’s my strategy:

  • Give money now to the organizations that can help mitigate the short-term damage. The ACLU, Planned Parenthood, and independent investigative journalism are at the top of my list to fight back against abuses of power and help vulnerable people.
  • Pour my energy into things that will help in the longer term. For me, that means my day job at Wiki Education Foundation: helping professors and their students to improve Wikipedia in the areas that really matter.

If you’re a technologist, find ways to use technology to fix democracy. I’ve got some ideas — we need a better social network than Facebook, one that drives reality-based discussion and concrete political action rather than ad clicks — but I’ll save that for another post.

If you’re web developer and you want to volunteer for an open source project that makes a concrete difference in education and public knowlege, I’ve got plenty of cool things you could do for Wiki Education Foundation’s platform. It’s Ruby on Rails and React, and every day professors and college students are using it to improve coverage of important topics on Wikipedia.

Hello from 2016

It’s been more than a year since I’ve blogged. Sigh.

It’s been a good year. I learned Ruby, and I’ve become fluent enough that it’s really fun. I even wrote my first Twitter bot.

github streak

I started running, and have done enough of it that isn’t pure torture.

It looks like we’re staying in Seattle for good — we bought a house, and there’s a guest room for folks passing through — and I love it here. Work is fun, the kids are fun (if exasperating), and more and more family is nearby. The Wikipedia and free culture communities around here are great.

Lot’s more I’d like to write about — stories to tell, pictures to post — but Brighton keeps asking me to play, and I can’t put him off any longer. I think my modest goal will be for this not to be the only post in 2016.

OmniROM: solid Android rom, nice place for newcomers

When my last phone died in December, I decided to steer clear of contracts (so that my family could maybe get off of AT&T once all the contracts on the plan expire) and get a Nexus 5. I’ve usually used Cyanogenmod in the past, but I decided to try out the newer OmniROM this time. The Omni project started last year as a response to Cyanogenmod shifting from a completely volunteer project to a for-profit company — sort of the Canonical of the Android ecosystem. I like that the philosophy of Omni is about respecting users and adding value to the open source Android ecosystem.

One concrete difference from Cyanogenmod is that Omni encourages bug reports for from avid users. (Cyanogenmod does not take bug reports for nightly builds, even though that’s what the users who care most about new features and recent changes tend to use.) When I started using Omni, I noticed a few little things that annoyed me: inconsistent icons, and non-standard capitalization in the menu. So I filed some bugs in their bug tracker. These were minor issues, but the developers were quite responsive. The icons I complained about got fixed after a few days. So I decided to try to scratch my own itch for another bug. I followed their guide for getting set up as a developer, and then I submitted patches to fix the capitalization problems I had noticed. (All I did was change a few strings.) All my patches got merged within a few days of submission. 🙂

OmniROM is still a small project, but so far I think it’s a great place for newcomers who want to try out open source Android development.


Harry Potter notes

We just watched Harry Potter and the Goblet of Fire. At the end, Brighton said:

I feel bad about what happened to Harry Potter. It hurts in my heart.

Also, I love Dumbledore’s eulogy for Cedric Diggory:

…exceptionally hard working, infinitely fair-minded, and most importantly, a fierce, fierce friend.

Something to aspire to.

all IRC, all the time

For a while now, I’ve been chasing the holy grail of IRC: running my own low-power, always-on server that I can connect to from anywhere. After 6+ weeks of uptime, I’m ready to declare my current solution a success. I’m running quassel-core (and other things) on a mini stick computer, and I can connect to it from home or remotely, by desktop, laptop, or Android device (by wifi or data connection).

There are plenty of ways to do this, but it’s taken a while for me to work it out, so I wanted to write it up.

TL;DR: Get at least a dual-core ARM device that runs Linux, install quassel-core and create a PostegreSQL database for it, then use Quassel on your computers and Quasseldroid on Android devices to connect. Use an SSH tunnel to the device when you’re away from your home network.

First, the device to run it on. Just about any ARM device that can run Linux takes care of the low-power part — a rooted Android phone, a Raspberry Pi, or some other mini Android or Linux device. If you can get Debian or some other full distro running (whether natively or as a loop device inside Android), you can probably run quassel-core. But you probably want at least a dual-core device for decent performance. Here is what I’ve tried:

  • Droid Incredible (1 Ghz single core, CyanogenMod with Debian running in a chroot): This worked moderately well, but it was not completely reliable. Every week or so on average, I would have to manually restart it, and it would often have an annoying delay between sending/receiving messages and them appearing in my clients. (I suspect this is an i/o bottleneck.)
  • Raspberry Pi (on raspbmc): Terrible delay, often topping 5 or 10 seconds. While some have reported running quassel-core without issue, others have found it unusably laggy. Anecdotally, this is probably the result of slow SD cards (like the class 4 I was using); I was also using SQLite, and never tested if PostgreSQL would perform better. If you want to try it on an RPi, try a lean and clean distro on a reasonably speedy SD card.
  • MK808B (1.6 Ghz dual core rk3066, Android 4.1 running Debian via ‘Lil Debi): This worked quite well, even while simultaneously serving as a device for Netflix and other apps on my TV. The downside is that the network connection would become unresponsive pretty often. (The connection was more stable when I didn’t use any extraneous apps, and I expect that a device like this would do great with a native Linux distro… if you can it running and get the wifi working. Some of the many similar devices have wifi working on native Linux distros.)
  • GK802 (1.2 Ghz quad core Freescale i.MX6, running Debian with a 3.0.35 kernel): This is my current device, which has been great. They go for $65-70 right now (I got mine on sale for $60 from While there are faster and more efficient quad-core sticks with rk3188 processors for a little less money, some of which have working Linux distros, I went with this one because Freescale has a reputation for good documentation and for playing nicely with the free software world, and because — similar to a Raspberry Pi — the “internal” memory is a micro SD card, so you don’t have to worry as much about bricking it. There’s a nice little Debian installer I used to get up and running, and you can also run Ubuntu on it pretty easily. After pinning udev, I was able to upgrade to Jessie without too much trouble. The class 4 micro SD card I’m using is probably the main system bottleneck, but it’s been able to handle Quassel just fine. Update 2014-09-12: You can get a more up-to-date kernel now. See here, particularly the links in the comments. And if you run into trouble, visit #imx6-dev on freenode IRC.

Second, quassel-core and the database. You’ll probably want the latest version, so on Debian you’ll probably want to use Testing (currently, “Jessie”). For the database, you should definitely use PostgreSQL instead of SQLite. SQLite will work well at first, but as the database grows it will take longer and longer for clients to connect and receive the backlog. Eventually, when my SQLite database hit about 180mb on my MK808B, it wouldn’t connect at all. With six weeks of Postgres so far, I’ve seen no degraded performance as the database grows. Unlike with SQLite, though, you’ll need to do some command line work before you can set up the client.

Third, the clients. The desktop Quassel client is available on just about any system, and you’ll need to use it at least to set up your database initially. Quasseldroid is the Android client, which I like a lot. There’s also iQuassel for iOS, which I haven’t tried. Even on a modest Android device, you can pull tens of thousands of backlog messages in a few seconds.

Fourth, remote connections. There are many ways you could connect remotely to your quassel-core, but the one I’ve been using is just to SSH into the device, so that I can restrict password logins and use only ssh keys. On my Ubuntu laptop, I do a socks proxy for the Quassel port, like this:

ssh -D 4242 root@<my-server-ip-address>

On (rooted) Android devices, I use SSH Tunnel by Max Lv, which lets you route individual apps through SSH. In that case, I tunnel the Quasseldroid app to the Quassel port on my server, and then set up the connection within Quasseldroid to “localhost”.

If you don’t have root, or you use iOS, or you just want a simpler setup, you could just allow connections from the Internet straight to your Quassel port.

All this may seem pretty complicated, but once you get it set up it’s extremely usable. (Any questions about the details, just ask.)

Aaron Swartz

I didn’t know Aaron well, but I admired him deeply. The remembrances at Remember Aaron Swartz give a picture of just how much he meant to so many people.

These photos are from the last time I saw him, at a small wiki meetup in Boston in 2009. In my favorite, he’s huddled around a screen with SJ and Mako, and they’re all geeking out over these videos of procedurally generated educational games and and books that are written with Word macros. His passion was infectious and beautiful.Aaron Swartz with SJ and MakoAaron SwartzAaron Swartz in front of a screen