A Bit of Wisdom

People think that there are authorities out there with direct knowledge when in fact there is no direct knowledge, there is only focal knowledge, knowledge that is located around a set of practices, discourses, institutional locations, etc. So for example a doctor doesn’t know bodies; a doctor knows a bunch of things about the body when it’s presented in the examination room at the hospital. He’s the authority at that place in that time because of the weave of social premises that support him there. I forget why I thought this was important1 . I had to get out of bed to write this because I couldn’t let this thought go.

Update: I remember now. It was because I had a mental vision along the following lines:

that a programmer as a patient might look at a doctor trying to determine a treatment for him2 and find that he recognizes the doctor’s prescription as a kind of workaround or kludge. Then I thought that the programmer would try to talk to the doctor on the level of processes, establish a common language like, but I thought that the doctor wouldn’t buy into it. The doctor wouldn’t see the workaround primarily as an absence of knowledge, but as a positive knowledge of treatment. He would say, “listen, what I know is that this practice alleviates some of the symptoms of the condition”, and that would be the basis of his authority.

What I mean is that the programmer tries to model a domain of reality, so he sees both the attempt at approximation and correspondence and the inevitable collapse of the pretense that the model re-presents the reality. A database of people is not the people–it’s not even a reference to the people, but rather to their vital statistics. Of course. How else could it be? So knowledge as a model carried in the head of someone– it’s not the thing, it’s not the authoritative image representation of the thing, it’s not the essence of the thing stored away, instead it’s what programmers call “domain specific“, it’s a specific socially-constructed protocol for interacting with a socially-constructed thing. In my vision the programmer’s disappointment doesn’t touch the doctor, because the doctor isn’t interested in the purity of a perfect model but in the efficacy of sound practices. The final step is that “people” believe in authorities at a level that is less sophisticated than either the programmer or the doctor’s (not supposing that one is more sophisticated that the other). They think that authorities just know stuff– authoritatively, without context.

I know the central situation is vague (what is the doctor ignorant about? etc.) but that’s because it’s from a daydreaming-thought-experiment of the kind I often have.


  1. That is, what distinguishes this thought from introductory Foucault. [back]
  2. in my vision it was a large red cancer on the lung contracted by ingesting an experimental drug[back]

Syntax Stupid Idea

I’m a big fan of English-like programming syntax. I love that Ruby has an unless operator and that both it and if can be put after the statement, like

do_this if this


do_this unless that

. I also like Javascript’s this word. I’d like to see all the prepositions in English utilized. How about a neither … nor expression syntax?

Okay, so the thing I want at the moment is demonstrative pronouns. We’re always testing a variable and then doing something with that variable. That sounds like that. How about this, then?

if hash[:key][:another_key] == "some value"
  puts hash[:key][:another_key] 
if hash[:key][:another_key] == "some value"
  puts that 

Granted, you could just assign the long value lookup to a variable, which gives more readable code. In fact, hell, you should always do this. I still want this construct. I can be talked out of it, though. What I’m more hot for is this construct:

$variable = $blah["key"]["another_key"] ? $blah["key"]["another_key"] : "default value";
# vs.

$variable = $blah["key"]["another_key"] ? same : "default value";

Cuz repeating the tested variable in a ternary just feels stupid, even when you’re using a well-named variable, amiright?

Non-Rails Autotest + RSpec + LibNotify + Linux

Update: The information below is VERY outdated. Take a look at new instructions for getting this set up.

Each of those terms actually means something! If you don’t know what any one of those terms means, then you probably won’t enjoy this post.

It’s surprising that something so cool and so central to the Ruby TDD world as Autotest is completely undocumented. Autotest with Rails and RSpec just works, and there are many googleable examples of how to add hooks for using Growl or libnotify. I couldn’t find any reliable advice for how to use Autotest with a non-Rails project and how to use RSpec instead of Unit/Test. The libnotify part is easy once the other two are solved, but I’ll share what I have going on anyway. This information may be available in pieces somewhere else, but I’ll just put it all here to help the other lost googlers.

