Error Messages, Unhelpful

I just received the following bounced mail:

This is a delivery status notification from %s,
running the Courier mail server, version 0.52.1.

The original message was received on %s
from %s

I love how the one bit of information that came through is the exact version of Courier that they’re running. Because that’s exactly what I need to pinpoint why %s isn’t getting mail that %s sent them at %s.

It’s Almost Time

I think some conservatives get really scared at the ridiculously huge crowds supporting Obama, and maybe even annoyed at the sight of him at the Lincoln Memorial.

I’m psyched for a few reasons. Obama himself is only a small component of those. He’s just a guy, an imperfect human. But what I think is so inspirational about Tuesday is a number of things:

  • It’s President Bush’s last day. “01.20.09” bumper stickers have been around for a couple years. Looking back, I almost feel sorry for GWB. He took office amid tremendous controversy, the election being decided by the Supreme Court. The economy wasn’t quite as amazing as it was during the center of Clinton’s term. And 9/11 certainly put a damper on things. I don’t buy into the MIHOP conspiracy theories. But I do believe that the Iraq War (including Guantanamo) has cost about 4,000 American lives, distracted us from finding Osama bin Laden, and made us an international pariah. Hurricane Katrina was an unmitigated disaster, and overhearing the name Michael Brown on the news brought back the full absurdity of having an Arabian horse judge head up FEMA. The full blame for the present economic collapse can’t be heaped on Bush, but I’m certainly with the two-thirds of America that thinks he hasn’t helped. His repeated use of terms like, “The economy cratered” don’t help to inspire confidence. Warrantless wiretapping. Waterboarding. And so forth. I’m not saying that Bush was pure evil, just that I won’t be sorry to see him return to the private sector.
  • I’m politically cynical. I didn’t like McCain, hated Hillary Clinton, thought Kucinich was crazy, hoped Romney got run over by a bus, and think Gore is better at his environmental stuff than he would have been in elected office. There are millions of people like me. My demographics—people in their teens and 20s—is one of the most politically-apathetic demographics on the face of the planet. I spent my month-long winter break volunteering for Obama. Many of my fellow volunteers had also never gotten involved in politics, or even really cared.
  • But we weren’t just campaigning for a man named Barack Obama. We were campaigning to take the government back from the wealthy and from big corporations. We were fighting to take back the role of America as a defender of international human rights. We were pounding pavement to talk about equal rights. In short, Obama was just the spokesman for a novel new concept: a government of the people, by the people, and, most of all, for the people. The election of Obama, then, stands as an important reminder: if we, the American people, don’t like the government, we, the American people, can rise up and change it, to make it serve our needs.
  • As much as some on the right love to argue that he’s only half-black, I think the election of a black man to the Oval Office is a major milestone in America. And anything that gets the KKK riled up is probably a good thing for America. Without meaning to imply that people who preferred McCain were racist, there were undeniably some overtly racist people out there protesting Obama. His election shows that, although racism is alive and well in America, it can’t hold a candle (or a burning cross?) to the tolerance of America.

For people like me who will be stuck in the office Tuesday 11:56 a.m., here’s a discussion of some places that will be streaming it. I rarely listen to WBCN these days, but they mentioned that they would be streaming it on their site, too.

In the meantime, check out the Yes We Can song. Though I didn’t like it musically at first, it’s grown on me, to the point that it’s really powerful and moving. A bit of trivia: the Yes We Can song, by of the Black Eyed Peas, is sampled from Obama’s New Hampshire concession speech… at Nashua High. Our spirits were high on election day, with one poll showing Obama leading Clinton by as much as 10%. But in an upset victory, Clinton won the NH Democratic Primary. Obama’s concession speech at Nashua High, though cordially recognizing Clinton’s success, was called “anything but a concession” (though I can’t come up with the citation). About nine minutes in is the start of the “famous” part of the speech.

Of course, his loss in New Hampshire wasn’t a major setback. Here’s Obama’s speech on election night, addressing the nation for the first time with what would soon become a tiresome phrase: President-elect Barack Obama.

