Serious birthday dining

Today is Diane’s birthday, and so, as usual, we’ve invited some friends over for dinner and New Year’s Eve TV-watching.

Diane does most of the cooking (somehow, this seems unfair, but no one ever said life was fair); she made “Michelle’s Chicken” (from the IBM Research cookbook), Butternut Squash with Ginger, and Amaretto Carrots, all of which were delicious.

I made dessert; at Alwin’s recommendation, I made the “Simple Chocolate Sheet Cake” from America’s Test Kitchen. But, rather than make the Creamy Milk Chocolate Frosting that went with it, I chose Hershey’s “Especially Dark” frosting on the theory that a dark chocolate cake deserves dark chocolate frosting (that, and the fact that I’d’ve had to buy a whole bottle of Karo Syrup for two spoonfuls if I wanted to do the milk chocolate frosting). The consensus at the table was that this was a good decision — even Sam, who’s not a chocolate person, had a slice (though he didn’t have seconds, so I failed to convert him). I inadvertently modified the frosting recipe by omitting the vanilla (the phone was ringing a lot as I was making the frosting), but no one seemed to mind.

The diet starts tomorrow.

Happy New Year!

Game On!

The Tech Museum usually has a special exhibit; currently, it’s Game On, which was actually mounted by the Barbican Museum in London. But it’s very appropriate for Silicon Valley, since it’s an interactive history of the video game, both arcade and home versions. I knew I wanted to see it, but hadn’t gotten around to suggesting it until today (partially motivated by realizing that the exhibit closes Monday). So we spent the afternoon at the Tech.

Well, Jeff and I did. Diane got tired of the exhibit pretty quickly and went across the street to the San Jose Museum of Art, while Jeff and I enjoyed the exhibit. Especially playing the old games, like Pong and Spacewar and Space Invaders. I remember losing many quarters to those during college, but here, they were free. And I was able to compete with him moderately well, unlike the case with newer games (they had plenty of those, too, but they all blur together in my mind).

After an hour or so, we’d played all of the interesting games, so we joined Diane at the art museum. We took a quick look at the downstairs exhibition, Visual Politics, and then caught up with her on a small docent-led tour, just as they were starting on the Selections from the Permanent Collection. Touring with a docent was a definite improvement over wandering around independently — she asked us questions and forced us to interact with the works on display, instead of just looking at them (or, worse, reading the descriptions adjacent to the works and not really looking at the art itself, which I’ve been known to do). After the tour, Diane went to the museum shop and Jeff and I visited Sandow Birk’s Divine Comedy, which is a retelling of The Divine Comedy in images set in Los Angeles, San Francisco, and New York. Well worth viewing.

From there, it was a quick walk to Ben and Jerry’s, and then home. Not a bad way to spend what was, effectively, the last day of vacation (we have Monday off, but Jeff doesn’t, so we’ll be getting up at a ridiculous hour to get him to school on time. *sigh*).

Shabbat Shalom!

The movies are too popular for me

I had hoped to see several movies during this break. So far, the grand total is zero. We actually tried to go see either King Kong or Harry Potter 4 yesterday, but by the time we got to the theater, the first available showing was a couple of hours away. And, while we did need to be out of the house for a few hours, we didn’t need to be gone quite that long. So we went to Barnes and Noble instead, where I did some research for an upcoming trip to Finland (brrr!) and read a book which I’d seen while we were in England this summer: A Year in the Merde. Time magazine’s review sums it up well. I enjoyed reading it, but I’m glad I didn’t actually buy it.

Today, after working out at the JCC, I’ve spent far too much of the day dealing with financial records and catching up on my Quicken duty.

What I haven’t done today is write a single line of code. I’m waiting for Userland to set up the CNAME so that gets you to this blog. Then I’ll look at the 404 log and see if there’s any traffic worth redirecting programatically; I also plan to create a custom 404 page as suggested by the Sacramento Web Developers SIG, which will point people to the popular places on the site.

But that’s all for tomorrow; for tonight, it’s time to write those last minute tax-deductible checks….

Migrated, with minimal breakage

I’ve just finally transferred most of the content of my old blog, Defenestration Corner, to this blog. I wound up writing a bunch of bad Python code to do much of the work, but still had to do quite a bit of manual cleanup (and someday, I may yet get around to categorizing the posts I transferred). I lost all the comments to the blog in the process; there are few enough (and many of them were spam, anyway) that I’ll look at them by hand rather than bother to try to write yet more single-purpose code.

One of the areas which caused me the most trouble was my use, in the early days, of a non-empty posting to hold a picture. I finally decided that those few comments were not worth the effort and tossed them, changing the link to the picture itself instead of the posting.

I also learned, yet again, to Keep It Simple, Stupid. My original plans, months ago, involved writing wonderfully clever code to go through the old site, grabbing each posting, examining it to see if it had any references which needed changing, and, if so, finding the target posting and updating it. This would have involved a stack, worrying about circular references, and many other perils. I eventually (months later) took a simpler path; I made a first pass over all of the articles, capturing essential information about them, such as the date as rendered by Manila (rather than trying to figure it out from the UTC date, sometimes badly-formed, passed back through the Manila SOAP interface into Python) and the title of the article. I used the date and title to create a slug for WordPress; I probably didn’t use the same algorithm WordPress would have used, but it didn’t matter.

