Bike to Work

The summer ritual officially began today: I rode my bike to work for the first time. I’m admittedly a fair-weather biker; I bike when it’s warm, sunny and light outside. So, today was my first time on the bike since, oh, last October or so. Combine that with two weeks or so of relative inactivity while I was home helping care for our newborn, and well, suffice it to say that I didn’t break any speed records getting here this morning. And then there’s the ride home looming, with its dreadded mile-long grind up Lawyers Hill Road. But I’ve got 8 hours or so before I have to worry about that.

With gas pushing $3 a gallon, the financial incentive to bike in (and avoid driving) is stronger than ever. The commute to work is about 15 miles round trip, and my car gets roughly 30 miles to the gallon (actually that’s being generous, it’s probably more like 25-28), so I save about 1/2 gallon of gas every time I commute by bike. At $3 per gallon, that’s around $1.50 extra in my pocket for each ride. And the more expensive gas gets, the bigger the payoff gets.

Last year, I biked to work 22 times, but I didn’t start doing it until early August. So hopefully this year I can do it a lot more. This year I plan on keeping a log so I can track my times, average speed etc. At the end of the season we’ll see how I did.

Blosxom Import Complete

I just finished importing all my Blosxom entries into b2evolution. The process was more or less painless; I just pulled down all the Blosxom entries in Movable Type format using the flavor I mentioned earlier, then processed the result with a Perl script, then ran b2evolution’s Movable Type import utility to bring the entries in. The Perl script basically catenates lines together in the body area of each entry, which makes the result look more attractive in b2evolution. Once the entries were in, I went through and made minor edits to make things look better.

The only thing I don’t care for about b2evolution is its insistence on sticking <br> tags at the end of every line, even within blocks of markup. This makes it really hard to include code snippets, because I can’t use <pre> blocks; I have to explicitly format everything and use &nbsp; entities to do spacing. There must be a way to make this work right, but I haven’t found it yet.

That aside, it’s nice to have a “real” blogging engine with all the associated bells and whistles. I’m sure I’ll figure out all of b2evolution’s various quirks over time.

Followup — Looks like the <br> tag thing is controlled by the Auto-BR option at the bottom of the page where you edit posts. It seems to be turned on for all the imported entries, and off for the native entries. When Auto-BR is off, it seems to be much better behaved with embedded HTML in entries.

Time to fix the garage door opener

As I noted earlier, our garage door opener receiver died a few weeks back. Rather than get a new, cheap, made-in-China receiver to replace it, I’ve decided to get a couple wireless remotes for our security system and program them to operate the garage door. Now, the original plan was to buy two bidirectional remotes (they can receive and display system status as well as arm/disarm the system, hence the term “bidirectional”), and a special keypad which includes an RF receiver/transmitter module to support the remotes. But, our system already has an RF receiver, and I recently learned that my particular alarm panel does not support more than one receiver.

Now, why am I interested in a second receiver if I already have one installed? It’s basically because of the oddball layout of our house. Our house is very long and narrow, and the center is narrower than the rest of the house. There’s no real practical spot to mount a receiver in the dead center of the house. It either needs to go closer to the west side of the house, or the east. It so happens that most of my wireless zones are on the west side of the house, so that’s where I mounted the current receiver. Unfortunately, the garage and entrances are all on the east side, so the receiver isn’t in the optimal spot for remote keys.

Plan A for dealing with this was to get the keypad with the RF receiver, and mount it closer to where we’d be using the remotes. But, I can’t do that because my panel doesn’t support multiple receivers. That brings me to Plan B, which is to buy the remotes and the required transmitter module, and just try them out with my existing receiver in its current location. These things supposedly have a 200 foot range, and I’m still well within that, so it can’t hurt to try it out.

While researching this today, I learned that there’s now a wireless repeater module I can buy, which effectively extends the range of the existing receiver. So if I go with my Plan B and the performance isn’t up to snuff, I can add a repeater closer to the garage, and that should hopefully do the trick. So that’s the current plan. We’ll see how it goes!

Importing Blosxom data into b2evolution

Made my first attempt at importing my Blosxom data into b2evolution this morning. Looks like it will be doable with just a bit of fussing. The basic strategy is to use this handy Blosxom flavor to convert the Blosxom data to Movable Type export format, then use b2evolution’s MT import utility to bring the data in. I tried this on a couple of entries, and it works, but I’ll need to do a bit of data munging. First off, the Blosxom flavor leaves an <h3> markup tag at the beginning of each post, which the importer doesn’t like. And, the importer seems to insist on sticking <br> tags at the end of every line, which makes for some ugly line breaks in the final product. There may be a way to control this behavior from the importer, but I think it’ll be just as easy to massage the import file with a Perl script. Next step is to do that, and try a few more test imports, before bringing in the whole enchilada.

