Zombie Zen

Ross's Blog

Important tip for those protesting: use the Signal messaging app. SMS can be intercepted, and while I don’t know of any specific threat, prevention never hurts.

Reaching Consensus

Posted on

(This post started off as an email to a colleague. They asked me for feedback on how to speed up an agreement on technical issues. Halfway through my response, I realized the advice I was giving was broadly useful and I wanted to write it up more thoroughly.)

So you want to write some code or do something that affects more than just you. Great! Whenever this happens, you will face three basic challenges:

  1. Find the stakeholders.
  2. Explain the problem to the stakeholders.
  3. Listen to and address concerns that the stakeholders have.

Once you’ve done all three, you’re done! The actual work is usually straightforward once your team is supporting you.

Read more…

Allegory of the Witness

Posted on

SPOILER WARNING: I wanted to share my views on the subject matter in The Witness. By necessity, this article does discuss the ending of the game in general terms. However, I do my best to avoid talking about specifics.

When I started writing this review, it began with “I liked The Witness, BUT…” I was frustrated. I couldn’t fathom what the ending meant. What I was supposed to glean from this experience? How do the voice-overs fit together? Why was I shown this?

But then I had an epiphany: I felt this same frustration before. Many times. Every time I solved a puzzle in the game. And so I began to see the prevalent puzzle mechanic as a metaphor for the game itself. “Solving” the story isn’t the point.

I recommend The Witness. If you’re considering playing it, do it. But bear in mind that it’s not a traditional story, and you may be disappointed if you treat it that way.

Read more…




doing the important research

if you understand the categorical terminology, this is actually a really good way to learn about monad behavior imo

for those of you who don’t get the underlying joke here, monads are usually the first really difficult concept people run into when they start learning about functional programming.

since “a monad is just a monoid in the category of endofunctors, what’s the problem?” is not illuminating to most, the burrito analogy has seen widespread use trying to illustrate monadic behavior, but often ends up being a gross oversimplification.

the state of introductory materials for people getting into FP (especially if their entry is via Haskell) is rather abysmal, so the author is poking fun at that here in what is an (imo hilarious) recasting of the burrito analogy back into category theoretic language to make things difficult again.

cardcpx: a Go/AngularJS project

Posted on

I’ve posted a project I’ve been hacking on to my Bitbucket account: cardcpx. This has nothing to do with my day job, it’s just something I did to help out on a film shoot (which also had nothing to do with my day job).

From the README:

cardcpx is a specialized UI for copying files from a camera card to 1+ replicas. The replica copies happen concurrently, so if you are copying N bytes to R replicas, the time is O(N) instead of O(N * R).

The interface also has includes simple scene/take ingestion, which is stored in a CSV transaction log. Selects will be copied first, so you can do a proofing check on a fast disk while your import finishes.

cardcpx supports a flat directory structure as well as the RED camera directory structure. It assumes that your clip names do not overlap. Attempting to copy the same file name will not overwrite data.

It’s still a bit rough around the edges, but I’m happy with how Go allowed me to compose a fairly complex a tool out of easy-to-understand pieces. This was my first excursion into writing a frontend with AngularJS, but I’m also similarly pleased about the design.

Everything’s open source. Feel free to dig in and use. I’d love to know if other people find this program useful.


Posted on
Well, another day passed. I didn't use Algebra once.

The image macro I see all the time.

Not all people like or are good at math. I can relate to that: I am not good at nor particularly care for history. You don’t have to be good at every subject or enjoy every subject. But I respect history, because I know that there are important conclusions that people can make by studying historical patterns. Likewise, math (and algebra) deserves respect.

Algebra is not about “solving for x”; algebra is about dealing with an unknown. There are many things you won’t know on a given day: how long it takes to get to work, what time you’ll go to bed, the number of times you smile. We deal with these every day. You leave a little earlier for work because yesterday’s traffic was bad, you sleep in a little later, you find friends who make you smile more. This is what Algebra is really about, but it takes a more formal notation so it can apply to anything.

So why does this mantra of pride in not using Algebra resonate with so many people? Because the way that math is presented at most schools is absolutely horrid. It’s shoved down your throat without context. “SOLVE FOR X.” I’ve seen what this method of teaching does to people. You want to prove that teacher wrong: you don’t need this dumb stuff that you’re being forced to learn. But would you still feel this way if you knew what it could do?

For four years, I mentored a high school robotics team. Many of the students who joined the team didn’t particularly like math, but liked the idea of building robots. They never thought they were smart enough to grasp those concepts. They couldn’t “solve for x”. The problem was that they didn’t know what they were solving. As soon as “x” became “the distance between where the robot arm is and where you want it to be”, it finally clicked. It’s a breathtaking experience to see a student go from “I’m not good enough” to “I learned this thing in school today, let me try it out on the robot”. Now math is a way for these kids to have control over their world. It’s not just something they understand, but a tool they can use to help them pursue their dreams.

