Another City Story

I was at the local PNC Bank to deposit a paycheck, and I was writing out a deposit slip.  A woman said loudly to the bank teller something like, “I wish she’d just had the heart attack then!” and the teller demurred, “well…” “I have to laugh just so I don’t cry,” the woman explained, and walked away from the teller. In line behind her was a man pushing a baby carriage. “I have to stay away from you because you’re too cute!” the woman said to the baby in the baby carriage. The father smiled. Everyone looked at the baby (it was cute). The woman stood there for a second and said, “Yeah, I have to stay away from you so you won’t get what I’ve got.” She walked a few steps toward the door and turned, “No, wouldn’t want you to get what I’ve got.” A few more steps. “No, nobody wants what I’ve got.” Finally, she turned and as she was walking out the door, started to sing, “♫Nobody wants what I’ve got…♪“. I started laughing along with the young woman standing next to me.

My Ubuntu Setup

Update: It was cute to have the two articles together, but this will be better for googleability and notwastingtimeability. Added information about typing breaks and getting Twhirl.

This is also booring, but might be vaguely useful for someone out there.

I’ve set up Ubuntu so many times that I’ve put down some deep neural pathways for how to do it. So here goes. These are all commands I type right after the first login:

General Users

# I add this line to /etc/apt/sources.list or through "Software Sources" to get most recent gnome-do:
# deb http://ppa.launchpad.net/do-core/ubuntu hardy main
sudo apt-get install liferea pidgin-libnotify gnome-do gnome-do-plugins gmail-notify cheese glipper

Liferea is a decent feed reader1. In preferences I turn off the notification icon and click “Show the items of all child feeds…”. After setting up Pidgin I turn on the libnotify plugin and “Psychic mode”. libnotify gives you nice popups and psychic mode tells you when someone’s about to IM you, so you can log out quickly :). Gnome-Do is pretty useful once you force yourself to use it (by default, it’s activated with super+space). You should enable most of the official plugins (click the corner down arrow and preferences) and teach yourself to keep tabbing to the more advanced options for an action. Gmail-notify is better than the Pidgin notifications IMO. Cheese is a Photobooth clone. Glipper is a more advanced clipboard. Add it as an applet to a dock (it’s called Clipboard Manager).

I have to add pidgin, gmail-notify and gnome-do to my startup session in Preferences -> Sessions. To my mind, this is clearly the most user-unfriendly but necessary step in the Gnome desktop experience. I should be able to right-click on the application in the dock to add it and each application should offer to do this for me, and I definitely shouldn’t have to type the correct application name (twice) to add it to an inscrutable list.

For Firefox, I install Firebug (a developer thing) and Delicious Bookmarks, and I hit YouTube to let the browser download Flash for me.

None of the native Twitter clients seem to work particularly well, so I’ve been using Twhirl with Adobe Air. Air is easy enough to install, just chmod +x the bin file and run it (you could also right-click it and change permissions to “read and write” for owner). You have to download Twhirl through the Manual Installation link.

One nice feature that’s a bit hidden away is Preferences -> Keyboard -> Typing Break2 for avoiding RSI/maintaining sanity.

The rest of these steps probably don’t apply to you.

Macbook Stuff

# Add this to /etc/apt/sources.list to get macbook stuff
# deb http://ppa.launchpad.net/mactel-support/ubuntu hardy main
 
# More configuration options for the touchpad
sudo apt-get install gsynaptics
 
# I install these for the isight and a weird problem with numlock staying on, respectively
sudo apt-get install isight-firmware-tools mactel-support-fnmode-fix
# Eh, I still get the numlock problem. Numlock goes on when I unplug my USB mouse?

I need to replace the relevant section in /etc/X11/xorg.conf to get two-finger right-click on my touchpad:

Section "InputDevice"
	Identifier	"Synaptics Touchpad"
	Driver		"synaptics"
	Option		"SendCoreEvents"	"true"
	Option		"Device"		"/dev/psaux"
	Option		"Protocol"		"auto-dev"
	Option		"HorizEdgeScroll"	"0"
	Option "FingerLow" "20"
	Option "FingerHigh" "30"
	Option "MaxTapTime" "150"
	Option "MaxTapMove" "90"
	Option "MaxDoubleTapTime" "180"
	Option "VertScrollDelta" "15"
	Option "VertTwoFingerScroll" "true"
	Option "FastTaps" "true"
	Option "TapButton2" "3"
	Option "TapButton3" "4"
	Option "SHMConfig" "true"
EndSection

Development Stuff

# Get vim and a friendly IRC client
sudo apt-get install xchat-gnome vim-full vim-gtk vim-ruby vim-python
 
# These give you most of the build requirements for your system
sudo apt-get install build-essential gnome-devel
 
# Probably will need these too
sudo apt-get install git-core bzr subversion mysql-server-5.0 apache2

FWIW, I set terminal profile to grey on black, with about 80% transparency.

Ruby Stuff

sudo apt-get install ruby ruby1.8-dev rdoc irb

Despite the fact that it’s essential for doing anything with Ruby, Rubygems is still packaged improperly on Ubuntu as of Hardy (it will work now but gem executables aren’t installed or chmod’ed or something). It’s still the best bet to build it from the most recent source from here.

wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz # e.g.
tar xvzf rubygems-1.2.0.tgz # again, e.g.
cd rubygem-1.2.0
sudo ruby setup.rb install
# For some reason, it's gem1.8 and not gem anymore. Let's fix that.
sudo ln -s /usr/bin/gem1.8 /usr/local/bin/gem
sudo gem install rails # say; do a new bash if it doesn't work

Actually, you want to use utility_belt in irb:

sudo gem install utility_belt

and create a file ~/.irbrc:

IRB.conf[:PROMPT_MODE] = :SIMPLE
require 'rubygems'
require 'utility_belt'
  1. although I’ve switched to Google Reader now that I have to juggle machines at work and home. []
  2. I set “Allow postponing of breaks” so I can click “postpone break” every three minutes for sometimes an hour. It’s a nice diagnostic for internet addiction. []

A Crash

This will be booring.

On Sunday I sat down to do some coding work that I had been procrastinating on1. Computer booted up, I logged in…and it hung. Did the ctrl-shift-backspace thing, but the screen just displayed what looked like memory codes and some failure messages.  Restarted a couple times and decided that my system was completely borked.

Grabbed two Ubuntu CDs off the top of my huge pile of burned but unlabeled CDs. The first CD I put in was for 6.10 and was the text installer. Now every time I restarted I was forced to boot from this CD because of my stupid-ass hardware… a Macbook that I only run Ubuntu on2 ; I couldn’t eject the CD using the keyboard key while in the text installer. After too much time figured out that the rescue mode worked and I could use the `eject` command on the drive (I found out later you can just hold down the touchpad button and hit the eject key on boot-up). In any case, with both CDs I was seeing the same strange behavior: a message that my system clock was set to Jan 1, 2001 and failures to install completely.

Oh, long tedious story short, first I thought it was the RAM, so I bought a new 1GB stick, then I thought it was the harddrive (but really I thought it was the motherboard, because of the clock thing), so I bought a notebook harddrive that had the wrong connectors. So as a totally random troubleshooting step, I burned a new copy of 8.04.1 and tried installing it3.  When the system started, I got the clock error but everything else worked. On the second startup I didn’t even get the clock error.

There is no lesson from this story4. Okay, there is a lesson: troubleshooting is hard, and if you really want to do it well, make a grid and work your hypotheses methodically. If I had done this I might have fixed my system on the first night instead of on the third day. The end result of my ordeal is that I have an extra 500MB memory, a scratched and scuffed Macbook interior, fewer screws on the exterior, and no idea whether my problem was software or hardware related. I basically expect my laptop to burst into flames at any moment.

  1. I don’t know if you procrastinate on or procrastinate about. I don’t even know how to ask Google the question. []
  2. I used to be able to dual-boot it with MacOS and it was pretty nice, but for some reason I nuked that partitition and I haven’t been able to reinstall from the CD. []
  3. The key was walking away once the install started and coming back after an hour, clearly. []
  4. I like to bug Amy by sententiously declaring, “I think we’ve all learned a valuable lesson today,” whenever one of us, usually me, does something stupid. []