Started the Pool Pump

After a winter of freedom from the big money-sucking hole in the back yard, I bit the bullet and fired up the pool pump today. Now, in the Mid-Atlantic, swimming season runs from roughly the beginning of June through Labor Day. If you’re lucky, you’ll get a couple extra weeks on either end, but for the most part, that’s what you get. For the past few years, my routine has been to start the equipment up around now, and uncover the pool around Memorial Day. I’ve found that starting the equipment early saves work, because it allows me to chlorinate the water before it gets too warm and algae starts taking hold. And with pools, anything that saves work is a bonus.

Anyways, the pump primed right up using the main drain for suction. The water level is still too low to use the skimmers. And the water temperature is (drumroll please) a balmy 56°F. Another 25 degrees and we’ll be swimming.

Now I need to start thinking about my spring pool project, repairing some loose coping and recaulking the expansion joint between the pool and the deck.

Amended returns..

I filled out amended 2005 tax returns yesterday, to report income from my wife’s investment club. I’m not terribly impressed with how TaxCut handles amended returns.. For federal, you basically save your existing return under a new filename, then update the return to include the changes, and then tell it you want to fill out form 1040X. But then after you fill out the 1040X, you’re kind of on your own as far as figuring out what you need to print, where to mail it etc. The program’s filing logic isn’t smart enough to know you’re doing an amended return, and it just keeps telling you that the return has already been successfully filed (assuming the return was previously filed electronically). As far as state goes, I couldn’t find anything at all for doing an amended state return. It turns out that for Maryland, it’s all done via the online iFile system (assuming that’s how the original return was filed). Doing it this way was a snap, and I continue to be impressed with the iFile setup. As far as TaxCut goes, I guess you get what you pay for… it was considerably less expensive that Intuit’s TurboTax, and I’m curious if TurboTax has better support for doing amended returns. Hopefully I won’t have to do this terribly often (my wife’s defunct-but-not-disbanded investment club is a topic for another rant)…

Totally different topic — I’m going to try out another blogging engine. I’ve been really happy with Blosxom, but it’s very bare-bones and I’d like to try out something a little more full-featured. My goal was to find something that’ll run on my server which is equipped with php4, mysql and apache. I’d also like something with a relatively small footprint (Movable Type is kinda overkill for my purposes). I found b2evolution which looks promising and is available as a Debian package. Just working on an issue with the database config, and I’ll be able to give it a try.

What a week

Timeline for last week:

Monday, April 3: Our second child, Andrew Charles, is born via c-section. Birth weight is 8 lbs, 4 ounces. Length 21″.

Tuesday, April 4, really early A.M.: Our older boy, Michael, comes down with the “Stomach Bug Of Death” (hereafter referred to as “SBOD”). Frequent projectile vomiting, diarrhea, malaise, and general unhappiness ensue.

Tuesday, April 4, late A.M.: our newborn has successful surgery to repair a minor abdominal wall defect. Much relief ensues.

Wednesday, April 5, A.M.: I take our still-ailing 3 year old to the doctor. SBOD diagnosis is confirmed. Treatment plan: Just give him fluids and wait it out. Fun fun.

Wednesday, April 5, Evening: Yours truly catches the SBOD.

Thursday, April 6, Morning: Grandma picks up Michael (who is slightly improved, as in, no longer puking his guts out) for the day, so that I can lie around all day groaning and hurling.

Thursday, April 6, Evening: I finally stop throwing up. Hurray. Michael spends the night at Grandma’s.

Friday, April 7, Morning: Feeling a bit better, finally up and about. Still not much appetite. I work a bit on getting the place ready for Mom and Baby, who are coming home the next day.

Saturday, April 8, Morning: Mom and Baby come home.

Saturday, April 8, Evening: Grandma’s turn to get the SBOD.

Sunday, April 9: I’m finally back to a normal diet and off the Immodium. Michael still has the runs. Mom and Baby doing great.

The fun never ends…

Mower blade

I took a first look at my push lawnmower today while my 3 year old rode his tricycle around outside. I reinstalled the blade (which I sharpened over the winter) and looked into a problem I had been having with the deck. Last summer I hit a big chunk of wood (or something similar) and ever since that, when I make certain maneuvers, the blade will graze the deck and make a loud, unhappy clattering noise. At first I thought the deck was dented, and banged on it a few times with my ball-peen hammer to try to get it back in shape. But, it looks like the real problem is that a weld has partially broken loose, causing part of the deck to stick out too close to the blade. If my peening attempts didn’t do the trick, it looks like I might be able to reattach the loose piece with a sheet metal screw.