The first thing to know is that this blog post is out of date. Autotest now speaks RSpec as one of its native “styles”. The trick is that you have to tell autotest about this style by creating a file called autotest/discover.rb in your project root. This contains:

Autotest.add_discovery do

The second thing to know is that Autotest looks in your lib/ folder for your files and in your spec/ folder for your tests, which should be called

There’s not much more to know. You can add awesome heads-up notification using libnotify. You need to get libnotify-bin using something like sudo apt-get install libnotify-bin. Then in the root of your project directory create an .autotest file like this:

module Autotest::GnomeNotify
  # Time notification will be displayed before disappearing automatically
  ERROR_STOCK_ICON = "gtk-dialog-error"
  SUCCESS_STOCK_ICON = "gtk-dialog-info"
  # Convenience method to send an error notification message
  # [stock_icon]   Stock icon name of icon to display
  # [title]        Notification message title
  # [message]      Core message for the notification
  def self.notify stock_icon, title, message
    options = "-t #{EXPIRATION_IN_SECONDS * 1000} -i #{stock_icon}"
    system "notify-send #{options} '#{title}' \"#{message}\""
  Autotest.add_hook :red do |at|
    example_text = ""
    num_examples = 0
    examples = at.files_to_test.each_pair do |key, values|
      example_text += "- #{key}\n"
      values.each do |value|
        num_examples += 1
        example_text += "  * #{value}\n"
    notify ERROR_STOCK_ICON, "Tests failed", "<strong>#{num_examples} examples failed in #{at.files_to_test.size} files</strong>\n#{example_text}"
  Autotest.add_hook :green do |at|
    notify SUCCESS_STOCK_ICON, "All tests passed, good job!", ""

I’ve modified mine to have very verbose notifications. I got it from here.

As I Avoid This Sleep

Package virtualbox is virtual
Boring screenshot is boring

This reminded me of a local meme1 in my office, based on the blank cat is blank global meme.

But while I have your attention, I want to talk about my software plans.

  • One thing I’ve meant to work on for a while is the “sessions” situation in Gnome. The fact that it’s not clear from the name what this is is the first indication of a thoroughly broken user interaction. If you want an application to start up whenever you log in you have to know to open the “Sessions Preferences” application, which looks like this:
    Sessions Preferences
    What is this?

    You actually have to type in the application name twice and know what options to pass to the program. Anyways, I’d like to come up with a complete solution for doing this the right way. In MacOS you get an option to add an application to startup just by context-clicking on it (I think xfce lets you do this with menu items in the menubar). There might be two parts to this. First would be some utility to encourage applications to offer to register themselves for startup. For example, Pidgin should ask if you want it to startup on login, duh2. The second part might be an “application pool” that would be used to select applications (with sane defaults supplied for parameters) to have in startup3. This information is surely collected several times over in the system, but what seems to be missing is a single sortable, selectable list of all the applications, including non-gui commands, with relevant icons and descriptions. Something like this would be necessary to fix the above session preferences window.

  • I keep meaning to jump into developing on Tracks, a nice hosted todo manager I use. Tracks needs todo sharing and delegation and also something like NowDoThis.
  • My most recent contributed opensource code has been to ViGedit, doubly ironic because the code is in Python and because I still use GVim for everything.
  • One of these days I’ll renew my commitment to Alexandria. I inherited this project from much more competent and dilligent Ruby programmers back when I didn’t know much Ruby. If I took a look at the codebase today I could probably hack on it much more quickly and effectively than I could a year ago.

Probably I shouldn’t even think of anything else.

Update (2/21/09):

But I should mention some other ideas I’ve had:

  • Add a notification mechanism for the game Wesnoth. This is a turn-based game where it’s tempting to minimize the window and do something else until you hear the bell for your turn. Popup notifications would be useful in case someone is trying to tell you something important.
  • Create a GUI for Boodler. I recently made use of this command-line tool to generate an hour’s-worth of pink noise so I can (occasionally) tune out my officemates’ music in order to concentrate.

