Fuckin' Job album cover

On behalf of The Vegetarians Promiscuous, it is with great hesitation and a caveat emptor overtone that I announce the immediate availability of a new EP by the eclectic sofa-rock group. Before another sentence can pass, I must request that you, dear reader, restrain yourself from listening to the music. If this restraint proves insufficient, know that I have placed Kreacher, my PowerBook, on the floor and type this on my knees with my nose to the floor (I am actually doing this): do not judge us too harshly.

The record is named Fuckin’ Job and is not for your children. (Please add this to your notes under “Reasons Not to Listen to the New TVP Album”.) Sometimes intentionally and sometimes incidentally, the topics and vocabulary become tastelessly inappropriate. Relatedly, I was somehow permitted to sing on every single track on the album, demonstrating reckless disregard of the common knowledge that I have no sense of rhythm and couldn’t carry a tune even if that stringy-haired and hollow-eyed degenerate, Tom DeLay, reached through the bars of his holding cell to fix his skeletal fingers around my neck and rasped through clenched, rotting teeth, “carry a tune!”. I am fairly certain that the only time I sing a real note on Fuckin’ Job is in the record’s only love song, wherein a vocoder has had its way with my tunelessness.

If the EP had a subtitle, it would probably be “we ran out of time”. The band originally imagined that it would produce good music, but it slowly dawned upon us that this would be very difficult. So, instead, we produced these songs. The process became one riddled with cut corners, half-assedness, and, above all, distraction. (My favorite of the former occurs in track seven, in which Kreacher’s fan noise almost entirely drowned out the voices of the band. An application of Audacity’s noise-removal filter had an unexpected and ridiculously irritating effect.) At least we are better than Wesley Willis.

Please cringe as little as possible as you listen, if you must, to these songs on last.fm. In total, they run twenty-seven minutes exactly.

  1. Best Suit (4:07)
  2. Breakfast (1:40)
  3. People Always Tellin’ Me to Get a Fuckin’ Job (1:53)
  4. You Suck So Much (1:28)
  5. Breakfast Part ii (3:53)
  6. Symbols & Numbers (1:48)
  7. The Tight Pants Dance (12:29)

The Vegetarians Promiscuous are:

You may also be interested in some other Fuckin’ Job-related resources.

  • It’s possible that you might want to read the lyrics.
  • You could need to see a PNG of the front cover.
  • Or, perhaps, you’d be more into the back cover.
  • Not one to take sides, maybe you’d like to download a PDF of the full liner, including both covers and all the lyrics. Print the two pages onto opposite sides of the same sheet of paper. Choosing the correct orientation for the paper may take some critical thought, but I’m sure you can do it.
  • There’s a chance that you would like to download these tracks. You can do this at the last.fm album page.

Once again, these tracks are offered to you under the Creative Commons Attribution 2.5 license.

Perhaps I have been reading just a bit too much Neal Stephenson lately, but it seems to me that humans are dangerously susceptible to “infection” by ideas and images. Once a thought enters a human mind, willfully or otherwise, it sinks into the subconscious and cannot be forcibly removed — it asserts itself consciously in convenient circumstances until it is peacefully forgotten.

A perfect demonstration of this occurred on Wednesday, July 6th, 2005, when five people whose minds were (and are) unhealthily saturated by the ideas and images of the online photo-sharing service and mind-composting machine Flickr assembled with the primary goal of shortening the hair of two of their number. After the carnage had subsided, cleanup began, and, anomalously, the discarded hair formed itself into two circular wads of contrasting color.

I can’t recall for certain in which relatively independent sub-totality the idea arose (probably this one, though). The saturation of Flickr-imagery acted as impenetrable noise. Eventually, the group began nudging the wads of hair around and snapping successive photographs. They produced an animation that is simultaneously a novel and clever echo of something beautiful flickr loading dots, at least from their perspective, and the most disgusting GIF animation of the year:

shuffling hair

Well, that was quick. A few of the people waiting for Tiger compatibility were sorely disappointed by iCAR 0.8. Instead of crashing when a message was received, iChat (with iCAR installed) became entirely non-functional at startup. The buddy list would not appear, menu items would do nothing, and, perhaps most worryingly, the application menu (the one titled “iChat”) would not even appear.

