Archive for February, 2007

everything’s terrible

Man, what a lousy start to the morning. To be fair, any morning that starts at 2:30 is probably going to be fairly crappy, but this one has some real staying power. I was awakened by a tap-tap-tapping on my chamber door. The last time this happened it was a cop who wanted to explain that he’d chased a suspect into my garage. Based on that experience it seemed like it was worth getting up. This time it was just my neighbor, who swept into the apartment and started fiddling with our thermostat. Apparently something in the building was vibrating annoyingly, and, as irresponsible young renters, Charles and I seemed like the sort of people who might ignore a problem until it involved shrapnel and scalding.

But it turned out that it wasn’t our furnace at all — it was blowing its usual stream of frigid air throughout the nighttime apartment as reliably as ever. This happens every time it snows — the heat pump can’t produce air hot enough to meet our modest-yet-optimistic thermostat setting, so the system just tries blowing the cold air faster in order to make up the difference. I appreciate the effort, but it’s not much help.

The other annoyances have been more minor. There was the slog to work through unsalted sidewalks — well, except for the American Chemical Association’s stretch of pavement, which is always immaculately clear (but also seems likely to be highly carcinogenic). And LastCall is throwing a fit, requiring me to shut it down until I can locate a nasty bug and quash it.

But the biggest letdown is that our company sexual harassment training — which, yes, was scheduled for Valentine’s Day — has been rescheduled due to the winter weather. I’m pretty bummed out; I had gone to a lot of effort separating candy hearts into “workplace-safe” and “unacceptably sexual” piles.

valentine's candy hearts sorted into 'acceptable' and 'unacceptable' piles

the aforementioned hearts separated into ziploc bags

Some of these were judgment calls: “my boy” was on the line, but its assertion of possession (and racist undertones) ultimately led me to give it the axe. Similarly, “dare ya” seemed fairly non-sexual, but was discarded due to the high odds that it would set events in motion that could lead to worker’s comp claims. But most of the objectionable hearts were easy to spot. “Kiss me”? “So fine”? You’d be astounded at the filth that Brach’s gets away with.

As for the rest of the day… well, I’m not optimistic. The high availability of candy hearts in my workplace makes it likely that I’m going to be feeling very sick by the time I head home.

UPDATE: The stupid cafe around the corner forgot to put stupid dolmadas in my stupid carryout Greek salad. I hate this universe.

you know a band is hot

…when it’s making its way into email spam. Forget Google — this is the real measure of the online zeitgeist.

screengrab of my inbox, featuring a spam message sent by 'the arcade fire'

did everybody wash their necks like Mr. Burns asked?

On the way into work this morning I saw a large, gaily-decorated RV with nurses inside of it. It was, of course, a blood donation van — a bloodmobile. More specifically, it was the Children’s Bloodmobile:

I had always assumed that the “Children’s” in the title stood for Children’s Hospital. But if that’s the case, is it just coincidence that the bloodmobile was parked outside of a K-12 charter school?

photo of a children's bloodmobile parked directly outside of a charter school

Is that “children’s” a proper noun or an adjective? It might be time to read up on how charter schools get their funding.

music things

I watched some of the Grammies last night, but I think I repressed everything that happened after the Eagles tribute. So it comes as an unpleasant shock to hear from Amanda that “My Humps” won an award last night. I can’t say that I ever expected to feel indignant sympathy for the Pussycast Dolls, but there it is.

I know, I know. It’s the Grammies. It’s supposed to be arbitrary and stupid. Still, there’s something that’s off-putting about an entity of pure evil receiving official recognition, no matter how dubious the honor. What if Mein Kampf was selected for Oprah’s Book Club? That wouldn’t sit right with you, would it?

And so it is with “My Humps”. I’m trying to think of what sort of song I would have preferred to see the Best Pop Song Grammy go to instead, and I’m having a hard time coming up with one that doesn’t qualify. Maybe an hours-long recording of a girl scout troop’s pathetic sobs as its members are forced to euthanize hundreds of baby animals with rubber mallets? It’s hard to say. Are we talking about farm animals or pet animals? I guess that’s where the line falls for me.



On to Arcade Fire-related matters. TUL is, as usual, on top of the concert situation in DC (as is Charles, from whom I first heard this rumor last night). But the news he brings is not good: word is that The Arcade Fire are coming to town, but they’ll be setting up shop in DAR.

