City entropy
To the asshole who smokes Pall Malls outside 1220 Pine St and then puts them out on our scooter seats so that the ember burns clear through the once-waterproof vinyl seat material, thus creating a hole for moisture to seep into the foam padding below:
I hope you die a slow, painful death due to lung cancer. Fuck You.
Total cost of living in the city today = $374.25
Or a cascading series of errors
Last night I had a platform release to help with, which begins at 7pm and takes about an hour. I don’t have much to do, but it helps for me to be on hand to deal with any problems that might crop up. It takes me about half an hour to walk home, and I got delayed leaving the office, so I wasn’t out the door until 6:20, which is cutting it pretty close. I figured I’d catch a cab (would be the 2nd time this week!) but every one was dark. Eventually I reached that point of no return (where taking a cab would just be silly), so I just hoofed it the whole way.
The side of the street where I usually park my scooter gets “street-cleaned” on Friday morning between 6 and 8, which means I have to remember to move the scooter to the other side when I get home from work on Thursday night. Then on Friday morning before I walk to work I have to move it back because our side of the street is a commute lane between 3 and 6 every weekday afternoon. This is a well-choreographed urban reparking ballet that I do EVERY WEEK.
Since I was racing home for the release, I didn’t have time to move my scooter across the street, so I made a mental note to ask my dear Stephanie to move it for me (or to do it myself later). Of course I promptly forgot all that after getting into things. Somehow I beat Stephanie home (she had an errand to run)—and even she noticed my scooter on the wrong side of the street, but by the time she made it in the apartment building and up the stairs, she completely forgot to mention it to me.
The release went well, but then we discovered an error in a config file that got pushed out to umpteen servers, so I was chasing down some lingering issues until after 10. Release nights don’t really feel like work, it’s mostly just hanging out online and watching the last 3 weeks of work go live. But it’s still work, so I stayed up a little bit later to compensate, to have some “me” time—which included listening to the Fresh Air program on Shepard Fairey and Mannie Garcia.
So this morning, I was in the shower, and my brain was totally chewing on something that annoyed me about what I’d heard on that program, and I was worried that if I didn’t write it down, I’d forget it all, so I started telling Stephanie the story to aid my own memory. Except this only got me more worked up. She left for work while I was still getting ready, and I figured I had a whole blog post worth of stuff to write. So I decided to take a little bit of time to get it out (I was up late working after all—I can show up a little later).
I pounded out this blog post on fair use, left a comment on another blog, and saw that it was around 10:15. As it takes me half an hour to walk in, 10:45 felt a little too late to show up, so I decided to scoot. Whereupon I discovered my first ticket of the day: $50 for parking in a street cleaning zone. Grrr.
I got down to Folsom where I usually park, and everything had changed. There was a new block of motorcycle parking without meters that was completely full. The several blocks of motorcycle parking along Main were totally gone (while they build the new Temporary Transbay Terminal). And even the little secret free spot where I sometimes park was now painted red. There was no place to park, partly because I was showing up late, so I circled once or twice, and eventually found a promising free spot at the end of some parking meters where another motorcycle was parked. Safety in numbers, right?
Fast forward to tonight, I walked out to my scooter, at the corner of Harrison and Embarcadero, and IT WAS NOT THERE!!! FUCK. I parked in the least obvious commute lane there ever was. Oh, except for that sign right above my head that said no parking from 4-7pm ANY DAY! I walked 3 blocks to where Stephanie was waiting for me on her scooter and told her that my scooter had been towed. How could this happen on the same day I got a street cleaning ticket?! My helmet was in my scooter, so she couldn’t take me anywhere. Eventually I caught a cab ($10) to the impound lot on 7th and Harrison, while she went home to dig up my license plate number.
Cost to free my scooter: $244.25
Ticket for parking in commute lane: $70
Total scooter-related fines: $374.25
Living in San Francisco: Pricey
Taxpayer grievances
Even though I could certainly afford to have someone help me do my taxes, I feel very strongly that I should not be forced by the government to pay someone to help me figure out how much I owe government. That and I consider myself a pretty sharp guy. This year though…I’m getting close.
What I really dislike about taxes is how they treat people like Turing machines. Add lines 1 through 3. Subtract line 5 from line 4. Multiply line 10 by 25% (.25) and enter the smaller of the result or line 7 above. Or my personal favorite thus far:
Are you filing Schedule A? If No: Skip lines 1 through 3; enter on line 4 the amount from Form 1040, line 38, minus the total of (a) any amount from Form 8914, line 2, and (b) if you are claiming the standard deduction, any amount from line 6 of the Standard Deduction Worksheet on page 35. Then go to line 5.
A sphincter says what? I literally had to go fill out another worksheet just to level up.
It’s worse than watching TV. I can feel myself getting dumber by the minute, obediently entering numbers I don’t understand, for reasons they don’t explain, trying to remember which line on which form the number I’m calculating refers back to. All the while I’m thinking to myself, why doesn’t a computer just do this for me!
Anyway, here are some examples of the tax fun I’m looking forward to this week:
- Due to an unexpected bonus I received in 2008, I over-contributed to my Roth IRA, which means I need to finish my taxes in order to figure out how much I should have contributed, so I can withdraw the excess (all at a loss, considering the market conditions) in order to submit yet another form along with my taxes.
- Like the previous 2 years, I get to fill out 2 extra forms (Schedule C-EZ and Schedule SE) just for the fun of having Google AdSense on my blog—which added ~$1700 to my gross income this year.
- I exercised some vested incentive stock options (ISOs) in 2008, which may or may not have any effect on my taxes or whether I might owe the dreaded alternative minimum tax (AMT).
Yes I know my blog is busted
For anyone who’s left their feedreader and visited my homepage in the last few days, you may have been surprised to see that the most recent post in the leftmost column is 15 seconds of fame from Tuesday, February 13, 2007 11:01am. Yes, 2007.