Update (2/23/09):

  • It’s surprising if you think about it that there isn’t a simple revision-control system available in any text editor that I know. I could be totally wrong about this. Thought about this again when I read about this: boingboing. Have to look at this: wizbit. I might try something with Gedit and bzr.
  • Also, I’ve actually started playing with implementing Menagerie.


  1. “local meme” is a private meme referring to recurring joke forms that are local to a couple people. If you pay close attention you can track local memes as spreading from person to person, waning and dying, ressurecting themselves, etc. The meme meme sure does seem to describe them as phenomena. [back]
  2. Let’s see, Miro does this, but somehow in an annoying way. Gnome-Do has an option in its preferences to add itself to the session preferences. [back]
  3. For some reason I feel this program should be named Menagerie. [back]

As I Drink This Beer

A dystopian “control” society based on distraction. Remember, in Brave New World it’s entertainment, in Brazil it’s bureaucracy and prolishness, in 1984 it’s fear and propaganda… but distraction as such is something different. You set your mind to do something and you get distracted, you forget to do it, you forget that you even wanted to do it. The political control is that you can only do what is programmed for you to do. The closest literary example I can think of is the thought-suppressing bells in Harrison Bergeron. GTD is about programming steps for yourself to do in the absence of a continuous memory, while any decent employer can provide you with a constant feed of Microsoft Exchange tasks to complete. I once read a cool story about a  guy with progressive alzheimer’s who programmed a computer to give him tasks and look out for his welfare after his mind went; it’s in this collection somewhere. Anyway, the genius of such a regime would be that it would sustain the illusion of purposive activity. It’s becoming more and more clear to me that we need to defend ourselves against our primate nature.


You can’t really tell from this blog what I’ve been doing in the past year (or in previous years, either). Partly this is due to a congenital habit of not discussing anything that is directly relevant to my life. To know what’s going on you have to read the lacunae–if I’m not discussing it, it must be important to me1. The most prolific periods in this blog are from times when I wasn’t doing anything meaningful (and hating it). The recent long stretches of silence are due to an abundance of positive forward motion. The truth is, 2008 was a good year for me. Indeed, probably the most pressing dissatisfaction (and there are always dissatisfactions, c’est la vie) is the lack of reflection in my present mode. This makes me think about a Zadie Smith statement that she writes mainly so that she won’t sleepwalk through life. Yeah, let’s not do that. Anway, let me tell you about some major unannounced features of my current life.

First, I am 28. I am okay with this, really. Although I do think of January 13 as the starter’s pistol on a 2-year mad dash toward 30. Expect some erratic behavior  between now and then as I attempt to fill the waning years of my 20’s with value-added experiences.

Second, I am a graduate student. This is something that I’ve actually been doing since November of 2007. I am getting a Master’s in Philosophy at Duquesne University in Pittsburgh. This implies that I am living in Pittsburgh. Duquesne’s is a “Continental” program. If you don’t know what this means, in a Continental program it is possible and even common to say something that sounds and may actually be insane and have everyone nod. I’ve taken 9 classes so far. 3 more and a language to go. Most of them have been really great.

  • Fall ’07: Freud, Aristotle Metaphysics, Hegel Science of Logic
  • Spring ’08: Hegel & Shakespeare, Husserl Ideas I, Nietzsche
  • Fall ’08: Deleuze A Thousand Plateaus, Sartre B&N, Heidegger Contributions of Philosophy
  • Spring ’09: Contemporary Political Philosophy, Early Modern Political Philosophy

I’m re-reading Leviathan! I’m reading about Rawls!

Third, I am living in Pittsburgh. In fact, I have been in Pittsburgh for more than 2 years now!2 When I first got to Pittsburgh two years ago in January I was involved in a longish and dispiriting job hunt that ended with me joining a temp agency and doing some truly dull data entry. After the summer I got paid for a while to program in Ruby on Rails, then didn’t work in Spring ’08. The whole of the summer was taken up with an increasingly desperate and focused job hunt for a real, honest-to-god programmer job, which I landed in August! Also, randomly: Amy and I visited Hawaii in July.