King of the Set: Zombies

For no particular reason I’ve grouped a bunch of movies I’ve seen fairly recently (all in the last year, most in the last few months) into sets of three. Here’s the first set. Zombies!

I watched 3 zombie films recently:

  • Day of the Dead (2008 remake)
  • Diary of the Dead (George Romero)
  • 30 Days of Night

Diary of the Dead

Diary of the Dead was just okay. The idea of this movie is that it’s Cloverfield with zombies (Cloverfield, if you’ll recall, was Blair Witch Project with Godzilla). As with Cloverfield, this is going to be an extremely difficult conceit to pull off believably. The conceit is updated somewhat cleverly with the idea that the raw footage has been edited and produced in order to be as scary as possible. Also, there are two cameras that sometimes record each other, and there are montage intermissions and monologues by the documentary’s producer. George Romero wants to make the movie about the impossibility of neutral observation and the desire to record events in order to insulate yourself from true horror. The recurring phrase in the movie is “If it’s not caught on camera, it didn’t happen,” and there’s an idea that guns and cameras both “shoot” people. Anyway, George Romero is a very hamfisted director, and so the final result can’t be completely satisfying, especially the very last stupid scene. I liked this movie so much better than Land of the Dead, though, which felt like it was an episode of Buffy the Vampire Slayer (not a good thing in this case).

Day of the Dead (2008)

Day of the dead was a nothing film; I thought it would be an entertaining remake of the original Day of the Dead, since the remake of Dawn of the Dead was pretty good. They even tried to dupe me into thinking that Ving Rhames was somehow playing his character from Dawn of the Dead. He’s not that guy and he dies early on. This was a dumb movie because people would turn into zombies through an extremely fake-looking and over-the-top CG transformation and then they were “fast zombies” (in Diary of the Dead a character complains about the fast zombies unleashed by 28 Days Later, something like “they’re the resurrected dead! They lurch!”1 ). There were a couple somewhat decent scenes, but overall this movie was made just to take my $12.

King of the Set: 30 Days of Night

Waitaminute! 30 Days of Night isn’t a zombie film! Oh, but it is. In fact, it is by far the best zombie film I’ve ever seen. Let me explain. You see, zombie films in my book aren’t necessarily about zombies, if zombies are narrowly defined as “the living undead”. The zombies in 28 Days Later don’t meet this standard, nor do the zombies in I am Legend (in both, the zombies are “the living unwell”). However, both are clearly zombie films. Also, the presence of “the living undead” doesn’t necessarily make for a zombie film (for example, see the truly shitty The Killing Box, about lame supernatural zombies and the American Civil War). Finally, it could be argued that Hotel Rwanda is a zombie film, because zombie films are at heart about the small group defending against a dehumanized and murderous mob.

Thus, the biggest problem with saying that 30 Days of Night is a zombie film is that the danger comes from outside the community, not that the monsters are vampires. I took this as a creative twist on the genre, though. The general form of the zombie film is: the collapse of normal society by “zombie” epidemic; the creation of the ad hoc social unit (usually a multicultural “family”); the defense against the zombies, either successful or unsuccessful, depending on how dysfunctional the social unit is. Other sub-motifs are: competing social units (usually military ones) can be monstrous too, and, the attempt to wall yourself in will ultimately fail, usually because of human weakness or folly.

