Wednesday, August 12, 2020

I am back

Nothing new to report. That's a lie, of course. Everything is new and terrifying and confounding and confusing. I was hoping it would be less so, the more that the years go by, but that has not been so. The mistake, I think, is assuming that a meaningful world is the natural consequence of things. I have been disabused of that idea: we are in a churning world, with no footstools. Meaning is something we have to fight for. It erodes without maintenance. It isn't like the castle in the mountains, but more like the sandcastles on a beach, easily trampled. So let's get to maintenance.

Saturday, April 17, 2010


One of my favorite companies is trying to kill my active area of research and personal interest. When Apple engages to hurt children, when they enforce a discriminatory and irrational policy, then they've crossed a terrible line. I've listened to the counterarguments, but I can only conclude that what they're doing here is morally wrong.

The iPhone has lost its shimmer for me. Time for a new phone.

Tuesday, July 22, 2008


I wonder if Nabokov would laugh.

I need to stop doing things that make me feel guilty.

Sunday, June 01, 2008


I've been using git for my source code control, and I'm happy I switched to it. I found out recently that my hosting service was burning; apparently something electrical exploded, knocking out a few of webfaction's servers.

I noticed the problem only when I was trying to push my changes upstream from my machine back to the mothership.

Long pause, no motion.

No problem. I canceled the push, and just continued to work and commit changes to my local machine.

I remember back at my previous workplace how the knockout of our main svn server meant we got to take the day off because we couldn't get any work done. Of course, I'm not telling the whole story. Not only was that server knocked out, but the whole building in general: we had a power outtage for a few hours. So that somewhat undercuts the story a little; decentralizing our source code server still wouldn't have saved us on that day.

Thursday, January 10, 2008

happy birthday

I didn't realize that Don Knuth's birthday was today. Happy birthday Professor Knuth!

Sunday, November 25, 2007


I held my sword in front, and approached the village cautiously. I would have to slaughter the terrible Yook monster disguised in one of the hapless villagers's homes. I pushed the doors open, ready to hack and slash. To my shock, all of the villagers looked exactly the same!

And each had something to say about the other Anouki:

* FoFo said that Gumo was honest.
* Kumu said Mazo or Aroo was lying.
* Dobo said Mazo was honest.
* Gumo said Fofo or Aroo was lying.
* Aroo said Kumu was lying.
* Mazo said that he and Dobo were honest.

How dastardly! Only the Yook would lie to me. And I couldn't just kill them all and let God sort them out. I had to think about this. So I did what anyone in this circumstance would do: I pulled out Alloy.

abstract sig Boolean {}
one sig True, False extends Boolean {}

abstract sig Anouki {
truthful: Boolean

one sig Fofo, Kumu, Dobo, Gumo, Aroo, Mazo extends Anouki {}

pred whoTellsTruth {
Fofo.truthful = True implies Gumo.truthful=True
Kumu.truthful = True implies ((Mazo.truthful=False) or
Dobo.truthful = True implies Mazo.truthful=True
Gumo.truthful = True implies ((Fofo.truthful=False) or
Aroo.truthful = True implies (Kumu.truthful=False)
Mazo.truthful = True implies (Mazo.truthful=True and

pred onlyOneIsLying {
one a: Anouki | a.truthful=False

run {

Ah ha! But as I was about to raise my gleaming blade against the trembling liar, doubt came to my mind: what if there were two of them out there? Or three, or four? I thought: perhaps I should plan this out more carefully before executing my righteous justice. And maybe I should rewrite the model a little more to make it more general: who knows how many villages of liars I might run across?

/* Anouki can be friendly or antagonistic to other Anouki */
sig Anouki {
supports: set Anouki,
denies: set Anouki
} {
/* and it's nonsensical to be both supportive and antagonistic of
the same Anouki. */
no (supports & denies)

/* A village consists of folks who tell the truth, and symmetrically,
those who lie. And we will categorically make every Anouki a
truthteller or a liar. */
one sig Village {
truthtellers: set Anouki,
liars: set Anouki
} {
no truthtellers & liars
Anouki = truthtellers + liars

fact truthiness {
all a : Village.truthtellers {
all a' : a.supports | a' in Village.truthtellers
all a': a.denies | a' not in Village.truthtellers

/* Here's what everyone says about each other */
pred hearsay {
some disj fofo, kumu, dobo, gumo, aroo, mazo : Anouki {
fofo.supports = gumo
fofo.denies = none
kumu.supports = none
kumu.denies = mazo or kumu.denies = aroo
dobo.supports = mazo
dobo.denies = none
gumo.supports = none
gumo.denies = fofo or gumo.denies = aroo
aroo.supports = none
aroo.denies = kumu
mazo.supports = mazo + dobo
mazo.denies = none
fofo + kumu +dobo + gumo + aroo + mazo = Anouki

pred oneLiar {
hearsay and #Village.liars = 1

pred twoLiars {
hearsay and #Village.liars = 2

run oneLiar for 6
run twoLiars for 6

Hours passed as I played out different scenarios. By this time, the Yook had already run away, but I had a model I was happy with.