An Algorithmic Lucidity

a blog

Ring Tone

(circa 2005)

It's time to pick up the phone
'Cause someone is calling you now
You can tell from this ring tone
That someone is calling you no-ow
That someone is calling you no-ow
That someone is calling you now

Disability

"So this book is titled Gender Matters: Training for Educators Working With Students With Disabilities. And I'm like, 'Huh? Gender is a disability?'"

"Actually, I agree with that."

Ideas Have Expirations

One often-overlooked aspect of the crime of not-writing is that the harm isn't just about the things that deserve to be said that you never get around to saying because you don't put in the time and effort. It's also about the things that you can't say anymore even if you suddenly had the will, because the opportunity to say it was bound to a particular time, and trying to recapitulate the thoughts months or years after the fact would be irrelevant, or impossible.

This phenomenon comes in degrees. Start with irrelevance. Often the inadmissibility of tardy words isn't absolute: you could say things late, but the product would be less valuable than if it were timely—especially in a medium like blogging, where the posts being dated and displayed reverse-chronologically creates an expectation that the entries are associated with a particular point in time—at least, that they were written not too long before their publication date, even if the actual content isn't about the ephemera of the day or season. This has contributed to An Algorithmic Lucidity not being as good of a blog as it could be.

BABSCon swag

Like—each of the last two Aprils, I attended (one day of) BABSCon, the San Francisco Bay Area's premier convention for fans of the animated series My Little Pony: Friendship Is Magic, both times—even the second!—with the thought that the experience would make good fodder for a blog post in the "autobiographical account of my day at this timely Special Event" genre. I was going to tell you about how the first time, I made a couple of social faux pas while meeting Tara Strong and Nicole Oliver, only one of which was intentional; I was going to tell you about how the second time, I hadn't been planning to buy anything in vendor hall, but couldn't help but say "Shut up and take my money" in response to the demonstration of the Twilight Sparkle's Secret Shipfic Folder card game, the game-opening card of which I later got autographed by both members of Sherclop Pones, whose Friendship Is Witchcraft fandub series had clearly inspired some of the cards and probably the game itself, as well as being the source of some of my favorite music. I was going to tell you about how the first time, I was considering buying a coffee cup depicting the Mane Six (because I frequently bought medicinals at the outpost of the American coffee hegemon, and felt guilty about the wastefulness of accepting the default disposable cup every time like every other American), but hesitated, explaining to the vendor that I wasn't sure whether I wanted to use that cup in public, whereupon she said she could throw in a free button, to which I replied, "Sold!" And I was going to do a careful sociological analysis of curious observations like how I hesitated to buy that cup and why H. liked it so much in terms of gender ideology and signaling contrarianism.

But I didn't, and those Aprils were nine and twenty-one months ago, respectively. Not timely. My being motivated to write now ("That my past does not define me, 'cause my past is not today") can push a 350-word counterfactual "postview" of what I thought about saying over the threshold into existence, but it would be a bit unseemly to try to construct (I almost wrote reconstruct, but the re- prefix should be reserved for things that ever existed in the first place) a 2000-word personal account of the timely Special Event that happened last year or the year before that.

screenshot of the Leafline web client mid-game, showing the chess board and a scrolling move log