This happened, however, to a minority of users. iCAR worked perfectly under fresh installations of Mac OS X and iChat, but failed because of some vestige of the previous installation.

Hm, I said to myself, stroking my jutting chin dramatically and narrowing my aging eyes. This sounds eerily familiar.

The help of faithful user Shamir came to my rescue in this singular case. Using copies of his iChat preference property list and an inductive technique that I’ve come to call “change a working installation into a broken installation in little increments until it becomes broken itself”, I identified the offending entry in some users’ com.apple.iChat.plist.

Although I pretended to be startled and even a bit alarmed for the benefit of the swarm of reporters I had by then attracted, I had had a nagging suspicion, almost an intuitive certainty, all along that I would find the root of my troubles in NSToolbar Configuration NSPreferences.

Aside from that it exposed my striking similarity to certain Doylian (which I am certain is the incorrect word) characters, the problem is actually rather interesting and might crop up again for me or someone else, so I’ve decided to write it up here.

Under Panther, a strange problem cropped up that, for some users, would cause the iCAR “Auto-Reply” preference pane to be missing from iChat’s “Preferences” window. Many sleepless nights pointed me toward a strange default in the iChat preference property list of some users:

<key>NSToolbar Configuration NSPreferences</key>
<dict>
    <key>TB Display Mode</key>
    <integer>1</integer>
    <key>TB Icon Size Mode</key>
    <integer>1</integer>
    <key>TB Is Shown</key>
    <integer>1</integer>
    <key>TB Item Identifiers</key>
    <array>
        <string>General</string>
        <string>Accounts</string>
        <string>Messages</string>
        <string>Alerts</string>
        <string>Privacy</string>
        <string>Video</string>
    </array>
    <key>TB Size Mode</key>
    <integer>1</integer>
</dict>

(How or when this preference was created still eludes me.)

In particular, the TB Item Identifiers array was to blame. It defined which preference panes would be displayed in the iChat preferences toolbar. “Auto-Reply”, of course, is not on the list. So, without even consulting NSPreferences, the NSToolbar instance would refuse to display the button that could display a quite dormant iCAR preference pane.

Diabolical.

My solution to this was to hijack the standardUserDefaults class method of NSUserDefaults using poseAsClass:. Whenever anything requested access to the preferences of iChat, iCAR would fetch the standard instance, remove the TB Item Identifiers entry, and pass it along as if it were an accurate reflection of the property list stored on disk.

Equally, if not more, diabolical.

This came around to bite me when users who upgraded to Tiger still had this preference. Something changed in the handling of NSUserDefaults and it was not my or iCAR’s place to tinkering around at its lowest levels. Essentially, I ended up returning a useless value whenever anything needed the standardUserDefaults, which wreaked all manner of unseemly havoc on the running instance of iChat.

Fortunately, it looks like Tiger entirely ignores the TB Item Identifiers entry when dealing with NSPreferences. The old bug suddenly vanished, so the fix for the new bug becomes the happy ending of this tale: I just deleted the two files that implemented the NSUserDefaults hack.

Please excuse the inexcusable gibberish above. I did not intend to put you through it. It might be said that it just poured out.

Regardless, iCAR 0.8.1 — which was fixed only by deleting code — is very available. Binary, source.

I have at long last gotten off my lazy tuchis and updated iCAR to be compatible with Tiger and iChat 3.0. I would like to take this opportunity to apologize publicly to the world as a whole for taking as long as I did. Please do not eat my brains.

obsolescence strikes

Of most pressing note, of course, is that iCAR has suddenly become much less useful. iChat 3.0 now incorporates rudimentary auto-reply functionality. In some respects, you might say that iCAR has gone the way of the Watson, but in truth, this story is not nearly as dramatic as Watson’s or Konfabulator’s. There is, namely, zero lost revenue here. I have decided, however quixotically, that I will continue to maintain and add features to iCAR despite its semi-uselessness because it can do some pretty neat stuff and also out of pride.

