(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:
Find the stakeholders.
Explain the problem to the stakeholders.
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.
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
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.
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.
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.
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
Maybe you didn’t use algebra today. Fine. But the people who created the
device you used to post this mantra sure did.
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.
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.
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.
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.
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.
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.
I discovered that some of my code was still living on my old laptop from high school. The laptop hadn’t been booted in about 4 years, so the clock battery had died, causing the filesystem checks to fail (this is Ubuntu 9.10, which cared about these things). I reset the clock manually, boot up the machine, and decide that to be on the safe (but marginally inefficient) side, I’ll copy my entire multi-GB home directory to my more beefy desktop and filter out what I don’t want there.
Sadly, this laptop came before 802.11n and is limited to 54 Mbps. I have an AirPort Express with only one local port, which is connected to my desktop, but I don’t want to disrupt the network setup. I realize I can chain the Ethernet from my old laptop (named metroid) to my new laptop (named roran), which has 802.11n to connect to my desktop (named nasuada).