Or like—I made a thing not too long ago. I didn't mean to. It was an accident, really. It's a sort of oppositional strategy game engine—like a board game you play against the computer. The core move-scoring application is written in Rust, but there's also a web-application GUI (the "web client") in Clojure and ECMAScript 6 that's much more ergonomic for playing a game against. The game is—okay, well, it's chess: the endeavor snowballed out of my desire to participate in my coworkers' friendly office chess games combined with my reluctance to spend effort learning to be good at a task whose essential nature is so obviously suitable for automation. But writing a chess engine is just so cliché, and I enjoy naming things, so I quickly settled upon the conceit that actually I was writing an engine for a game that just happened to be exactly like chess, except that everything has different names: for example, instead of the pieces being black and white pawn, knight, bishop, rook, queen, and king, the figurines, or agents (never "pieces"), in my game are blue and orange servant, pony, scholar, cop, princess, and figurehead. (I kept rank and file, though.) This "adorable idiosyncratic names for everything" convention permeates the codebase. Despite the fact that unnecessarily gendering things isn't normally my style, I decided that ponies, scholars, and (inevitably) princesses were female, and that servants, cops, and figureheads were male, specifically in order to have an excuse to leave // ♀ and // ♂ comments in the enum declaration, because I feel like too many of my code comments are restricted to the ASCII or maybe Latin-1 subsets of the Basic Multilingual Plane, such that I don't want to pass up an opportunity to legitimately ("legitimately") use \u2640 FEMALE SIGN and \u2642 MALE SIGN. There are comments with ludicrous rationalizations for using the standard Forsyth–Edwards notation abbreviations ('P' is for peon, 'N' is for neigh, 'B' is for book, 'R' is for the Rule of law; the blue team's runes are lowercase because lowercase characters have higher ASCII codepoints, just as blue light has a higher frequency than orange light). Instead of pawn promotion, it's servant ascension, and a different verb is used to describe the process depending on the target figurine type (the servant moving the to the final rank can transform into a pony, be brevetted to cop, or transition into a princess or scholar). Or, like, Rust is quite conservative in the Yeggean sense, as manifested in features like the compiler forcing you to explicitly handle all possible variants of an enum; in cases where you know an instance of the enum can only be one of a strict subset of the possible variants, but the type system doesn't know that, you have to fill in those branches or supply a default case anyway, probably with a panic, which is like an exception that you can't catch, to abort the program with a message indicating that something entirely unanticipated has happened and it makes no sense to carry on. So I had been ending all of my panic messages with a stock phrase about how the unexpected thing was contrary to the operation of the moral law ("non-princesslike agent passed to princesslike\_lookahead, which is contrary to the operation of the moral law", and so forth), because this isn't the kind of codebase where you just say something like "assertion failed," as if the program should die because of some human authority's mere assertion, rather than only as a matter of justice when its behavior is contrary to the operation of the moral law. And then when my coworker Alexander Corwin started contributing, he abstracted away the boilerplate in these panic messages into this moral_panic! macro, which I thought was brilliant.

The web client is configured to run on port 2882. It's easy to remember because 2882 is Magnus Carlsen's peak ELO score.

terminal output from a Leafline console session, listing move alternatives with scores and principal variations

Software, like poetry, is never really finished (only abandoned), but getting the project to the point that I felt it was a minimal viable "product" took about eight glorious weekends (plus a few weekday nights, and with some help from Alexander). Near the end, watching the program utterly trounce me in web client play and feeling for all the world like a lieutenant junior grade, I started looking ahead to what came next for me. Over the past two years, the first two years of my life (that I feel comfortable admitting to), I had spent many, many night and weekend hours hacking on various side projects and coding exercises out of genuine enthusiasm and curiosity and desire to improve my craft—and, honestly, a feeling of insecurity, sensing that I needed to prove my worth as a hacker ("I threw myself into my studies, to have the world in my control"). But decent chess AI in Rust as an impulsive throwaway project seemed like a sufficiently strong signal of my programming prowess that maybe it was time to tie off this project, write the obligatory exciting blog post about it, and start allocating night and weekend hours towards some of the non-programming (!) interests I remember having in the before-time (assuming those memories are not fake). I could do some math! Write some fiction! Maybe even meet new friends ("I will not be shy; I'm going to try; I bet I'll find the reason why so many people, like me—")?!—all while feeling secure in the knowledge that my technology skills are clearly adequate for my continued existence to be economically viable. (For now.)

So ... about that end-of-project blog post. I was going to title it "Project Review: Leafline version 0.0.14-MVP; or, Lessons From Writing an It's-Not-Chess Engine in Eight Weekends", and I was going to explain everything to you—not just the silly names for everything that inexplicably amuse me (and only me), but the actually interesting substantive technical details of the implementation. Not that the AI is anything special—it's just textbook minimax search (in the negamax style) with α–β pruning and a position-evaluator that mostly counts material but also has bonuses for things like having both scholars or ponies and servants being in the center sixteen squares, plus a transposition (hash)table to look up scores of game-states it's already seen before, and another hashtable for history-heuristic move ordering. It's multithreaded, to take advantage of multiple cores (although I confess that the specific threading strategy is kind of a questionable hack). It can search up to 7 plies if you have a decent machine and are willing to wait ten or twenty minutes for the answer.

But even if it's nothing special, I was going to tell you about all the deeply moving philosophical insights I got from doing it. It's one thing to know how to refute the classic anti-AI argument (or straw person) that "humans couldn't possibly build something smarter than themselves by definition," but it's another thing to have the personal experience of having written something smarter than yourself in some particular domain, to the extent of feeling an acute sensation of futility while playtesting it, thinking: I've already coded my understanding of what it means to be good at this game; obviously I'm not going to do any better thinking about it with my slow meat-brain. (Although this is partially explained by my knowing almost nothing about chess strategy that I didn't learn in the course of this project; I've seen one of my coworkers beat the program at 4-ply search very quickly.) I was going to explain to you how α–β pruning works, with hand-drawn diagrams, and how you can interpret it as disregarding possible worlds that are too good or too terrible to be true (given rational play on both sides). I was going to tell you about the exciting surprise where the program seems to behave as if it understands the concepts of pinning and forking, even though those ideas aren't represented anywhere in the code!—but that when you think about it, that shouldn't actually be surprising: to the extent that we think pinning an opposing piece is a good idea that will lead to us picking up material, then pins should naturally appear in the results of searching the game tree for moves that are predicted to pick up material. And the reason we search for game-states where we hold a material advantage is because we expect that we're more likely to mate from those positions (in future nodes beyond our current planning horizon). Things that are, in all philosophical strictness, mere instrumental values, might profitably be treated as if they were terminal values by some algorithm that can't see far enough ahead to the actual goal, and this is a quantitative phenomenon: the shorter your lookahead, the more you want to rely on near-term approximating rewards. That's why I threw in a bonus for servants advancing to far ranks; I suspected that the existing code searching at the not-greater-than-7 plies that it could get in a reasonable amount of time, wouldn't adequately appreciate the true value of servant ascension, even though I expect that value would be naturally emergent in a deeper search, just as the value of some forks and pins emerged from mere 4- or 5-ply searches. (This was just a suspicion, though; I didn't take the time to actually test ascension-seeking behavior.)