Changes

Essentially, release 0.8 of iCAR really only does one thing: it is the Tiger version of iCAR. Under the hood, however, some positively riveting things happened to the code:

  • The preference pane was widened to match iChat 3’s panes.
  • iChat.h was updated to match iChat 3 and the new InstantMessage.framework.
  • I refactored message-capturing to match iChat 3’s new structure.
    • Instead of IMService, I now interface with the new Service class.
    • Chats are no longer automatically accepted because they don’t have to be (see “Observations”, below).
    • I removed unnecessary mechanism for delaying past chat acceptance (again, see “Observations”).
  • Another unneccesary mechanism, this one for accessing status, was removed (the curious, repetitive, and truly nerdy would benefit from another glance below at “Observations”).

Observations

  • iChat 3 removes a long-standing annoyance. Previous versions could not send messages if chats were not yet accepted (or, even more infuriatingly, if they were in the process of animating their acceptance). This means that replies are now sent faster, iCAR’s code is much less complex and much prettier, and the software will probably break for fewer people.
  • All of the IMService code I patched was apparently moved into the Service class (even the method signatures I hijack are identical). IMService still exists, but it seems to be greatly simplified, presumably because InstantMessage.framework is now a public framework. It provides a nominal interface for interacting with the status values and messages of iChat (really, iChatAgent.app, the protocol daemon). I initially had trouble patching Service using poseAsClass:, so I eventually elected to use the method swizzling technique well-documented by Mike Solomon of PithHelmet (Greasemonkey for Safari, sort of) fame.
  • I don’t know if this appeared in IMService at any point in the past, but Service has the class methods +myStatus and +myStatusMessage for obtaining global settings about status. Previously, I was hacking a method into the buddy list window controller to get the status. With iCAR 0.8, I had the satisfaction of deleting that pair of files.

Questions

Because iChat 3.0 incorporates basic auto-reply functionality, a iCAR is having a bit of an identity crisis. I’m fairly certain it should stick around, but I am wondering a bit about its role.

  • Should it still be called the iChat Auto-Reply? It’s definitely no longer the
  • I should probably stop calling it a “simple” auto-reply feature. (Apologies; that was actually not a question.)
  • Should the preference pane and “Enable…” check box continue to use the name “auto-reply”? Now that there are two auto-reply functions in iChat (with iCAR installed), perhaps the term is too generic.

The future

It seems that I will never be short of new features to implement into the next next version of iCAR.

  • Demand has increased recently for iCAR to play nicer with the style settings in iChat. That will be Real Soon Now.
  • Also sorely lacking is the passage of variables to AppleScripts (variables are currently only passed to shell scripts using environment variables). This needs to happen right-quick.
  • Does iChat’s built-in auto-reply functionality set the “this is an auto-reply” flag when it sends its message to the AIM server? If so, can I hijack that in the name of nearly-worthless iCAR progress?

Get it/got it/good

Hurry up and download. Or perhaps you’d like the source.

Now, raucus festivities in celebration of blogging would be nothing more than shameful without a few blog posts (1, 2, 3, 4, 5) about them, would they? My contribution follows.

I found my way to the Bainbridge Blogger Bash by a fortunate Flickr coincidence: I can’t quite remember how, but I discovered Julie Leung’s photostream and marked her as a contact. Soon enough, she had noticed our geographical proximity and had extended a kind invitation to the meetup for webloggers on our rock that she was planning at the end of the month.

I showed up late and nervous, having minutes before pulled banana muffins out of the oven. (Please feel free to skip these parentheses if you are not interested in the muffins; all of the sentences they contain are on the subject of muffins. First, for attendees of the Bash, the muffins were vegan. I neglected to inform you of this, but it seems like something you might like to be aware of. Second, I modified the recipe slightly to great effect. Notes on these modifications are on the recipe entry.) I expected to know none of the attendees personally and further that they would all have at least a generation on me. I was approximately correct on the latter point, but the former was disproved when I encountered Dave Henry, whom I can’t recall having laid eyes upon for upwards of seven years. He’s moved on to bigger, better, and appropriately more ambitious things since then. Namely, he’s scaled to international trade.