Of course that’s not actually the most recent post—it should be showing Caught between PulseAudio and a quiet place from Wednesday, May 21, 2008 4:39pm, (and now this). But what’s altogether weirder is that the neatlinks column is completely up to date.
In my index.php template file, I actually have two loops, the main one which shows all posts without neatlinks, and the neatlinks loop which only shows posts from the neatlinks category. To exclude neatlinks from the main column, I just add query_posts('cat=-23'); above the loop.
After a little digging into the PHP code behind WordPress, I had it spit out the query it sends to the database to pull out the data for the posts in the “The Loop”. What’s crazy (at first) is that rather than generating one big query joining every possible table to wp_posts, WordPress runs preliminary queries based on the query_posts attributes, to return a list of eligible or ineligible post IDs. Then it does the final posts select using giant IN() or NOT IN() lists in the where clause. The main reason it structures it this way is so that it can use the LIMIT clause for paging.
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
FROM wp_posts
WHERE 1=1
AND wp_posts.ID NOT IN ('876', '877', '878', '879', '880'...'5456', '5458', '5460', '5461', '5462', '5463')
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish')
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 8
When I ran this giant query directly on the database, I got back the old blog posts visible on my homepage. But when I ran it on my laptop with a copy of my WordPress data, I got back the correct list of recent posts. When I deleted a few IDs from the thousands in the NOT IN() part of the query, and ran that on the database, I got the correct posts back.
So it appears there’s a devastating bug in MySQL’s handling of long IN() lists that’s since been fixed. Unfortunately Dreamhost is running MySQL v5.0.24a, which was released in August 2006, almost two years ago! Locally I’m running 5.0.51a from January 2008.
The MySQL docs say that the IN() list is limited only by the max_allowed_packet size, which is 16 megabytes by default, and which this query, as giant as it is, is nowhere near reaching. I skimmed through the release notes between those two versions of MySQL, and the closest thing I could find to a related bug was in the 5.0.41 release notes from May 2007:
For expr
IN(value_list), the result could be incorrect ifBIGINT UNSIGNEDvalues were used for expr or in the value list. (Bug#19342)
So what did I immediately go do?
alter table wp_posts modify ID int unsigned not null auto_increment;
No difference.
Once again I’m caught between a rock and a hard place. On one hand, I have no idea what’s the likelihood of Dreamhost upgrading MySQL on their database servers (though I sent them a very detailed support request), and on the other hand, my blog is broken, and that makes me very grumpy. I generally like the laid-back Dreamhost culture, but it might be time to pay for something a little more dedicated…
Update: Broken blog = man obsessed
Things I didn’t like about No Country for Old Men

I remember thinking the the trailer was ok—but that this wasn’t the type of movie I’d be able to watch with Stephanie. And then the reviews started pouring in, and then the Oscar nominations. I think it was this sentence that finally caught my attention:
Over the long weekend Stephanie wanted to do some shopping, so I took the opportunity to take myself out to a movie. I’ve been really curious about There Will Be Blood (a movie I might could get Stephanie to come along for), but the timing wasn’t right, so I decided on No Country.
I have to say, it’s not a bad movie. It’s crazy well-made. If you haven’t seen it and want to, you definitely should. I just didn’t like it. And I want to tell you why. This may well be the only negative review of “No Country for Old Men” that exists. Anywhere.
This is the point where you should stop reading if you want to see the movie.
Why I buy online
I want to buy a laptop hard drive for a project. I could easily order the one I want from Newegg for about $75, but I thought it’d be nice to get one sooner, so I called around to see what was available in the area.
First I called CompUSA (which admittedly is going out of business) hoping I could score a good deal, but I never got through to anyone. The phone just rang and rang and rang. I tried twice.
Then I called Circuit City (which is only a few blocks away) and waded through their phone menu system, eventually narrowing down to the fact that I wanted “product availability and pricing” for “computer” “hardware”. I somehow ended up being redirected to a general customer service person with apparently no knowledge of whether they carried internal laptop hard drives or not.
So he attempted to transfer me to their computer department 3 times, and by the third time finally said, “Hold on, let me just walk over and ask someone.” Yeah, why don’t you, I thought.
Then he came back on the line and asked, “Do you mean, memory?”
“No, I mean an internal laptop hard drive.” At this point I didn’t dare specify that I wanted a 7200RPM IDE drive. I heard muffled talking in the background.
“Umm, yeah, he said we do.”
“Well can I get any information about what types—”
“He said they start at $100 and go up depending on the quality [sic] of the drive—”
“Ok, thanks.”
Finally I called Best Buy, and surprisingly the phone just rang and rang and rang. For over 4 minutes. No one answered.
Why oh why isn’t there a Fry’s in San Francisco? They’d make a KILLING.
I might just scoot down to CompUSA and pick through whatever’s left on racks. Verdict: no luck. Only SATA laptop drives. :(
PG&E Online: what a gas!
I’m in the process of switching checking accounts, which means I needed to move any service that was directly debiting my old account to the new one. For the most part I prefer to have automatic monthly payments hit my credit card, but at the time I signed up, PG&E only accepted checking accounts.
It’s been at least a year since I needed to log on to PG&E online. As long as I’ve got power and gas, there’s really no need. My username conveniently turns out to be the username I use most frequently these days, but I couldn’t quite remember the password. So I had a new password emailed to me, but when I tried to log in, I got this fun message:

I roll my eyes, slap my head, realize this is probably not going to be as painless as I’d hoped. So I call their customer service number, get transfered to their online service department, and ask if they could re-activate my account. Of course if that was possible, you know I wouldn’t bother blogging about this. Apparently they can’t. Even though my existing username is connected to my email address, and I was able to reset my password, I can no longer use that account to update my billing settings. Her advice: just create a new account.
Yes, PG&E, creating a new account is easy—but remembering all these accounts we create all over the place is not. I politely and humorously suggest that she please inform someone with the power to make change in her organization that expiring active customer accounts is bone-headed and backwards.
So I create a new online account, link it to my account number (this requires another phone call, because I don’t receive paper bills, I have no record of my account number), and when I attempt to update my billing information I get this fun message:

Argh!
Now I spend my days in front of a computer building web-based systems just like this one (albeit with fewer users), and I make my share of mistakes and poor design decisions, but moments like this make want to slap some programmers around. FIX THAT!
So I call back for like the 4th time, describe my story to yet another customer service rep, who transfers me to yet another online service rep who informs me that the first online service rep should have cleared my online account (or something) before I created a new account. So she presses her magic button, I create a third PG&E username—which chances are I won’t need to use again for at least a year, so it too will expire—and I am finally able to update my billing info.
I cannot, however, get that hour of my life back.
Update: I sent a follow up note to PG&E with a link to this post, and this was their completely ineffectual response:
Dear Justin,
Thank you for contacting us via our website.
Letting us know about your concerns and providing us with your comments helps to provide safe, reliable, and responsive services to all our customers.
We appreciate your time and are happy to be at your service.
Thank you for using our online services.
Customer Service
Pacific Gas and Electric Company
Antisocial Networking
Update: New developments below.
I just got the strangest email. I think I’m going to reproduce it here in full.
Date: Thu, 30 Aug 2007 16:32:05 -0700 (PDT)
From: Julie Winfield <beverlybimbo at yahoo dot com>
Subject: Hi JustinYou don’t know me, but I live by you and I would like to warn you that I am adding you to this site as a bad neighbor. I am tired of putting up with your crap.
http://www.rottenneighbor.com
Are you ok with that? No? Well then too bad!!
-Julie
Wow. I. Have. No. Words.
Here’s the funny part: it doesn’t appear that “Rotten Neighbor” currently even covers San Francisco. I entered my zip code and there were 3 listings, none me. A quick Google search for Julie Winfield returns a dermatologist in Mill Valley.
On the other hand, a quick Google search for the first part of her email address, beverlybimbo, confirms that she lives in Los Angeles (based on a Craigslist posting “Looking for a Google Maps API expert”).
Looking for a Google Maps API expert
Reply to: beverlybimbo at yahoo dot com
Date: 2007-08-09, 10:55AM PDTLooking for a Google Maps API expert to design a functioning map that allows users to contribute markers to the map by searching address, city, state, zip code etc… It needs to be completely automated. The markers/popups will include title, description, and name. I also need the ability to serve the user ads that will most likely be geographically targeted. PHP, MySQL and Javascript will also be required so you need to be skilled in these languages as well.
* Location: Los Angeles
That’s a curious coincidence, considering Rotten Neighbor is essentially a Google Maps app.
Based on the time I got the email (4:32pm) I wonder if the LA listing created at 4:28 is the one intended for my doppelganger:
Vanowen St. between Mason and Desoto. What a horrible place. Many gang members or wannabees The north side of Vanowen is lined with apartment buildings. There is absolutely no parking. Somebody was shot and killed on Kelvin Ave. Cars are stolen. Car windows are broken just for the fun of it. Helicopters hover around at least once a week. It’s filled with people who don’t care about the cleanlines of their surroundings. People walk their dogs and don’t pick after them. Horrible place.
Looking over my referrer log from 4pm today (or for hits to my about page—the most obvious place someone would get my email address) didn’t turn up any smoking guns. I’ll be curious to see how/if she responds to my reply.
Update: This afternoon, I got a snarky reply from “Julie”:
Don’t worry Justin. Soon everybody will know what kind of neighbor you actually are!
What? The? Fuck?
So at this point I started think that she’s working for Rotten Neighbor, in an attempt to bait bloggers into linking to their site (as terrie mentions in the comments). Great it worked. So I’ve removed the hyperlink to Rotten Neighbor above (which I’d already relnofollowed), and I’ve removed any attempt to obfuscate Julie Winfield’s email address. But wait, it gets better…
Brant Walker brantw2 at cox dot net [Email address not functional]
San Diego, California 92101
United States
And who is this Brant Walker? Apparently a recent graduate of Platt College in San Diego. A quick scan of his web portfolio turns up a parody site called Nicotine Island. Hmm, where have I seen Nicotine Island before? Oh yeah, a post by one beverlybimbo in a Yahoo Groups for Smoking and Tobacco Hobbies.
I think I can reconstruct what happened here. Brant Walker, using the fake identity Julie Winfield, is trying to drive traffic to his Rotten Neighbors site. He checks out the Alexa Movers & Shakers list and discovers my site listed number 4 because I got dugg last week.
He follows Alexa’s link to my homepage and clicks to my about page, grabs my email address, and sends me the email at the top. How am I doing so far? Let’s take a look back at my referrer log entries from just before 4:30pm yesterday (when I got the email), the ones that I previously thought held no clues.
*************************** 1. row ***************************
request_id: 2051980
request_url: http://justinsomnia.org/
request_referrer: http://www.alexa.com/site/ds/movers_shakers?lang=en
request_date: 2007-08-30 16:24:52
request_user_agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
request_ip: 209.68.243.61
request_hostname: 209.68.243.61.ptr.us.xo.net
*************************** 2. row ***************************
request_id: 2051989
request_url: http://justinsomnia.org/about/
request_referrer: http://justinsomnia.org/
request_date: 2007-08-30 16:27:54
request_user_agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
request_ip: 209.68.243.61
request_hostname: 209.68.243.61.ptr.us.xo.net
Of course that could just be anybody who happened upon the Alexa list and clicked over to my site, right? Well Brant, meet my smoking gun. In the headers of the email you sent me, pretending to be Julie, it listed your IP address:
Received: from [209.68.243.61] by web38510.mail.mud.yahoo.com via HTTP; Thu, 30 Aug 2007 16:32:05 PDT
How’d I do? Didn’t you even bother to skim Search Engine Marketeers are the new script kiddies? Because I know you visited the page last Friday, August 24th at 8pm. Perhaps I should retitle this post Search Engine Marketeers are the new social engineers.
Update: Brant apologies in the comments.