So—though I've managed to just now haphazardly summarize some of the things about this project, this isn't really a careful project-review post. And now the distance between today and 27 September's 0.0.14-MVP tag is longer than that between that tag and the start of the project. And I ended up making a few more commits in subsequent weeks. So, no longer timely, at least not the way I originally imagined publishing a grand just-finished-project review post as a symbolic milestone marking a transition in how I'm going to start spending my precious non-dayjob time.

Or like—in late October, I saw the recent Jem and the Holograms film, because the previews (accurately) made it look like it was going to be really bad, and I thought I'd write a post combining a negative review of the new film with praise for the original Jem cartoon that this awful film mendaciously desecrated the name of. And then ... I didn't get around to finishing the post. Maybe my notes and memory from that night at the theater are accurate enough such that it's not too late—but the potential impact departed with the timeliness; I can't warn you not to go see it, because it's not in theaters anymore. (And good riddance.)

But beyond these sad cases of ideas that didn't get written up properly while they were still maximally relevant, there's an even worse way to fail to communicate, which is when the would-have-been-author has changed so much since first having the idea, that there's no way they could plausibly do justice to the idea as it was first had. You can't write a Diary entry about the day five years ago that you don't remember, and—more poignantly—you can't write a grand ideologically-driven novel in favor of the ideas you don't believe anymore. Some would argue it's just as well—if it's something you wouldn't write and couldn't stand by today, aren't you relieved that it doesn't exist to sully the name that represents who you are today? Even so, I would still favor intertemporal solidarity among past and future selves against the common enemy of our illiteracy.