What I liked about 30 Days of Night was that the typical middle action of the zombie film gets derailed by the ferocity of the initial vampire attack (really quite scary). Instead of manning the barricades and getting whittled down, or assembling impromptu weapons which prove insufficient, the handful of survivors go and hide in an attic for a couple weeks. It’s clear that they don’t stand a chance against the vampires. There’s even a scene where Josh Hartnett burns one of the vampires with a sun lamp, and you think they’ll learn to fight back now, but the vampires just go and shut off the generator. Another thing that subverts the typical zombie film story is that the vampires are very animalistic and it’s unclear how intelligent they are. The vampires look and sound like birds or rats and their cruelty seems to be due to a total lack of connection with humans (the leader does give us some creepy vampire philosophy in what sounds like Russian, e.g, “They [the humans] believe the most ridiculous things”, but mostly the vampires screech and hiss at each other). What’s scary about this is that the vampires’ intelligence doesn’t mean that they are in a moral relationship with the humans, because they appear to belong to a different, perhaps superior, species.

30 Days is also extremely stylish. It’s based on a graphic novel, and on the second viewing I realized that most of the shots are static, like: shot of someone’s face; shot of the room; shot of something in someone’s hand. As with 300, it seems to have benefited from being well-storyboarded. The acting is good, too. This is a great horror movie, but also an interesting, well-made movie in its own right.

  1. A note about fast zombies: fast zombies seem to be the product of the disappointment over the failure of a peaceful world order to arise after the end of the Cold War. In George Romero’s original movies the slow zombies are representative of ideological squares, consumer drones and other mechanical, mindless types (this is why military types and racist Good Old Boys are considered to be equivalent to the zombies in the movies). The Rage zombies in 28 Days Later represent a more total social disruption that has a fast, explosive quality, like the Rwanda genocide (Jared Diamond suggests it may have been as much a grab for neighbors’ land as about anything else) or massive terrorist attacks (this is more explicit in 28 Weeks Later, where the American military is “just as bad” as the zombies). Fast zombies are about a kind of epidemic of social distrust based on pressurized social conditions (food scarcity, war, immigration) that has a tendency to explode and wipe out the liberal social gains. Or something. []
  2. Movies are $1 from the Redbox vending machine at the grocery store []

About Rails Checkboxes

This is another boring tip in case you have to construct a form to send to Rails, and I’m sure it’s documented everywhere:

Rails-generated checkboxes return a value of 1 when they’re clicked. That is, the parameters will contain the name of the checkbox and a value 1. But the way checkboxes work is they’re either on or … they’re not included in the parameters. They don’t get sent as “off” or “0”. So the thing to realize is that the Rails-generated checkbox is accompanied by a generated hidden field with the same name as the checkbox and a value of 0. Apparently, if there are two identical names submitted in a form the first one takes priority. Who knew?

So you would do something like this with Ext JS:

new Ext.form.Checkbox({ name : "profile[licensed_realtor]", inputValue : "1",
            id : 'js_profile_licensed_realtor_field', fieldLabel : "Licensed Realtor",
            checked : <%= @user.profile.licensed_realtor == true ? "true" : "false" %> }),
        new Ext.form.Hidden({ name : "profile[licensed_realtor]", value : "0" })

Rails and Ext non-Ajax Signup Form with Password Confirmation

This is, uh, a technical post.

Probably there are others who want to do the same somewhat senseless thing: use Ext to do form validation while keeping a boring non-Ajax post-and-response. The bottom line is that Ext favors doing it the Ajax way, and the Ajax way isn’t that hard to set up with Rails (just handle the form submission as normal but return JSON or XML to signal success or failure). But if you’re like me and working on a deadline, there can be a cognitive burden to switching to Ajax posting that you might want to avoid. Paradoxically, you might find yourself wasting a lot of time trying to figure out how to do it the “old-fashioned” way. Well, here’s one working standard-submission Signup Form, with fancy validations and all the kinks worked out.

Here’s the top half of the file users/new.html.erb, which is nearly the same as the code generated by restful-authentication:

<% @user.password = @user.password_confirmation = nil %>
<%= error_messages_for :user %>
<div id="no-js-form">
    <% form_for :user, :url => users_path, :html => {:id => "signup-form"} do |f| -%>
    <p>
        <label for="login">
            Real Name
        </label>
        <br/>
        <%= f.text_field :name, :id => "signup_name_field" %>
    </p>
    <p>
        <label for="login">
            User Name
        </label>
        <br/>
        <%= f.text_field :login, :id => "signup_login_field" %>
    </p>
    <p>
        <label for="email">
            Email
        </label>
        <br/>
        <%= f.text_field :email, :id => "signup_email_field" %>
    </p>
    <p>
        <label for="password">
            Password
        </label>
        <br/>
        <%= f.password_field :password, :id => "signup_password_field" %>
    </p>
    <p>
        <label for="password_confirmation">
            Confirm Password
        </label>
        <br/>
        <%= f.password_field :password_confirmation, :id => "signup_password_confirmation_field" %>
    </p>
    <p>
        <label for="password_confirmation">
            Role
        </label>
        <br/>
        <%= f.select :role, [["consumer","consumer"],["vendor","vendor"]], :id => "signup_role_field" %>
    </p>
    <p>
        <%= submit_tag 'Sign up', :id => "signup_submit_button" %>
    </p>
    <% end -%>
</div>
<div id="js-form-panel">
</div>

The only differences are a div wrapping the form (“no-js-form”) and the “js-form-panel” at the end. You’re going to laugh at me, but this form is buzzword-friendly; it’s unobtrusive in an ugly way. If javascript is turned on, the form will work, and the following will fail:

<script type="text/javascript">
    /* 
     Thanks to:
     http://www.extjswithrails.com/2008_03_01_archive.html for standardSubmit tip (hard to find!)
     http://extjs.com/forum/showthread.php?t=23068 for password confirmation
     Anyone else I stole semantics from
     */
    // Look, I'm copying over the authenticity token to send in the JS-generated form. LOL!
    var authenticity_token = document['forms'][0]['authenticity_token'].value;
 
    Ext.onReady(function(){
        $('no-js-form').hide();
 
        var myForm;
 
        function submitHandler(){
            form = myForm.getForm();
            form_as_dom = form.getEl().dom;
            form_as_dom.action = form.url;
            form_as_dom.submit();
        }
        myForm = new Ext.form.FormPanel({
            monitorValid: true,
            standardSubmit: true,
            url: "/users",
            applyTo: "js-form-panel",
            title: "Signup as a New User",
            width: 310,
            autoHeight: true,
            items: [new Ext.form.TextField({
                allowBlank: false,
                msgTarget: 'side',
                name: "user[name]",
                id: 'js_signup_name_field',
                fieldLabel: "Real Name"
            }), new Ext.form.TextField({
                allowBlank: false,
                vtype: 'alphanum',
                msgTarget: 'side',
                name: "user[login]",
                id: 'js_signup_login_field',
                fieldLabel: "Username"
            }), new Ext.form.TextField({
                allowBlank: false,
                vtype: 'email',
                msgTarget: 'side',
                name: "user[email]",
                id: 'js_signup_email_field',
                fieldLabel: "Email"
            }), new Ext.form.TextField({
                allowBlank: false,
                inputType: 'password',
                vType: 'password',
                msgTarget: 'side',
                name: "user[password]",
                id: 'js_signup_password_field',
                fieldLabel: "Password"
            }), new Ext.form.TextField({
                fieldLabel: "Password Confirm:",
                allowBlank: false,
                inputType: 'password',
                name: "user[password_confirmation]",
                initialPasswordField: 'signup_password_field',
                vType: 'password',
                msgTarget: 'side',
                id: 'js_signup_password_confirmation_field',
                fieldLabel: "Confirm Password",
                validator: function(value){
                    return (value == document.getElementById("js_signup_password_field").value) 
|| "Your passwords do not match";
                }
            }), new Ext.form.Hidden({
                name: "authenticity_token",
                value: authenticity_token
            }), new Ext.form.Hidden({
                name: "user[role]",
                value: "consumer"
            }), ],
            buttons: [{
                handler: submitHandler,
                text: "Signup",
                formBind: true
            }]
        });
 
    });
 
</script>