I really hope this is wrong. DAR is for old people. There are seats and risers and carpeted floors. I’m sure it’d be a lovely spot for Glenn Miller show, but it’s a miserable venue for a rock concert. I realize that two nights at 9:30 is a lot to ask from a band that’s as hot a ticket as TAF, but I’d honestly rather have the band play out at George Mason than at DAR.

Oh well. At least the album is good. I was prepared to be disappointed after hearing the three leaked tracks that I grabbed before a friend sent me the full thing. “Black Mirror”, “Black Wave” and “Intervention” were all okay, but they didn’t affect me in the way that Funeral did. Fortunately, the second half of the album seems much, much better to me. “Ocean of Noise”, “The Well and the Lighthouse”, “(Antichrist Television Blues)”, “Windowsill” and “No Cars Go” comprise a solid block of music that I can’t stop listening to.

“No Cars Go” is a particularly pleasant surprise — I hadn’t paid attention to the Neon Bible tracklists, so the inclusion of the track caught me off-guard. They’ve been playing the song for a long time (it was on their first album) but until now I haven’t been able to find a good recording. The first studio version wasn’t performed or produced very well, and a series of muddy live recordings didn’t satisfy, either.

But now we’ve got a real version, and it’s unbelievably huge, overwhelming and, frankly, kind of exhausting to listen to. But it’s still great, because it reminds you that during the live show it’ll be even bigger. It’ll be the biggest thing you’ve ever heard.

UPDATE: Yup, DAR. Hell. Well, maybe I can catch the Philly show.

it’s kind of like a spanish vampire

It’s true that I’m not much of an expert in these matters. Still, I feel confident in saying that the announcer’s allegedly-Mexican accent in this Taco Bell commercial is astoundingly fake:

Maybe I’m wrong, but it seems pretty inauthentic to me. Like, Mind of Mencia inauthentic.

this is a seriously big deal

I know that most of my tech posts are completely inscrutable to normal humans. But do me a favor and go read this O’Reilly Radar post. I frequently disagree with the level of import that O’Reilly assigns to various web developments, but I actually think he’s sort of on the money when he says that “Yahoo!’s new Pipes service is a milestone in the history of the internet.” And I haven’t even been drinking! Much!

It really is pretty cool. It’s a drag and drop interface that lets you perform various web-mashup-y tasks. You can’t do anything new with it, but you can do a lot of things much more easily — and with free hosting to boot. This puts the power of the customized web into the hands of everyone.

Here’s an example. Let’s say that I want to keep tabs on Kriston with just one unified RSS feed. I fire up the Pipes interface, drag a URL-fetching object into the workspace and add the RSS feeds for Grammar.police, Eye Level and FreeRide. I drag in a filter object and draw a connection between the URL Fetcher and plug it into the Filter. Then I set the filter to only allow items where the word “kriston” shows up in either of the author fields (a quirk of different RSS formats) or the description field (where the text of the entries lies). Then I draw a link from the Filter to the output. Presto! I now have a unified Kriston feed.

But suppose that I feel that this combined stream of art criticism is too accessible to the rabble. I can go back to my workspace and drag a Babelfish object into it, placing it in between the filter and output blocks. I select the desired languages et voila: Kriston’s collective output is now available as an RSS feed en Francais.

And this is just relatively simple RSS stuff. You can get into querystring parameters, different data sources, string parsing and control structures like if..then blocks and for loops. I’ve only scratched the surface.

There are two downsides, though. First, as O’Reilly mentions, there are some bugs — the interface doesn’t work completely predictably. I had to highlight the filter box in order for it to fully populate the dropdown of filterable fields, and the babelfish module seems to miss some of the entries it’s sent. Second, it’s currently broken: it appears that the whole thing crashed shortly after I played with it (which was very soon after the O’Reilly post). Who knows if it’ll ultimately scale. I hope they get things fixed soon, but a framework as powerful as this is likely on the verge of collapsing under its own complexity. I wouldn’t count on the kinks being worked out in a particularly expedient manner.

to touch the face of deliciousness

photo of a delicious-looking corndog and some tongsWhy yes, I do own a deep fryer. It’s so sweet of you to notice!

I finally decided that this was the year to take the metaphorical plunge into boiling grease. For the past few Superbowls — sorry, “Big Games” — I’ve made buffalo wings the godawful way: deep-frying chicken wings in a pot full of peanut oil, then tossing them with a delicious mixture of butter and Texas Pete.