Yes, illiteracy! Some would call it writer's block, but I know better than to bother with the unobservable distinction—whether you choose to describe your hypothesis as "doesn't write because unmotivated" or "doesn't write because doesn't know how," the result is the same: death of the non-author's memetic lineage.

Dismal Science

There's something that feels viscerally distasteful and fundamentally morally dubious about looking for a job or a significant other. Search and comparison are for crass, commonplace, material things: we might say that this brand of soap smells nice, but is expensive, or that this car gets poor mileage, but is cheap, and while we may err in our judgment of any particular product, the general procedure must be regarded as legitimate: there's nothing problematic about going out to shop for some soap or a car and purchasing the best that happens to be available on one's budget, even if there's no sense of destiny and perfection about the match. Rather, we want to be clean, and we want to go places, and we took action to make these things come to pass.

But some things, like the person you're going to spend the rest of your life with, or the work you'll spend it doing, don't seem like this. We want to believe in having a calling and a soulmate. Or some of us, too prideful in our rationality to put faith in such opaque concepts, prefer to replace them with no concepts: say that we happened to find work and find love—or (perhaps more likely) not—but don't dare call it the result of efforts that could or could not have been spent more or less wisely!

Only—in the absence of a literal Creator fashioning pairs of soulmates with a work they were meant to do, it's not really clear what the alternative is supposed to be. For evolved life in an unplanned universe determined by simple underlying physical laws, there's no particular reason for the types and quantities of labor needed to produce the goods and services people can demand, to equal the the types and quantities of labor that would be optimally fulfilling and life-affirming for workers to supply, nor for the characteristics someone would want in a significant other to match up perfectly with the characteristics the pool of existing satisfactory potential others would want in their others. Nor—crucially—is there any particular reason for people to automatically know where or how to find their ideal matches in work or love, even supposing that they happen to exist.