But in 38 hours, we’ll drop the “-elect,” and begin the process of reshaping America. And what a day it will be.

A Little Photography

I haven’t been taking photos as often as I used to. I suppose having a full-time job and a 100-mile-a-day commute can do that. So I wanted to share a few photos, as well as a commentary on the ExpoDisc.

When I first got it, I knew that photographing in Margarita’s would be the ultimate test. They have red lightbulbs. The atmosphere’s great, but the pictures end up coming out like this:

Auto White Balance

That’s with the camera set up to automatically adjust for the right type of light. Obviously, this is a major headache if you’re trying to take photos. And it’s really not that easy to fix up in Photoshop because the colors come out so far off that you can’t salvage much.

Adjusted Flowers

It’s underexposed and boring, but here they are after I calibrated my camera with the ExpoDisc to the light hitting the fake flowers. It’s not quite perfect in my mind: it’s got a tiny bit of a green cast. But something like that is easy to fix in Photoshop. (The problem was that there were “green” lights in the parking lot coming in through the window, red light bulbs indoors, and orange light coming in another window from across the street. It’s pretty much impossible to have things look great in that case.)

Honda Accord

This is an entirely unrelated photo, but I was on a long car ride and decided to practice panning. (Car companies almost always do this for their photography.) I shot at ISO100 and f/8, so that not much light was coming in. This meant that a fairly slow 1/30-second exposure was needed. At 60 miles an hour, the trees in the background became blurred, since 1/30-second was entirely too slow to “freeze” them. But since we were roughly matching the speed of the car, it remained in place on the frame, causing the car to “jump out” as the only object that’s not blurred. Besides looking cool, it gives a sense of motion. The sun was setting, and a little Velvia Vision magic helped bolster the already-nice light. It might not win any awards, but it’s still a shot I’m happy with.

Code for Users

One thing that I always thought was neat, in a really strange way, is how users and coders see things totally differently.

At work, we have some admin tools to manage users, but periodically, we’ll come across a spammer who’s just signed up. They have tools to stop them and delete their posts, but I’ll often go the extra mile and log into a MySQL replicant and do a “SELECT * FROM users WHERE ip LIKE ‘$spammers_ip’G”, and see if it turns up any other users. Sometimes it’ll unearth a bunch.

The other thing I’ll do is something like, “SELECT username, signup_time, email, ip FROM users ORDER BY signup_time DESC LIMIT 20;” to view the most recent users, and re-run it every 30 seconds or so to keep an eye on who’s signing up. I have much better things to do than sit around watching this all day, but it’s useful when spammers do their periodic, “Register thousands of accounts at once” thing.

So today I was doing this for one of the customer service people, and they asked, “Where is that tool? I can’t find it.”

“Oh, I’m logged into the database… There’s no way for–actually, give me a few minutes.”

I threw together a couple PHP scripts that basically do the above, and display it in a table. It’s the type of thing that might bore a Programming 101 student, and the only thought involved, really, was in trying to figure out why it was aborting with an error. (Hint: searching for “” doesn’t do what you expect it will. I must have looked at the bit of code 30 times trying to figure out what could possibly be wrong with the line, and then it suddenly dawned on me. I’m a giant idiot. The is an escape character, effectively telling PHP to treat the next quote as a literal quote, not a closing quote on the string. This is something I know well: I’ll often do something like echo "<a href="">link</a>", using the exact functionality that tripped me up today. And yet I kept missing the error.)

Anyway, that’s not my point. My point is that I’m consistently amazed at how the user’s view is so radically different than the programmers. From my perspective, I just wrapped a little PHP around one of the simplest SQL queries imaginable. Heck, much of the logic was copied-and-pasted from another script. But from the perspective of the people who will use this script, it’s an immensely helpful tool that fills a void that’s existed for quite some time.

