Quicksilver meet the holy wars…

Was just chatting with Howard, who has literally written the book on Quicksilver, and was trying to figure out why he finds so much more utility out of Quicksilver’s keyboard triggers than I do…  I find myself using the "Command Mode" in most of my interactions with Quicksilver, but Howard makes extensive use of keyboard triggers.  We were chatting back and forth about this, and I struck upon a minor epiphany:

Quicksilver’s command mode is somewhat analogous to the command mode in my editor of choice, Vi.  Keyboard triggers, however, are much more like the meta-keystrokes of the Emacs editor, which is Howard’s favorite editor.  My brain is happy to deal with the notion of different modes for different contexts, where as the Emacs user is much more comfortable remembering a multitude of various keyboard combinations to get their work done.

It’s pretty cool that Quicksilver is this flexible, and in fact it one-ups both of the editors by allowing you to seamlessly choose whichever method appeals to you on a task-by-task basis, and furthermore it’s not mutually exclusive.  I do use a few triggers for some common searches (like IMDb, Wikipedia, etc) but setting up those triggers doesn’t prevent me from executing those searches in command mode.  And in this way, allowing you to choose the solution to a problem from a whole menu of methods (commands, keyboard triggers, mouse triggers, gestures, etc), Quicksilver is also analogous to a combatant in another holy war, Perl.  Perl provides many different ways to express oneself, and generally grants the programmer flexibility in expression.

Another way that Quicksilver is like Perl is that it is very tolerant of ambiguities and tries to resolve them as best as it can.  Type "adress book" into the command window of Quicksilver and there’s a good chance that even though "address" is misspelled Address Book will at least be among the top choices of Nouns/Subjects.  Quicksilver’s stated purpose is to allow the user to "Act Without Doing".  While that motto is a little too metaphysical for me, I think that philosophy is what drove this tolerance programmed into QS.

Myself and many other programmers are frustrated by Perl’s anything-goes philosophy, claiming that by being so permissive it makes reading the Perl code of someone who has a different style than you (or even reading your own code fro a few years ago) a difficult challenge at times.  If I were to try to continue to stretch this analogy, I would say that the Quicksilver version of this gripe is that, as a user, you end up growing so dependent on your specific usage patterns that if you work on a machine with QS configured differently, not installed at all, or science-forbid, a windows box, it can be rather frustrating.  You constantly attempt to invoke Quicksilver and fail, or even worse, learn that your carefully selected keyboard triggers vary drastically from your friends.

I have grown to really love Quicksilver, and I urge all Mac users to give it a swing!  They’ve done a great job of pushing most of the really geeky features under the surface a bit, and it tends to be as complicated as you choose.  I used it for a few years in straight command mode and found it to be super empowering, but over the past year or so (mostly due to prodding from Howard), I have found myself slowly expanding my horizons, and playing with more and more features of this amazingly deep tool.  Not all of the features I play with stick, but when one does, it suddenly feels like your old method of doing something was so antiquated.  For more information:

Update: Here is Howard’s take on this subject.

BarCampBoston – June 2006

Headed out to Maynard yesterday for BarCampBoston. I had the dubious distinction of being the first person to show up (other than the volunteers putting it together), but fortunately some others were quickly behind me. Hung around for about an hour or so before the first session… At first, it looked like it was going to be slim selection, but the schedule filled up quickly. The first session I went to was on “Neo-Cartography”, but it was pretty lame because the guys running spent about 15 of their 30 minutes on going around the room … I was worried that the “ad-hoc” nature of the event would cause all the sessions to be kinda chaucey, but I think people just needed a bit of time to figure out how short 30 minutes actually is.

Went to several great sessions, and I even took notes for several of the sessions I attended.. I used SubEthaEdit for the first time, and while nobody else contributed to my documents, a few people requested copies of the notes by adding their address to the bottom of the docs.

I didn’t go back for day two of the conference because I woke up early to take to the airport and when I got back I took a nap that ran “a little long”. I was going to do my talk today on “Why working on classified software sucks”, but oh well.. The deal with BarCamp is that every attendee is supposed to give a talk, so I’m a leech, but the whole grid was pretty much full yesterday, so whatever.. I’ll be more prepared next time around…

lazyweb code review