From there, I began to get a sense for the group as a whole. With some exception, the guests were not as technically oriented as I had led myself to believe that they would be. Dave and Philippe Boucher noted that their interest in the phenomenon of the weblog was decidedly non-technical in nature — the general focus of the group was on the social definition of the weblog as opposed to the technical implementation.

This is not, of course, to give you, dear reader, the impression that the gathering was devoid of nerdiness. Geekery was present in abundance. To illustrate this, I need only observe that our name tags, whose materials were graciously provided by the hosts, contained two items of information: or names and our URLs. The practice of identifying oneself by one’s Web address was inspiring. My name tag has found its temporary home on the door to my room, but may eventually make its way back to my shirt in the near future.

While Ted Leung, the drive-by spammer who knew my software before my name, interjected witticisms, I got to know Philippe and Chip Gibbons. I briefly discussed the obligatory college matter with Ed Hager and considered with the disgracefully English and clever Chris Holmes swapping my given name for that of my photo-sharing service. Others (like Mike Houser and Molly and Walker Willingham) I had to observe from a distance — two hours, it seems, truly can fly.

To paraphrase my logorrhea, I had a surprisingly and relentlessly good time. Next time, Gillon, Sarah, Sean, et al?

Triach Trio & Ivan Sly album cover

Capra hircus is proud to announce and distribute the debut album of the local improvisational, progressive, slightly a capella band Triach Trio & Ivan Sly. It includes nine tracks, totaling 36 minutes and 41 seconds:

  1. Five Fingers to Face (3:38)
  2. $2.00 Bagel (3:58)
  3. Bird in the Room (3:43)
  4. NYL… What? (2:53)
  5. Jam Session (6:51)
  6. Free-Achin (3:02)
  7. Feetsies (1:30)
  8. Joel (1:05)
  9. The End (10:06)

The band would like to sincerely apologize for track seven, “Feetsies”, and humbly request that you skip over or delete it. Triach Trio & Ivan Sly are:

Download the tracks from the last.fm album page. View or print the front and back cover art in glorious PNG-24.

If you’d like the album as 128kB/s AAC (25.8 MB) or even as FLAC or ALAC, let me know in the comments. Likewise for larger versions of the cover art. The music and artwork are provided under the Creative Commons Attribution 2.0 license.

ferry from satellite

This is probably not remarkable enough for Google Sightseeing, but the satellite used to photograph the Earth for Google Maps caught a ferry en route from Bainbridge to Seattle. The best thing about the satellite photo is an astounding depiction of the wake caused by the ferry. An enormous arc is left behind the ferry. Multitudes of ribs coming off of that let you sympathize with those whiny Wing Pointers (no offense is intended to any individual Wing Pointer). A sight worth seeing. Also, a buoy is visible.

Discussion question: Is the smaller line of wake to the ferry’s port side (our right) a Coast Guard escort?


This is the second in a mini-series of two posts that I’m calling “Posts in Which I Gripe About Widely Appreciated Work”. These posts are very negative, and for that I apologize, but they are also true (in the sense that they accurately represent my feelings). If I am wrong about any points, it would be more productive to point this out to me than not to point it out. This is because the apparent veracity of these gripes makes me, generally speaking, unhappy — if one or more is false, I will almost certainly be happier and, presumably, having set a fool on the right path, you will, too.