Of course, sometimes it’s the opposite way. Sometimes all the user wants is a report on newly-created groups, the username of the person that created them, and the number of members. That’s just a simple SQL query! Actually, I suppose it’ll take a join. No, wait, two joins… But do we actually store the number of members in a group? I wonder if I can do that with a subquery… Maybe this needs to be a script. You know what? This is way too complicated.


I tend to use secure passwords most places. Like 0mG%R3LLy!53kUr3!!1 secure.

But several things drive me crazy:

  • Maximum length restrictions. American Express—probably the place I need the most security at—limited my password to either 6 or 8 characters.
  • Ludicrous minimum lengths. Eight is common, but I’ve seen even higher. “password” is eight characters and is secure, but when I’m trying to sign up for your silly forum to post one thing, and it’s telling me that IH8URS1t3 is too short, I want to scream.
  • Character restrictions on password. This is what drives me crazies. What do you mean “*” isn’t a valid character? One place wouldn’t allow a period. (!) This annoys me partially because, unless you’re storing passwords in a plain text file and using a “*” as a field deliminator, there’s no technical reason I can’t use an asterisk in my password. Someone, somewhere, thought that passwords shouldn’t have asterisks and made it so on their site. This is absurd. But even more absurd is that it shouldn’t matter what you enter, because even if your database did treat any non-alphanumeric character as a field deliminator (which no database ever made does), you shouldn’t be putting my password in like that. You should be taking my password, containing anything if I want, and running it through a one-way encryption algorithm. Heck, even something insecure like MD5 would allow you to submit 32KB of Unicode as your “password,” and it would be normalized into a short hash that gets stuck in the database.

If you leave a comment, it must be no longer than seven words, and cannot contain commas, periods, uppercase T’s, or any even numbers. Otherwise my database might explode.


Even though I’m not in the market for a new car right now, I’ve come across two recently that have made me wish I was.

Uncrate has a recent post about the Volkswagen CC, which looks amazing and packs a bunch of features I always wanted, like a (panoramic) sunroof and headlights that turn with the car. It starts at $27,000, though I suspect it’d be closer to $35,000 with those options.

Probably about a decade ago, two of my uncles each bought a Lexus. At the time, I thought they were the most amazing cars ever made, if only because my point of comparison was to a Mercury Sable station wagon. The Lexus sedans were essentially just Camry sedans with much nicer fittings, which means that they inherited the incredible reliability you’d expect: one of the two was just recently traded in with well over 200,000 miles on it.

Of course, I drive an SUV, and have a 100-mile-a-day commute, so gas mileage is important to me. A few American hyribds have been made, though every single one has been an SUV. The new Escalade hybrid gets worse gas mileage than my non-hybrid gas-guzzling SUV.

It’s apparently only a concept car at this point, but Lexus has begun talking about the Lexus HS 250h, a car the LA Times says will be “between the IS and ES,” the two cheapest models the company makes. It’s expected to get something like 35/40+ MPG, and yet remain unmistakably a Lexus. LA Times says it well: “The luxury features are impressive. Ten-way power seats, moonroof, premium audio, lane departure alert, multifunctional navigation (you can send mapping information to the car from your computer) and Safety Connect (which is Toyota’s version of OnStar).”

Actually, another source suggests that the car will likely be based on the Camry Hybrid, while yet another suggests that it will just sample some elements of the Camry Hybrid, but put them into a smaller, lighter car. Popular Mechanics has perhaps the best article. The car won’t be out until 2010. Hopefully they can make it look a little better before then.


I keep noticing that there’s a big disconnect between how I treat things at work and how I treat things on my own server. I suppose part of it’s that I spend 8 hours a day working on the site at work, whereas I only have spare time here and there on the weekends to work on my own site’s infrastructure. As a more concrete example, we have lots and lots of monitoring of all our servers at work. (We’d be crazy not to?)

I haven’t done so much here, because everything works fine, and I’ve put my time into other things. But I just decided to work on getting some better graphs going with Cacti. And I noticed something quite telling when I started graphing Memcache usage.