Based on the engine date code, this mower is 16 years old this year (I bought it used in 1996). The engine is still good, and I’ve been nursing it along for a while now and it keeps on going. Hopefully it’ll last me another 16…

Followup 4/15.. I fired the mower up today. After about 5 minutes of mowing, the blade started scraping the deck again. Shut it off, drilled hole, inserted screw to hold deck together, problem solved (for now at least). Looks like the mower will live to see another season..

First Mow of the Season

Today was the big day — the beginning of the annual mowing routine. Of course, if it stays this dry, I’m not sure how much mowing I’m going to need to do this year. Today was fairly typical as far as the first mow of the season goes — serving mainly to whack down the onion grass and make sure the tractor is running OK. In that regard, it was a resounding success. As usual, the very front of the lawn didn’t need mowing yet. This year, as parched as it looks, I’m wondering if it ever will. The moles have been hard at work too, which wouldn’t really bother me, but they are making it bumpier and bumpier, which makes it a major pain to mow. This season, I may pick up a lawn roller and try to flatten it down a bit. Of course, that means we’ll need some rain at some point to soften up the ground…

Tomorrow, I’ll see about getting the trimmer going and whacking down some weeds.

XML myUMBC

The new era has begun…

Today I hacked our legacy myUMBC portal code to generate XML output
for the registration eligibility function. The goal is to eventually
get away from the big, monolithic app and separate the business logic
from the presentation. Registration eligibility was a good place to
start, because (1) it’s a simple function with simple output; (2)
we’ve gotten a request to display registration eligibility within MAP,
so we needed to figure out a way to share the code; and (3)
registration eligibility still talks directly to the HP3000 mainframe,
which makes it impractical to do code sharing via Perl modules,
libraries, etc. So, this is what we came up with. It’s the first
step in coming up with a web-services type API for our back-end SIS
business logic.

The first thing I needed to deal with was the Perl code itself. The
legacy myUMBC code, while nice and modular, is very HTML-centric.
The business logic stuff is all mixed up with the code for HTML
generation. The code works by building data structures to represent
HTML objects, and the business logic bits are all built into those
data structures. Separating this stuff out is not really major
surgery, but it does require some work. I’ve managed to do this for
the registration eligibility code, but I still need to put a run-time
flag into the code to toggle XML vs. HTML output. Also, there will be
the ongoing challenge of dealing with error conditions and generating
valid XML in these cases, but we’re getting there.

On the actual XML front, the main challenge is defining what exactly
you want to output, coming up with a spec (DTD), and sticking to it.
This can require quite a bit of thought, and needs to be done before
any actual code is written. For registration eligibility, the DTD I
came up with is pretty simple:


<?xml version="1.0"?>
<!ELEMENT registration (eligibility)>
<!ELEMENT eligibility (status*)>
<!ATTLIST eligibility status (eligible|ineligible|registered|error) #REQUIRED>
<!ELEMENT status (description,extra?>
<!ELEMENT description (#CDATA)>
<!ELEMENT extra (#CDATA)>

And some sample XML…

<registration>
 <eligibility status="ineligible">
  <status type="academic">
   You are academically ineligible to register.
  </status>
  <extra>
   Your GPA is too sucky for you to continue
   attending the university.
   Please go away.
  </extra>
  <status type="financial">
   You are financially ineligibile to register.
  </status>
  <extra>
   Your parents didn't send us any money this
   semester. Please go away.
  </extra>
 </eligibility>
</registration>

Coupla notes here.. I used the generic tag name “registration” with
the idea that down the road, the object will contain other
registration related stuff besides eligibility. We’ll see if that
actually happens. And, although I do include text-based descriptions
of eligibility status, these are only intended to be guidelines.
Applications can use the descriptions as-is, or key off the “type”
attribute in the “status” tag, and display their own messages.

The code generates this XML using the same Perl objects I wrote to
construct HTML. It seems to work OK for generalized markup, and
guarantees that the output will be “clean”.

Next up is to see how this works when we pull it in as a uPortal
channel. To do this, we’ll need an XSLT stylesheet and we’ll need to
set up a “Generic XML/XSLT Transformation” type channel (rather than a
web proxy). We’ll need to use our custom local connection context
code to connect, and it remains to see how that will work with a
non-web proxy channel. Should be fun..