I only occasionally need to come into contact with PHP, and now is one of those occasions. I can’t help but think, with every syntactical weirdness that I need to circumvent, that PHP is the Geo Metro of programming languages. Its unfathomable popularity is one of the great life questions that I hope one day to answer for humankind so that, in the future, such a colossal mistake will not be made again.

  • Some functions (print, echo, …) aren’t actually functions but “language constructs” and don’t need parentheses. The rest require them. Oy.
  • I can’t treat lists as arrays. Specifically, I can’t do this: $id = (mysql_fetch_row($qry))[0].
  • Everybody says so, but function names and parameters are esoteric and inconsistent. In some ways, there are just too many (without namespaces!).
    • Take, for example, the inconsistency in parameter order between regular expression functions and strpos-related functions.
    • An example of another symptom of function bloat is PHP 5’s strripos function. That would be strpos (already vague enough) with two mutations, each signified by a single letter shoved right in the middle of the function name: find-from-right and case-insensitive.
  • Entirely aside from the aforementioned lack of namespaces, PHP scoping is absurd. The global keyword is a joke, and it’s not a funny one (no inline assignment, globals aren’t really very global and need to be imported…). Scope has two modes: “global” and function-local (no other blocks).
  • Arrays are actually hashes! This is infuriating!
  • Regular expression replacement functions do not return a useful success value. (I suppose that this might be okay for people who are not used to Perl, but it really seems inefficient.)

I must acknowledge that everything seems to work. As with most high-level, dynamically typed languages, PHP is (for the most part) very forgiving, once you can figure out what you’re doing in any given situation.

This is the first in a mini-series of two posts that I’m calling “Posts in Which I Gripe About Widely Appreciated Work”. These posts are very negative, and for that I apologize, but they are also true (in the sense that they accurately represent my feelings). If I am wrong about any points, it would be more productive to point this out to me than not to point it out. This is because the apparent veracity of these gripes makes me, generally speaking, unhappy — if one or more is false, I will almost certainly be happier and, presumably, having set a fool on the right path, you will, too.

There is perhaps no belief held more universally and more certainly among advanced Mac OS X users than that in the rapid resource access software that they use (a belief that will be widely shaken next week with the advent of Spotlight). I use LaunchBar. However very neat some of its myriad of features are, QuickSilver annoys me in little ways. They follow.

  • Web searches are closer at hand (typing a space makes more sense to me and involves moving my hands less than typing tab twice to get to the search field).
  • The kinds of items that can be accessed in QuickSilver with the right arrow and the tab key seem inconsistent. For example, one right-arrows iTunes to get to “show playing track” but tabs it to “open” (actions, as opposed to items, can be in both places).
  • QuickSilver attempts to categorize too much. LaunchBar is a beautiful mess. For example, all of my iTunes tracks, albums, artists and composers are munged right into LaunchBar’s main configuration. When I used QuickSilver, I had to set up different esoteric key combinations just to avoid having to find the “iTunes Music” item, right-arrow into it, down-arrow to the “Browse Artists” item, move into that, then double-tab to “Search Contents” (and all this with the downloadable, non-default iTunes module). I never really managed to remember which key combination was albums, which was artists, and which contained tracks.

Matthew Russell over at O’Reilly’s MacDevCenter.com published Friday an article called “Protect Your Source Code: Obfuscation 101”. I’m sure that Mr. Russell had wholesome intentions — be they screamingly capitalist intentions — but I must take issue with his message. No, I’m not going to complain about security through obscurity (which is an often abused concept anyway), nor speed, nor his forgivable oversimplification of the compilation process.

I instead ask you to refrain, except in extreme circumstances, from obfuscating your code. No matter how perfect you think you make your project, you won’t have time or resources to respond to every demand from your users. There will be features to add and bugs to fix that you can’t (or won’t) implement yourself. I realize that it’s sometimes implausible to go open source, but leaving comprehensible symbols in your code can open a world of possibilities.

iChat is my AIM client of choice, and I, certainly, could never duplicate the work that has been put into it. It lacks, however, an “away message” functionality that other clients have come to expect: status messages cannot be sent automatically when messages are received. So, I wrote iCAR, the iChat Auto-Reply to make iChat a more complete client. Had it been obfuscated as Mr. Russell suggests, I’d never be able to guess which symbols in iChat needed patching to implement auto-reply functionality. Digging through symbols is bewildering enough already (for some reason, a great number of class names in iChat are prefixed, inexplicably, with “Fez”); code obfuscation would make the exercise impossible. Beyond iCAR, straightforward compilation has made innumerable clever hacks possible and life as a modern computer user just a little more bearable.

So, please, just do me a favor: leave your code comprehensible. On behalf of your end users, I remove my hat.