I’m currently using 35kB of storage in Memcache. I use it quite lightly, just caching a few page elements. I’d be better off using APC to store these, I think, but built it to use Memcache a long time ago. So, with 35 kB of data being stored in Memcache, how much memory have I allocated to Memcache?


I think I’m going to adjust things a little bit now that I’ve noticed this…


I haven’t fiddled much with anti-spam stuff on my mailserver lately. In a way, it’s a good thing: the few messages I receive get through, and the myriad inbound spam doesn’t. I just checked the statistics, though, and noticed that the number of blacklisted hosts has been on the rise. It used to sit between 600 and 800, and eventually dwindled to about 300-400. (Hosts are added to a blacklist if they send spam to a spamtrap address, or if they try to identify themselves with a HELO of my own IP or hostname. They’re unlisted after 7 days.) Now I have 922 hosts. (This list is available if anyone wants it…? It’s just a database call. Though you’d probably do much better with Spamcop or something.)

Blog spam is also a problem, though. Things settled down a while ago, and I got complacent just relying on Akismet and manual blacklisting when someone got through. But I can see that spam is still coming through every now and then.

The problem is that WPMU gives each blog its own comments table, so I’ve previously had to do massive UNION queries, to the point that I have a script just to generate the query. Now that I do this professionally, I decided to do it right. I now have an all_comments view in the database, that refers to all the tables as though they were one, letting me do stuff like “SELECT DISTINCT comment_author_IP FROM all_comments.” The next phase is going to be a little script called from cron that gets all the recent spammers and bans them.

Daily Server Deals Roundup

I doubt I’ll end up following through, but I’ve been kicking around the idea of getting a cheap used server and shipping it off for colo. eBay has some pretty good deals, below. Pay attention to shipping, though, as servers can be extremely heavy.

  • A mere $299 buys this one, a 1U Proliant with dual 3.2 GHz Xeons, 4GB RAM, and dual 73 GB SCSI disks at 15K RPM. For my purposes I want something with gobs of disk space, but if you’re looking for something fast, this might be a good pick.
  • A lot of 10 Dual Opteron Rackable 1Us, $1300. The Rackables are 1U boxes that are half-depth, so that you can load 42 in the front and 42 in the back of a standard 42U cabinet. (Might want to think about where all the heat goes before you do that…) Each of these has dual Opteron 246 processors (2 GHz), 4 GB RAM, and a 120 GB hard drive. Opterons don’t seem to be the most popular chips, but at $130 each (if you buy 10…), these are pretty affordable. And from my unusual perspective, it’s a bonus that it’s got a standard ATA disk: it’s easy to plop a 500GB one in. Not sure if there’s a lot of room for many drives, though.
  • $375 with shipping buys this Proliant, which is 2U with dual 3 GHz Xeons, 6 GB RAM, and 6x 73 GB disks. Plus dual power supplies and onboard RAID. (Though the latter is almost standard on servers like this.)

If I knew people who wanted to take about eight servers off my hands (at cost, plus shipping), I’d be tempted to pick up the Rackables. The thing would be more than capable for a decent colo (unless you need RAID or a chip that supports hardware virtualization…), and would make an insanely awesome home server, whether it’s a network fileserver (again, unless you count on RAID, which you should for a home fileserver), or a ridiculously-overpowered firewall. (Maybe throw pfSense on it, in which case you can do fancy stuff and even allow VPN access to your home network?)

Big Antennas

I’m on a local ham radio mailing list. (Though I’m actually not sure how this came to be.)

So a few neat links. The first is a yagi for 160 meters. Antenna size is inversely proportional to frequency, and 160 meters is the lowest ham radio frequency out there. The notion of a 160 meter yagi is almost obscene. You can just barely make out that there are two people working in the antenna.

There are also photos as a neat site called Artificial Owl of the former Russian Woodpecker, a Cold War-era “over-the-horizon radar” meant at detecting incoming missiles. It’s rumored to have transmitted as much as 10 million Watts (ERP), spewing interference all over the HF/shortwave bands the world over.