The noteworthy steps are: first, I hide the ‘no-js-form’, then I copy the authenticity_token that gets generated by a rails form to put in the js-generated form. Then, standardSubmit : true is the config option that makes a FormPanel not submit as an XmlHttpRequest. The funny code in the submitHandler is getting the underlying form object and calling submit on it, but as I write this it doesn’t make sense why both would be necessary. Finally, formbind : true causes the submit button to be deactivated while there are failing validations, and there’s some handy code for making sure that the password_confirmation matches password (totally lifted from somewhere else, see above).

Wonderful Things

I’m going to share some wonderful things with you now. I’ve saved them up, although my one reader has probably seen them all through my del.icio.us account.

I think Christopher Hitchens getting waterboarded is fairly noteworthy.

Zadie Smith writes about Kafka again. Funny story about this. I was reading the article, and the writer noted that Women are snares which lie in wait for men on all sides, in order to drag them into the merely finite is a “perfectly ordinary expression of misogyny, dispiriting in a mind that more often took the less-traveled path.” I was already annoyed with the article on a number of counts (it’s titled “F.Kafka, Everyman”) and I thought, I bet the author’s a woman. When I scrolled to the top and saw who it was, I thought, “well she makes some good points”. So, there.1

This article made the rounds on the aggregator blogs. There’s a passage that ends “She had scratched through her skull during the night—and all the way into her brain,” that made it like a story from Scary Stories to Tell in the Dark. Some people have called bullshit on it, but who cares?

This video will also scare the hell out of you. Look at the debate in the comments about whether it’s basically a snuff film.

Have you seen Quest for Fire? My god, it’s a French-Canadian movie about cavemen trying to get their fire back. It has authentic made-up cavemen dialogue in several languages and no subtitles. So awesome.

I like to corner people and tell them about the bonobos. This video will change your life. The thesis at the beginning of the video sounds ridiculous, but let it sink in a little before you reject it.

This video about a weird subculture in Japan will also change your life. There’s a tremendous surprise about halfway through. This video isn’t exactly eye-opening, but it brings you up to speed on something you might not have wanted to know about.

The second video here has become a local meme for Amy and I, along with the lines from this (an old thing that we just discovered). Huh??? What???

Technology Crisis I and II are just about the best free music you’ll ever get. It’s music written for an imaginary video game.

Anyway, I have a lot of this stuff. I estimate about 40% of my brain is made out of this crap.

  1. To get this, you have to understand that Zadie Smith and Kafka and the intersection of the two have been key influences throughout my 20s. []

Passion

Continuing with the theme of wholesome outdoor athletic activities, Amy and I went to see the Pittsburgh Passion playoff game on Saturday night. It was fun; there was a good crowd; the tickets were $5. The Passion have gone undefeated this season, and tonight we saw why. When we left at half-time (it was raining) it was something like 37-6 against Orlando (final 41-6).

My homework assignment for the DC folks (I guess for next year): go see a DC Divas game, and keep track of the next Passion vs. Divas game, so we can get together and I can be conflicted.

Critical Mass

Amy and I rode our bikes in Critical Mass for Pittsburgh, which I didn’t realize is a monthly thing. We didn’t know what to expect at all, but it turned out to be a very mellow and pleasant affair. Some of the regulars were making fun of a “competing” ride called Critical Manners1, where the pack doesn’t blow through red lights and even rides in a single file. We were also dismayed when we arrived at the meeting place that it didn’t seem like the mass was nearly large enough; it would be a sub-critical mass, a fizz-out. But when everyone got on their bikes and swarmed out it seemed like the pack magically grew to something like 150-200 bikes. Then everyone just sort of ghosted along at a leisurely pace with some quiet talking and not much yelling in a loop around the Oakland area. Since it was a Friday at 6PM, there weren’t even that many cars to inconvenience.

Of course, the 200~ person pack would take a long time to cross an intersection and stopping for the red lights would have broken it up, so that’s where the bad-boy behavior comes in. Even this was pretty civilized. At each intersection, if the light was red the front of the pack would wait, but then the whole pack would pass through. A couple bikes would park in front of the cross-street, just looking at the waiting cars and smiling. So we did see one guy in a white SUV try to muscle his way past the “guards”, but the cyclist just slid his bike under the SUV’s wheel and suddenly there were a couple cyclists talking to the driver.