Maybe you didn’t use algebra today. Fine. But the people who created the device you used to post this mantra sure did.



this bird is smarter than I am

I can’t believe it. Does this amazing creature know fluid properties??
This comes directely from Asgard, I am sure. Odin is still searching for him.

Birds are amazingly smart creatures — crows in particular. There’s a fascinating TED talk by Joshua Klein given back in 2008 where he shows many examples of crows using tools without prior learning. That’s right: crows don’t just repeat things they’ve seen, they have an ability to reason and understand their environment. Klein presents some anecdotes of other learned behaviors, but the most fascinating thing is that crows adapt to us. They use cars and traffic patterns to crack nuts and get food.

And they teach each other.

It’s an eye-opening video. Nature is awesome.

Chromebook Hacking: Developer Mode

Posted on

This is the second part in my series about creating a low-cost programming environment with an HP Chromebook 11. See Part 1 of Chromebook Hacking for the overview. This blog post assumes you have some basic knowledge of using a Linux terminal.

Enable Developer Mode

Danger: This will wipe out your entire local storage! Back up everything!

Enabling developer mode on a Chromebook is the blessed way of “rooting” your Chromebook: it gives you root shell access. This comes with the cost of losing parts of ChromeOS that depend on hardware-backed security systems (namely Netflix. Sad days).

Enabling developer mode is reversible (see below), but going in either direction will wipe your Chromebook’s SSD. Please back up your files first.

Instructions are on the Chromium OS website. For the HP Chromebook 11, the short version is: hold Esc+Refresh+Power button and when you see the boot screen, tap Ctrl+D. Follow the prompts and wait for roughly 10 minutes for the operating system to reinstall.

On the boot screen, you need to press Ctrl+D every time you boot to skip the “Danger, you don’t have verified boot” screen, or you can wait for 30 seconds. You can alternatively press the spacebar to perform a factory reset and disable developer mode.

Go through the standard Chrome OS “create an account” process to get to the desktop.

Install Secure Shell and set up Crosh

This step isn’t strictly necessary, but it gives you a very slick terminal interface. If you decide not to do this, you can always open crosh with Ctrl+Alt+T.

Install Secure Shell from the Chrome Web Store. Right-click on the app’s icon in the shelf and choose “Open as Window”. This allows you to use shortcuts like Ctrl+W inside the terminal without Chrome intercepting them. Click the shelf icon to open a new terminal. Create a new profile with a random non-empty user name (I picked foo) and a host of >crosh.

Secure Shell app with user "foo" and host "crosh"

Harden your install

Open a bash shell by running shell at the crosh prompt. Inside your bash shell, run this command:


This sets your Chromebook’s UNIX password for the chronos user — the UNIX user used for any logged in Chrome profile. Now that you’ve enabled developer mode, chronos has the ability to run sudo. Since all Chrome profiles use the same UNIX user account, you will want to open chrome://settings/accounts and whitelist the users that can access this machine. Disable Guest browsing and restrict sign-in to yourself.

Chrome settings with guest browsing disabled and sign-in restricted to Ross's account

Finally, you should prevent your Chromebook from booting anything other than ChromeOS by running the following from your bash prompt:

crossystem dev_boot_usb=0 dev_boot_signed_only=1

The first parameter (dev_boot_usb) disables booting from an external USB stick. The second parameter (dev_boot_signed_only) forbids booting to operating systems that are not signed by Google.

Wrapping Up

Now you have a minimal Linux environment with bash and vim. After poking around a bit, you will quickly notice that only Downloads and /usr/local are writable. In the next blog post, I will introduce Crouton: a less restrictive Linux environment for ChromeOS.

Chromebook Hacking

Posted on
HP Chromebook 11 showing a command prompt

In my spare time, I’ve been working on Go-SDL2 and Camlistore. I’m usually not sitting in front of my home desktop, so I want to be able to code anywhere. My battle-worn MacBook Pro could do the job, but it’s heavy, bulky, and aging.

To fix this, I bought the HP Chromebook 11. The display is nice, the price is great, and the keyboard is comfortable. It accepts a microUSB charge, so I don’t even have to worry about packing an extra charger. The bummer is development: good luck trying to run anything besides JSFiddle.

For a while, I was using SSH into my desktop to code. Most of the time this works. The problem was me: some days I would forget to turn on my desktop, other days I left it in Windows, and every day I gritted my teeth if I was coding graphics. I fantasized about a machine that booted quickly and had all the programs I needed.

Turns out, the answer was right in front of me: the Chromebook.

Recipe for Success!

  • Buy the Chromebook
  • Enable developer mode
  • Install Secure Shell and set up with Crosh
  • Harden your install
  • Download and run Crouton
  • Install X11 and xmonad
  • Profit!

Total Cost: $279 + half a day’s worth of work.

Over the next few days, I’ll go into more detail on these steps.