Fourth, I am a software developer. I get up at 6:30 in the morning and go off to work as a web developer until 5 PM (well, I’m on salary, so this isn’t always true). My classes are all scheduled from 6-8:40PM. It could be concluded that I am following a course of study that is unified by the principle (or business rule, if you like), occurs after 5PM. This would be an ungenerous conclusion. The language I program in is PHP3. This is funny, because I actually hate PHP as a language (I’m a Ruby man). I like programming, though. I really like being a professional. After a post-collegiate career that has consisted almost uniformly of unchallenging, dull, hateful jobs I have a true appreciation for a job wherein I show up, devise technical solutions to interesting problems and then collect a reasonable salary for the work I do. And if I go straight from reworking the logic of the site “shopping cart” to a discussion of the Deleuzo-Guattarian “Body Without Organs”, that is the price of this lifestyle that I’ve chosen.

Fifth, other things I should mention:

  • I am paying down my credit card
  • I own a Playstation 3 and have completed Fallout 3
  • I watch too many movies
  • I hardly ever read any more and know this is bad. I like Murakami and graphic novels by Yoshihiro Tatsumi.
  • I have a nuanced but nonetheless loyal attitude toward open source


  1. I’ve long thought of this as the Kafka principle; Kafka never mentions God, Judaism or German ideology in his stories, which is how we know that he is preoccupied with these topics[back]
  2. I probably have a better internal map of Pittsburgh than I do of DC, because I’ve navigated a great deal of Pittsburgh’s east side by bike, whereas I seem to only know DC as a sliver of NW and a network of Metro stations.  [back]
  3. Primarily; web development is actually a combination of SQL, HTML, javascript and CSS and a server language[back]

Weird Spam

I actually wrote this a couple of months ago, but I was too shy to post it then.

I get the occasional weird spam mails that are sent to the alexandria-list-owner and I’m not sure if I can safely spam them in Gmail, so I end up reading a lot of interesting spam1. Most of the spam are about penis enlargement and viagra and are notable mainly for the creative euphemisms employed and the awesome shame tactics. Every once in a while I’ll open my inbox to something like this:

Stop being the weakling you are today.

Ouch. More recently, the spam has been related to fictional future events, apparently part of the Storm Worm, which Bruce Sterling has been following pretty closely. For example, I’ll get one that says:

Terrible earthquake devastated Beijing

with text “A new deadly catastrophe in China”. If you click through there will be a link to see videos, and this link will contain an .exe, which is how the worm spreads. The link, btw, is to an IP address which makes me wonder if the worm contains a small web server serving from a computer’s dynamic IP (cuz that would be smart).

Anyway, I got this new one today that struck me with its laughably hostile tone. It’s very rude and obscene, which is why I’m linking to the image. In other words, it’s NSFW: link. Tell me it doesn’t make you laugh a little with its absurdity.


  1. Obviously, I could have it not show up in my inbox, so I must have some purely sociological interest in it [back]

Idea Quickie: Event Wiki Site

Okay, so events are past public occurrences that get a URL. E.g., “a man who was wearing a gaudy green coat and playing a ukelele that disturbed people in the cafe at X.” In the case of crimes, these events would be linked to a crime report. But mostly the wiki page for an “event” would be for people to share an account about it, put a picture or video to it, etc. And there could be an interface that would essentially try to pinpoint events as an intersection between a timespan and a location. So this could really involve a Google maps mashup with two controls, an area box selector and a timerange selector. These would bring in sub- or dependent events from any larger set of events affecting the area. So for example, “the car crash at 6:15pm outside of the music festival venue (which occurred all day)” could coexist with the nearby event “woman who flashed traffic at 6:15pm outside of the music festival venue…”. Something like that. It would be a system that could report on mundane “shared urban events” or on crimes or on historical incidents. The main user story would be something like “I saw something remarkable today and wondered if others saw it and knew more about it; I went to the URL and shared a detail that only I noticed.” This is something that happens with local or topical blogs where an entry will become the canonical comment point for a public event, with the blog entry itself being updated through the incorporation of information from the comments.