My first thought as you saddled up to the bar next us while we ate our dinner was, “Hmm odd couple”. A white woman with dark blond hair, relatively tall, in her mid to late 30s, and a short black man, in his mid to late 50s. The woman was wearing a black jacket, and the man was wearing what can only be described as an over-sized khaki “zoot suit”. But whatever, it’s San Francisco right?
What bothered me was that the woman refused to sit down. The whole time she continued standing at the bar, in front of the chair talking to the bartender about who knows what. This struck me as so out of the ordinary that I actually mentioned it to Stephanie. I don’t remember them leaving, but by the time we were waiting for dessert to arrive, Stephanie reached down to her black sling bag that she’d had on the side of the chair and noticed both zippers were open.
Well, guys, thank you for ruining our night. We hope you are enjoying the $500 worth of groceries you purchased at Safeway with her cards. We also hope you’re entertained by the $40 worth DVDs you “rented” from the kiosk in Safeway that I’m guessing you have no plan to return. And we both sincerely hope that the $700 worth of clothing you purchased at Old Navy is keeping you warm at night. Most of all we appreciate the hassle you put us through, having to cancel her cards, get a new drivers license, and spend $250-500 on a new iPhone. Thank you, really, you shouldn’t have.
If anyone stumbles upon this pair casing other restaurants around town, please call the San Francisco Police Department (553-1141) and leave a message for officer C. Leung #12281, with regard to case #091094361. Thanks.
A friend of mine was also ripped off by the couple you described in your blog. The male half of the duo (I’m about 90% positive) has been hanging out with the other crackheads for the last 24 hours in front of [Dalva on 16th street]. Little black dude sunken cheeks wearing a big yellowish zuit suitish outfit. He’s was wearing a gold 49ers jacket over it last I saw him.
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.
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).
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.*
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 exprIN(value_list), the result could be incorrect if BIGINT UNSIGNED values 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;
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…
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.