Although the wings usually turned out well, the process of making them was always disastrous. A combination of personal impatience, chicken wing frozen-ness and the laws of nature’s unpleasant inflexibility generally resulted in a roiling mass of steam and oil clambering out of the pot and spreading itself in a thin layer over every surface in my kitchen. It was disgusting, hard to clean up, and seemed likely to eventually result in a trip to the hospital.

This, combined with Emily’s sudden realization that she had a life-long aspiration to make corndogs, led us to Target last Saturday, where we considered their various deep-frying options. Most of the available fryers failed to inspire confidence. At the low-end of the market sat the chintzy Asian models, which looked like and probably were simple rice cookers with various important safety features removed. Their control dials also turned alarmingly freely, making it seem unlikely that they were connected to anything at all. At the other end of the market stood a much more expensive but even-chintzier American fryer. This one had the classic-looking rectangular basket and some impressively substantial knobs. But the rest of the device seemed pretty crappily made, like poorly-considered component of a PlaySkool fast-food-themed set of toys that had been hastily recalled, rebadged and resold.

That left just one remaining option, which was a little bit of a gamble since there was no display model. But ultimately the Friteuse En Huile Profonde seemed like the best idea. “They were right about Iraq, after all,” I thought. “Maybe they’ll be right about frying, too.”

Sadly, upon returning home we discovered that the fryer was actually Canadian in origin. Other deficiencies became apparent, too: there was no temperature control, leaving aspiring fryers just one setting (“poutine”) with which to work.

But overall the device didn’t disappoint. We made some french fries and they were good (although not as crispy as would’ve been ideal). Then we trekked over to the flophouse for the Superbowl and made some corndogs and wings. The corndogs were a huge success, but the wings were a little lacking — I didn’t fry them as long as I should’ve, and the result was slightly soggy. Also, they left the wires of the frying basket covered in a disconcerting brown substance. It’s probably just miscellaneous chicken gunk (their souls, maybe?), but it could also be that Giant adds chemicals to their chicken wings (“18% broth by volume!”) that can induce stainless steel to rust.

Unfortunately, that’s all the frying I’ve done since making the purchase. The oil was still too hot at the game’s conclusion for the fryer to be moved. Besides, Spencer expressed some interest in becoming the fryer’s foster father. It’s for the best — as a single parent, I simply couldn’t provide the sort of environment where a deep-fat fryer could really blossom. It’ll ultimately be better off residing in a household where a lot of people care deeply for it — and don’t mind every item they own smelling like french fries.

we love to build

Holy crap. That Swimmers album is better than I’d expected — is it too early to start nominating candidates for Album of the Summer? The last few years’ poor, belated crops of AoTSes makes me think that it’d best to get way out ahead of this thing. Anyway, you can listen to the whole album over at their website. I particularly like “We Love To Build” and “St. Cecilia”.

Relatedly, thanks to their use of the XSPF player the following super-nerdy* command is possible. I normally wouldn’t post it, but I think it’s the first time I ever actually got sed to do what I wanted.

wget -q -O - http://theswimmers.com/player/playlist.xspf | sed -e '/annotation/d' -e '/playlist/d' -e '/track/d' -e '/encoding/d' -e 's/<\/*location>//g' | xargs wget

A similar technique should be possible with the Hype Machine, but their failure to use line breaks in their XSPF files makes the regex composition a bit harder, so I haven’t bothered to figure it out yet.

* Admittedly, it’s not even close to being as nerdy as this, which is awesome (via Miller‘s del.icio.us feed).

smysteries revealed