After that, it was fairly easy to go through the rendered, content-only version of each article (thereby letting Manila resolve its internal “shortcuts”), find all the internal references, convert them to the new version (or, for images, just go to the underlying image), and use the MySQLdb Python module to directly insert the articles into the database on

I ran into a few problems where Manila did, ummm, odd things; rather than program around them, I just manually fixed up the results. And I’ll probably be doing more manual fixups later.

I still have to arrange for a redirect from to this site, and I still will have to convert from the Manila forms (like /discuss/msgReader$nn) to the renamed postings here, but that’s fairly simple. I hope.

GTD and GMail

Tessa Lau wrote a comment to my posting on the joys of an empty inbox, asking whether Gmail and Getting Things Done might not be incompatible, since Gmail discourages filing, while GTD discourages leaving things in one’s inbox (physical, computer, or metaphorical).

I don’t think they’re incompatible. I archive things in GMail to get them out of my inbox (and therefore, out of my face) unless I expect to deal with them almost immediately. The only filing I do in GMail is to automatically move some mailing lists into their own folders, never letting them into the inbox at all — and to be honest, I’m not sure that’s really a good idea for most of them, because then I’m tempted to let them sit. For everything else, I rely on search.

That’s actually fairly similar to the way I work in Lotus Notes, too; I have a few folders I use for active projects or obviously-related things (all of my electronic paystubs get filed in their own folder, for example), but most of my stuff gets “filed” in “Miscellaneous” (which could just as well be named “not the inbox”) and I rely on search to find anything I need. Keeping my Notes inbox empty is a harder task than my GMail inbox; I haven’t looked at it since I left for vacation nearly two weeks ago, and I dread what I’ll find when I do look.

Thank you, Fry’s ad!

Fry’s had a couple of DVDs that we wanted in their “one day sale” ad in today’s Murky Nooz: Serenity and Battlestar Galactica Season 2.0. (“We” is defined as “at least Jeff”, by the way.) But, after my recent experience, I didn’t want to go to Fry’s if I could possibly avoid it (by the way, I still haven’t gotten a response to the letter I sent Randy Fry).

Instead, I went to Circuit City to test their price matching policy.

The first cashier I dealt with was at a temporary register, and he said he couldn’t do a price match, but he sent me to one of his colleagues at a permanent register. He couldn’t help me either, and sent me to the returns/exchanges/customer service line. We were first in line. It still took several minutes for someone to help us, and I had to show him the price on both items in the Fry’s ad, but there was no problem in meeting it — in fact, he didn’t even bother to phone Fry’s to make sure they still had the DVDs in stock.

But then I threw a wrench into the proceedings; there was a coupon on the DVDs, good for $10 if you bought both Serenity and BSG 2.0 together. He wasn’t sure if he could honor the coupon and do a price match, so he vanished into the back room for a few minutes. Then he came out and rang up the lowered price (in fact, now that I think of it, he saved us an extra 8 cents by reducing the price of BSG by $10 instead of entering a $10 coupon).

I can’t call this a “no-hassle” experience, but it was enormously easier than getting a price match at Fry’s was. I intend to continue to avoid Fry’s whenever I expect to be able to pick up the same merchandise elsewhere.

Don’t omit the commit

I’m slowly making progress at converting my old blog from Manila to WordPress; it looks like the simplest approach is to write a bunch of Python scripts to read the “content-only” version of the blog, resolve intra-blog references, and then directly insert the result into the underlying MySQL database using MySQLdb.

In testing this approach, I was trying to create a posting from scratch in a copy of WordPress running on my machine; I based the program on the examples I found here and here. But, even though the program seemed to work, and I could read the changes while the program was executing, but after the program finished, the database never reflected the changes — except that the ID for new entries kept increasing every time I ran the program.

It took me a long time to figure out what was wrong, but I eventually guessed it: I had to do an explicit “COMMIT” to have the changes I made from Python stick. I don’t know why the examples don’t show this, but it sure makes a difference.

More to come, I hope.

Rather broad, but generally satisfactory

We just got home from San Jose Rep‘s production of Pride and Prejudice. I thought it could have been tightened up some (the play ran 2:40 with intermission, which is pretty long for an 8pm show), and they played it more for laughs than I thought the book called for, but in general, I enjoyed the show. I wouldn’t mind seeing the movie (either the current movie or the classic BBC production) to compare.

Pre-burning calories

We used to go to the movies on Christmas Day — we’d have the place nearly to ourselves, and it was wonderful. Maybe not for the theater owners, but we liked it. But over time, more and more people decided that Christmas was a good day for the movies, and the theaters became fairly crowded. And then Hollywood caught on and started releasing movies on Christmas, and we stopped going.

Today, we took advantage of the JCC being open on Christmas (at least in the morning). I think this was the most crowded I’d ever seen the exercise room. But we were able to get our workouts in, and now we’re ready to consume vast quantities of calories this evening.