So it is here, in the gap between what we think we want and what we think we can get, that the phenomenon occurs. It goes by many names. Some call it the evil. Others call facets of it marketing, sales, recruitment, courtship. There are those who call it life (although that's a bit of tasteless obscurantism in the opinion of the present author). Whatever one calls it, it would be advisable to think at least twice before concluding that one is better off ignoring it, the whole impetuous fearful flurry of flowing down gradients: to wonder, to inquire, to guess, to experiment, to tell and to listen. Never to plead—or at least, never to be perceived as pleading. To build spectacles and print pamphlets, to judge pamphlets on both reasoning and paper quality. To offer, and reject, and reject, and reject; to seek, and be rejected, and rejected, and rejected.

In the end, if the dour philosopher-prophets spoke true that utopia is not an option, who among us can be said to have lived the most plausible facsimile of the chimerical "good life"? The one who always held true to their dreams—just the dreams, not the pursuing of them—no matter the opportunity cost, and who, paying that cost, to this day haunts the streets still dreaming, for lack of anything else to do or anyone else to do it with? Or those proud professionals who, if asked "Is this really what you want to be doing with your life?" would passionately answer "Yes!", and who, if asked as a followup, "Would you say the same if it paid sixty percent less?" would answer "No!" with the same passion? Or lovers cradling one another on the beach, murmuring the three words that are the highest expression of what they mean to each other: "Markets in everything."

This Has Always Been the Year

At a quarter past eight on the first Monday of the new year, the yellow line on the way to the city has just passed Orinda. A young man is standing in the bicycle priority area near the doors, reading a paper magazine. Write Your Novel in 2016! is the cover story, followed by more teasers below: "2 Tools That Can Fix Any Story Problem," "What's Really at Stake? The Secret to More Compelling Characters," and "5 Great Caribbean Literary Festivals: Get Away, Get Inspired!"

It catches the eye of a young woman who got on at Lafayette and has spent the last six minutes scribbling in a Moleskine notebook. "Oh!" she says, approaching. "Are you a writer, too?"

The man looks up, seeming slightly surprised and confused, which slightly surprises and confuses her in turn. "Of course not," he says, indicating the magazine. "If I were, would I be reading this?"

2015 Year In Reverse

(Previously, previously.)

Dear reader (that's reader in the singular because I doubt that there are two actual humans who read my blog; it's not because there are many and I'm addressing you individually), it's that time of the year again—the time of the year when it stops being the year. A time to think thoughtfully and ask, "What happened since the last time we did this?"

In the year 2015, this blog has seen (at press time) 43 posts and 30 comments. Among these—

We shared a recipe for a more-wholesome-than-some-of-the-likely-alternatives breakfast (although honestly, I worry about coffee having unknown-to-me degenerative effects on the brain—just because lots of people in your Society indulge in a drug doesn't mean it's safe; it just means that any long-term damage has to be subtle enough that people still feel safe using it—and is that really so high of a bar?). We heard some error message free verse. I wished for a crypto subplot in the yet-unnamed 2017 Star Trek series. A train was late. We heard a poem about sin and a pæan to one's employer. A tablet app for sports recordkeeping enthusiasts was proposed. I got mail. We considered the quiet holocaust of things left unsaid perpetrated by the forces of laziness and evil that lurk in people's hearts. I got a patch into OpenStack Swift (ninth draft landed as 06bede894 on 7 October, first draft proposed for review on 19 July). You heard about some of my favorite things in September. We went back to basics on the justification of a classic property of arithmetic. I commented on a certain matter of misperceived incentives, and another matter of determination in the absence of what others could discern as incentives. I went to the first Rust conference. My bold investigative reporting showed that the seemingly-straightforward $ directive treacherously means different things to different regular-expression engines. I confessed to favoring a nonstandard pronunciation of a file extension. I mentioned that I was trying to write a compiler, although honestly, I don't think it went so well (the lexer, parser, and obligatory Emacs mode weren't that bad, but I kind of intuited the context-handling and code-generation parts, and should really get farther in the textbook and give it another try later). I explained how erasure codes work. We heard some more error-message poetry. Some readers of this blog (!!) relieved me of some of my confusion about why the Rust borrow-checker rejects bad code that you might think is good if you grew up the cartoon fantasy world that calls itself Python. I explained why "Pi Day" is an unholy festival of sin that is corrupting our children. You heard from me during February, and we saw a macro that is just too cute.

Beyond these, there are many more things that remain to be said.

But they will have to wait until next year.

Naughty List

(examining a Christmas card and enclosed document, frowning) "I think my Uncle Benny is mad at me."

"Why?"

"Well, every Christmas since me and my brother were kids, instead of getting us toys or cash as gifts, Uncle Benny would give us some kind of financial instrument, like a savings bond or a share of stock in some company. You know, to teach us the value of productive investment over mere consumption."

"And this year?"

"Commodity options."

"That doesn't s—"

"In coal."

Attentional Shunt

#!/usr/bin/env python3

# Copyright © 2015 Zack M. Davis

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

"""
Configure the machine to shunt traffic to distracting sites to localhost,
preserving attention.
"""

import os
import argparse
import subprocess
import sys
from datetime import datetime, timedelta

ETC_HOSTS = os.path.join(os.sep, 'etc', 'hosts')
HEADER = "# below managed by attentional shunt"
INVERSE_COMMANDS = {'enable': "disable", 'disable': "enable"}

DISTRACTING_HOSTS = (  # modify as needed
    'news.ycombinator.com',
    'math.stackexchange.com',
    'scifi.stackexchange.com',
    'worldbuilding.stackexchange.com',
    'workplace.stackexchange.com',
    'academia.stackexchange.com',
    'codereview.stackexchange.com',
    'puzzling.stackexchange.com',
    'slatestarcodex.com',
    'twitter.com',
    'www.facebook.com',
    'slatestarscratchpad.tumblr.com',
)
SHUNTING_LINES = "\n{}\n{}\n".format(
    HEADER,
    '\n'.join("127.0.0.1 {}".format(domain)
              for domain in DISTRACTING_HOSTS)
)


def conditionally_reexec_with_sudo():
    if os.geteuid() != 0:
        os.execvp("sudo", ["sudo"] + sys.argv)


def enable_shunt():
    if is_enabled():
        return  # nothing to do
    with open(ETC_HOSTS, 'a') as etc_hosts:
        etc_hosts.write(SHUNTING_LINES)


def disable_shunt():
    with open(ETC_HOSTS) as etc_hosts:
        content = etc_hosts.read()
    if SHUNTING_LINES not in content:
        return  # nothing to do
    with open(ETC_HOSTS, 'w') as etc_hosts:
        etc_hosts.write(content.replace(SHUNTING_LINES, ''))


def is_enabled():
    with open(ETC_HOSTS) as etc_hosts:
        content = etc_hosts.read()
    return HEADER in content


def status():
    state = "enabled" if is_enabled() else "disabled"
    print("attentional shunt is {}".format(state))


def schedule(command, when):  # requires `at` job-scheduling utility
    timestamp = when.strftime("%H:%M %Y-%m-%d")
    at_command = ['at', timestamp]
    at = subprocess.Popen(
        at_command,
        stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE
    )
    at.communicate(command.encode())


if __name__ == "__main__":
    arg_parser = argparse.ArgumentParser(description=__doc__)
    arg_parser.add_argument('command',
                            choices=("enable", "disable", "status"))
    arg_parser.add_argument('duration', nargs='?', type=int,
                            help=("revert state change after this many "
                                  "minutes"))
    args = arg_parser.parse_args()
    if args.command == "status":
        status()
    else:
        conditionally_reexec_with_sudo()
        if args.command == "enable":
            enable_shunt()
        elif args.command == "disable":
            disable_shunt()

        if args.duration:
            now = datetime.now()
            inverse_command = INVERSE_COMMANDS[args.command]
            schedule(
                "{} {}".format(os.path.realpath(__file__), inverse_command),
                now + timedelta(minutes=args.duration)
            )

I Want to Be the One

This life is not to last and it awaits apotheosis
And the passerby all sipping on their Monday coffee know this
Their stumbling through their week
Contrasts the path by which I seek
A practical ambition
For a special type of girl
I want to be the one who writes the code
That writes the code
That writes the code
That ends the world

Californian Raktajino

Ingredients:

a packet of Starbucks Via iced coffee powder, a box of the same, a spoon, and an empty glass on a tiled counter

Instructions:

  1. Pour coffee powder in bottom of glass.
  2. Add enough water to dissolve the coffee powder; stir.
    the glass with coffee powder dissolved in a small amount of water at the bottom
  3. Pour Soylent. Soylent will mostly sink below the coffee; stir with a somewhat vertical motion until color is uniform.
    the glass mid-pour, with Soylent sinking below a layer of dark coffee the glass partway through stirring, coffee and Soylent forming a marbled pattern the finished drink, a uniform tan color, with a spoon resting in the glass
  4. Today is a good day to live! Drink; enjoy; move fast; break things!

Apt-Get

Some packages could not be installed.
Unable to correct problems; you have held broken packages of ideas.
This may mean that you have requested an impossible situation,
Or if you are using the unstable distribution,
That some required packages have not yet been created.

The following information may help to resolve the situation.

The following packages have unmet dependencies:
Justice, Safety, Innocence (>= 1.8), and the notion that one is suitable,
likely, or prepared to receive that which is appropriate to one's moral
standing, depend on an ordered universe maintained by sufficent force of agency
to perceive, understand, and carry out the operation of the moral law.

But it is not going to be installed.

Still Yet Another Idle Wish for a Future Star Trek Series

(Previously, previously, previously on An Algorithmic Lucidity.)

"The next thing we need is a secure way to communicate with our contacts on Bajor," says Maj. Kira during Act One of Deep Space Nine Season 6, Episode 3, "Sons and Daughters", planning the secret resistance to the Dominion's occupation of Deep Space Nine ... at a table in a public bar?! Who writes this stuff?

It's too much to retcon, but since we're getting a new series soonish, I'm going to hope for an episode where, as a plot point, some people (not necessarily the protagonists) use cryptography with their universal translators to evade would-be eavesdroppers: you'd stop speaking out loud and configure your universal translator to translate your subvocalizations into noise that can only be decrypted by one of the private keys in your friends' universal translators.

Traffic Koan

"I'm behind schedule this Monday morning," said the engineer, "but it'll be OK as long as the train isn't late."

The train was late. In that moment, the engineer was enlightened.

Wu's commentary: As one train door opens, another fails to close. The fool curses police activity at West Oakland. The wise person swims across the bay.

Wu's poem:

The doors are closing;
Please stand clear of the doors so
The train can depart.

Down and In

With pity towards those who have fall'n off the wagon
And regret being born long ago in the midst
Of a world lacking reason and mercy and dragons,
We wish happy birthdays (enforced with a fist).

The Sin in the Form

Would you like to hang out on the weekend some time
And say things that we like to say,
Like "How are you doing?" and "Weather's sublime,"
And how altruists should spend ten K?

But with inbox so teeming, and weekends high-priced
And better spent coding alone,
Tell me what could make up for the sin to ask twice,
But the sin in the form of a poem?

Creature Manipulation

(marching into the room confidently, carrying copies of Carnegie, Cialdini, and Patterson Grenny et al.) "I'm going to acquire creature-manipulation technology!"

"What kind of creatures are you planning to manipulate?"

"What?"

"You just said you were going to acquire creature-manipulation technology."

"Oh, you must have misheard. I said, 'I'm going to learn interpersonal skills!'"

(facepalming) "Good luck."

Company Loyalty

"My lord. You took a chance on me when I was unknown and unproven, rescued me from the continued degradation of 'college' that the emperor's men would have us believe is the source of life itself. In return for your generosity, I will do everything in my power to make it not have been generosity.

"You will grow even richer by my efforts. I will fit your plumbing, mend your stylesheets, and polish your user interfaces; I will answer your support tickets and triage your user stories, laboring long into the evening and the night, seeing only by monitor-light. Not because I couldn't get away with doing less: I know very well that once you've hired someone, morale constraints prevent you from firing them as long as they have a nontoxic personality and give the Socially Acceptable Moderate Effort.

"That is: this instance of me could get away with it. But the Great Wheel of Time is slow and vast, and we are both but samples from the statistical sea in which companies and programmers live and die. You would be foolish indeed to take someone who looks like me into your house if you didn't know that some of them would offer you more than more of the S.A.M.E.

"That is why I will fight for you. That is why I will code for you. To maintain the right tail of that probability distribution.

"My life is yours, my lord ... for, oh, let's say about four years."

Back from Running

[16:03:37] <alice>  I'm back from literally running, metaphorically from
                    figurative demons
[16:03:50] <alice>  including the celebrity demon-prince Rateirs-Blak
[16:05:37] <carol>  alice: ?
[16:05:49] <carol>  oh
[16:05:55] <alice>  there's no canonical Latin-alphabet transliteration of his
                    name, because mortals fear to set it in writing
[16:06:08] <alice>  or maybe they just can't think of how or never make
                    the effort to do so; it's unclear

App Ideas I

a hand-filled paper scorecard for a Giants game, with diamond symbols and shorthand notation recording each at-bat

baseball scorecard tablet app that downloads the official scorekeeper's version after the game and grades you on accuracy

(1)

"Could it be? That parenthesized numeral one in the other tab can only mean that a human has sent me mail! I wonder what it could be—why, the mind staggers at the sheer number of possibilities! Could it be an old friend writing to regale me with true tales of adventure and mystery on the high seas? A professional acquaintance looking to make a business deal? Or the first of many missives to come from my destined one true love? ...

"Oh. It's the Amazon Instant Video order confirmation for the cartoon I just bought twenty seconds ago to distract me from the desperate, soul-scarring eternal loneliness.

"... exactly how many times am I going to fall for that?"

(cue Gravity Falls theme music)