Somebody emailed me for help setting up an SMS service, and I ended up spewing out enough words that I thought I might as well commit them to the web. If you want to do something cool and techy with SMS, here are the options that I know of:

  • You could buy a shortcode and SMS service from a vendor like Clickatel, then interface with their API. That’d run you around $1000 a month, plus $2k to get it set up (and usage fees). It’s how the pros do it, but I imagine it’s overkill for your purposes. Let’s move on.
  • You could make a setup like LastCall, which uses an open source project called Gammu, a cracked-screen Nokia from ebay, an unlimited SMS plan from T-Mobile and a surprisingly hard-to-get-working phone » serial cable (it took me months to find one that would work under Linux). A bunch of perl scripts (and a little Python) powers it all. I wanted to do this for various reasons, but it ended up taking me months and was a huge pain in the ass. If your application is going to be simpler, I would advise against it.
  • You could use the MOZES service. This is a shared shortcode that provides an API (which is somewhat poorly-documented, as of the last time I checked). You pick a keyword and can use it for a certain number of messages. When you text the keyword followed by a command to the shortcode MOZES it can integrate with your MOZES account in various ways — one of them is to trigger scripts that you’ve written and which use the MOZES API. This is probably the most accessible way to start using real SMS service. You could probably do something similar with Twitter, too (and without the account running out of messages), but that’s not what Twitter is designed for and they might shut you down.
  • Finally, you could simply rely on the carriers’ SMS-to-email gateways, which work pretty well. This is what traincheck.com does. It’s easy to get a cheap webhost, hook it up to a domain, then create an email address that forwards incoming mail to a PHP, Perl or Python (or whatever else) script (PHP tends to generate bounce messages unless you vigorously suppress every line’s output — I’d suggest one of the other two, if they’re all the same to you). The only downside here is that the wireless carriers will eventually shut you down if your service becomes heavily-used. But if you just want to automate some part of your and/or your friends’ lives with SMS, then this is simple, easy, cheap and works on nearly all phones.

automatically using the coral cdn

You might’ve noticed that I hotlinked those mp3s, providing URLs that point directly at someone else’s blog. This is normally considered pretty poor form — you’re using up someone else’s bandwidth without giving them any associated (and salable) web traffic. But in this case it’s not quite so bad: I used the Coral CDN to make the links. That reduces the bandwidth that my visitors will be consuming from the other sites to a negligible amount. NYU picks up most of the bill (and is presumably happy to do so). I wrote a bit more about the Coral CDN here; you can find their explanation here. It’s an extremely useful tool, and not just for excusing normally boorish behavior — if you have a large file on your own server, it can come in handy there, too.

The only downside is that it requires that users be able to send web traffic out on port 8090 8080, which is a slightly unusual requirement. It shouldn’t be a problem for most people, but if someone’s behind a restrictive corporate firewall, the Coral-ified link might make it impossible for them to get the file.

So to fix that I whipped up this Javascript. It attempts to load a small image (originating on this domain) over the Coral CDN. If it manages to, we know that the visitor can use port 8090 8080 and access the Coral system. If that condition is met, the script then replaces all the links on the page that go to big-seeming files with ones that use Coral (“big-seeming” is determined by the extension — mp3, mp4, mpg and avi are what the script looks for right now, but it’s easy to adjust that). If the image doesn’t load, the original link is left alone and will presumably still work for the poor firewalled visitor.

Here’s the script:

<script type="text/javascript">
function CoralizeLinks()
{
// modify the following line to adjust the extensions used by the function
var EXTENSION_MATCH_RE = new RegExp('\.(mp3|avi|mpg|mp4)$','i');
var x = new Image();
x.src = 'http://www.manifestdensity.net.nyud.net:8080/coral-test.gif';
x.onload = function()
{
var domain = location.href.replace(/http:\/\//i,'').replace(/\/.*$/,'');
var links = document.getElementsByTagName('a')
for(var i=0;i<links.length;i++)
{
if((links[i].href.match(EXTENSION_MATCH_RE))&&(!(links[i].href.match(/\.nyud\.net:80[89]0/i))))
{
if(links[i].href.match(/^http:\/\//i))
links[i].href = links[i].href.replace(/http:\/\/(.*?)\/(.*)$/i,'http://$1.nyud.net:8080/$2');
else if(links[i].href.match(/^\//))
links[i].href = 'http://' + domain + '.nyud.net:8080' + links[i].href;
else
links[i].href = location.href.replace(/\/[^\/]+$/,'/').replace(domain,(domain+'.nyud.net:8080')) + links[i].href;
}
}
};
}
</script>

To use it on your page just save the file as “coralize.js” and upload it to your webserver. Add this to your template’s <head> section:

<script type="text/javascript" src="/path/to/coralize.js"></script>

And modify your <body> tag like so:

<body onload="CoralizeLinks()">

There you go.

And, on an unrelated note, Peyton Manning’s dad just said he sent his son a pre-game text message saying how proud he was. It’s the future, even for old people!

UPDATE: Looks like Coral switched to using port 8080 instead of 8090 a while ago (I have no idea why — they say they’re going to start using port 80 “as soon as possible”). Port 8090 appears to still work, but I’ve updated the script anyway. Also, the Coral people appear to use the verb “coralize” instead of “coralify”, and I’ve adjusted the script to reflect that, too.