Okay, so the cool part was when the pack climbed up Craig St. toward Bigelow, which is a kind of highway on a height that drops down like a rollercoaster into either Bloomfield (a residential neighborhood) or downtown. This is a main commuter avenue for getting across Pittsburgh’s East Side, and normally it would be iffy to ride with the cars there. This is where we had a line of cars backed up behind the pack, probably fairly annoyed for the 15 minutes that we held them up for. The point wasn’t to hold up the cars, even though I didn’t feel too bad about it. A lot of people make hellish 2+-hour commutes to and from Pittsburgh, just because they can’t imagine actually living in the city. Some of those people are the same drivers who act squirrelly around bikers, tailgating because they’re afraid to pass, or freaking out when you pause to turn in the left-turn lane.

Anyway, it turned out that it’s just really nice to own the road for awhile, and especially a privileged car commuter road like Bigelow. There’s a weird little sliver of a park (“Frank Curto Park”) that’s up on this inaccessible ridge by Bigelow that thousands of car commuters pass every day. Nobody goes to Frank Curto park, not even by car. Driving past you sometimes see a flock of geese turkeys2 and wonder how they got there. We rode past that (but we could have stopped) and then the entire pack bombed down through the long descent to downtown, with the sun starting to set and all of Pittsburgh below us. That was a nice experience, seeing how all the people dealt with the descent, because each person is focused on controlling his bike and enjoying the speed and wind. So it was a solitary meditative moment enabled by this group activity and effort. The whole time this is going on there was a rear guard which was probably putting on the brakes to keep the pack from getting too compressed and which was dealing with the annoyed motorists and an advance guard that had to open up the traffic when we got to the bottom of the hill, so there was also a sense that you were being given a gift of being able to enjoy this descent.

The pack rode around downtown a bit and ended up at Three Rivers state park where there’s a big fountain with a circular ring around it that some used as a velodrome. By that time the sun was really red. After that, everyone dispersed; it seemed like it was your job to find your own way home. I knew where the path was, just not how to get to its entrance from the park, so we had a short adventure with a densely wooded unofficial path before we figured out the proper way to get back home. Between the Critical Mass ride and the ride back we probably did 9-10 miles.

Anyways, so that’s the problem with the Critical Manners concept. Especially damning to me is the single-file line rule. The whole unpleasantness between cars and bikes is that cars get anxious when they can’t go 30 miles per hour, even when they’re just racing to the next red light and even when a bike is going 10+ miles per hour. The other lane’s taken and here’s this guy just toodling along on his bike in front of you, and oh! it’s just so frustrating. Making them wait is the quasi-political statement that says, we let you drive those things that poison our air and boil the planet, you don’t let us use this asphalt that we pay for.

  1. In the article about a San Francisco Critical Manners, there are 16 participants mentioned []
  2. Amy reminded me that it was turkeys, not geese. Turkeys is weird, geese not so much. Also, apparently the group word for turkeys is “rafter”? link []

A language game

Amy and I were sitting in an airport waiting for a flight. I said, “I should have been a pilot.” Amy asked me why. Really, it was just something to say; I was briefly imagining my alternate life in which I was an airline pilot. Instead of explaining the details of the fantasy (get to fly around the world, chicks dig on you, etc.) I said: “So I could fly far away from you.” See, it was funny to say because I didn’t mean it, and because this is so obviously a terrible thing to say to anyone, let alone your girlfriend. Oh, we had a good laugh.

Amy suggested that there could be an entire children’s book based on this premise:

  • I wish I were an astronaut… so that I could escape to another planet
  • I wish I were a deep sea diver… so that I could go to the bottom of the ocean and be alone
  • I wish I worked at night… so that I’d never see you
  • I wish I were an explorer in foreign lands… so that we’d lose contact
  • I wish I were a time traveler… so I could travel to before you were born… or after you died

Try this with your loved ones, the next time you’re feeling grumpy, or simply want to make an impression.