I’m writing a tool in python that will automate the posting of the weekly newsletters for the film club. Currently, I manually post to LiveJournal, Craigslist, the SNFC webpage, and the mailing list. I had a tool a long time ago but it broke for various reasons.

Anyway, I want to have a directory of .py containing classes, and call a method [execute()] on each of them. This way I can just create a new subclass, pop it in that directory, and it will be picked up automatically. This is what I came up with, somehow I feel it’s crude and there is a better way to do it (ignore bad var names pls):

plugins = glob.glob("plugins/*.py")

for x in plugins:
pathName = x.replace(".py","")
className = x.replace(".py","").replace("plugins/","")

foo = __import__(pathName,globals(), locals(), [''])
bar = getattr(foo,className)

obj = bar()

obj.execute(nl)

This code looks for all of the .py files in the dir, imports them, gets the class from the imported module, and instantiates them. Finally, it calls the execute() method. Any suggestions?

Land of the Dead

I have had fairly mixed results when picking horror films as the weekly selection for the Sunday Night Film Club, sometimes the turnout is good, but often it isn’t so good. So I’ve been avoiding picking horror films, but it was just too difficult to skip on Land of the Dead this week, so I threw caution to the wind and chose it anyway. We are seeing it tonight at 7:20pm, and I know , Audra, and myself will enjoy it, even if others don’t.

Around noon yesterday, and called us to ask if we wanted to go swimming at Adam’s parents’ house. After Corinna and I beat down our spontaneity avoidance circuitry, we said yes and asked them to pick us up (which had the combined effect of giving us 20 minutes to get ready as well as being able to drink and not worry about driving). We had a great time, along with the aforementioned people, we were joined by , Eric, Linda, Todd, and Katie O. We ended up swimming and some barbecue came to bear as well, and although we were originally planning on only sticking around until the early evening, we didn’t leave until 10pm.. It was a fantastic way to spend a ridiculously hot day. Unfortunately, this meant we missed the party at my coworker Brian’s house, but so it goes..

I have this project at work, which I had started working on a bit before I broke my leg. This project had a deadline of June 30th. This deadline was fixed, and couldn’t change even though I was out of commission for two months. What makes this worse is that nobody else worked on the project at all while I was gone. And I’m not talking about “no coding was done while I was gone”, I mean nobody worked on it.. I had questions out to program managers, image scientists, etc. when I left to go skiing that fateful weekend, and when I came back to work after convalescing nothing had changed, none of my questions had resolutions. It was pretty frustrating… Fast forward a month and change to today, and things are looking fairly OK, but mostly because I stopped waiting on those who were roadblocking me and just “got it done”. Of course, as soon as these individuals see the software I’m sure they are going to gripe and complain that it doesn’t meet the non-existent requirements. Fortunately for me, I’ve kept my boss in the loop of my frustration and have a nice set of “get me some fucking information” email to cover my ass.

Anyway, I employed the services of Tim, who has just returned to the company full-time after a co-op a year or so ago, to help me with some UI stuff just to get it done. We left friday with one outstanding configuration UI to finish, but it shouldn’t be a problem. In fact, I had one of those eureka moments after I got back from Adam’s last night, and quickly jotted down some notes that should help me thrash out this final bit in short time on Monday (after physical therapy, of course).

Don’t throw me away

I was reading this BBC article on the growing use of more advanced Artificial Intelligence in gaming. Most of the article focuses on the game Black & White, which is going to hit store shelves in about a week.

A part of the article really got on my nerves, however:


Game makers are turning to AI to make titles stand out in the highly competitive world of computer games. They like it because, if it is done well, it is a very cheap way of adding playability. Instead of spending huge sums on sumptuous graphics, long cinematic sequences, endless levels, characters and plots, a game can be made much more challenging with a bit of nifty programming.

The implication that advanced AI coding is somehow easier or cheaper than “sumptuous graphics”, etc… really bothers me. We have reached the point where programming is important to everyday life, yet it is still somehow regarded as some redheaded stepchild. Being that the team behind Black & White is comprised of some of the most talented artists, developers (who are artists as well, IMHO), designers, and managers, I can’t imagine that they picked up a copy of “AI for Dummies” and snarfed/barfed code to make their NPC’s smart. They instead put hours and hours into perfecting the level of AI that they desired. The article itself quotes Molyneux speaking about how hard it is to get AI right. Grumble.