Draft Schedule of Classes

Just a quick note on the UMBC web schedule of classes thing…

There’s a “draft” version of the schedule of classes, that the registrar occasionally likes to populate. The URL of this version is http://www.umbc.edu/aboutumbc/newschedule. Access to this page is controlled by a simple .htaccess file. There’s a single username and password that the registrar disseminates to all interested parties.

All of the updates to this schedule happen behind the scenes. There’s a parallel job on the HP3000 that handles this version of the schedule. The web version is built from the same verter.pl script that handles the regular version. The only real maintenance involved with this is occasionally changing the password at the request of the registrar. The password file is located at

/afs/umbc.edu/admin/www/umbc/htdocs/aboutumbc/newschedule/.htaccess

The registrar will typically request that the password be changed right before they start mucking with the draft schedule. They asked me to do it today for the fall 2006 schedule.

Once they’re done with the draft schedule, they may request that access to it be disabled. I do this (again) by changing the password.

You may ask, why not use a webauth-enabled .htaccess file? Well, that would be more maintenance, because then we’d have to maintain a list of users who have access to the page. They way it is now, all I ever have to do with the thing is change one password. It works.

Plumbing!

Friday’s the big day.

Friday is the day I’ve set aside to finish the never-ending basement plumbing project(tm). My goal is to finish this before the baby comes, and before the yard/pool work starts. The trick is picking the day to do it. Ideally I need a day when I can have the house to myself for several hours starting at around 8-8:30am. The job really shouldn’t take too long, but with plumbing projects, you always have to allow for unexpected complications. Anyhow, most Fridays fit the bill, so I just had to pick a Friday, take off work, and go for it.

With these types of projects, it’s always good to have a plan, so here’s the plan.

Before Friday:

  1. Order and receive remaining supplies necessary to complete project (expecting these today).
  2. Clear space in boiler room for access to pipes.
  3. Make sure we’ve got some bread on hand that I can use when sweating pipes.
  4. Disassemble a 3/4″ stop & waste valve for sweating.
  5. Check side-by-side play in branches to make sure I won’t have any problems getting couplings on them.

On Friday: For phase 1, disassemble the old pipes and sweat a new stop & waste valve onto the 3/4″ supply line. This will give me a positive shutoff for the branch (the main shutoff is a gate valve which doesn’t seem to shut the water off 100%)

  1. Take shower and fill up drinking water pitcher, water bottles etc.
  2. Shut water off. Open faucets (including outside sillcock) to drain plumbing.
  3. Disassemble the old branch starting with the compression fittings and working back to the 3/4″ supply in the boiler room. Have buckets and rags handy to catch drips and plug pipes.
  4. Put new 3/4″ supply line in place. Clean and flux new supply line and disassembled valve.
  5. Stuff bread in existing supply line. Clean and flux. Put joint together and sweat.
  6. Reassemble stop & waste valve. Make sure valve is shut OFF. Turn water on at main. Check for leaks.
  7. Turn valve on to eject bread (can I do this without a helper? Not sure..)

For phase 2… hook up the rest of the branch, with the main turned on and the branch shut off via the new valve.

  1. Trim, deburr and dry-fit the new branch together.
  2. Open all faucets on the branch to allow steam to escape.
  3. Clean, flux and fit the “tee” fitting, and two of the three branches. Wrap wet rags around existing soldered joints. Sweat together and allow to cool.
  4. Clean, flux and sweat the remaining branch. Allow to cool.
  5. Remove aerators from all fixtures on branch. Shut all faucets off.
  6. Turn branch on and check for leaks.
  7. Turn each faucet on in succession and run till water comes out clean.

That’s about it. Wish me luck!

Onion Grass: The Harbinger of Mowing Season

Welp, the onion grass has started coming up in my front yard. That means that it won’t be too long before I have to mow.

I’ve learned after a few years on my property that onion grass pops up in late winter/early spring, mostly goes away during prime growing season, then pops up again in the fall just before everything goes dormant. So it serves as sort of a bookend for the growing season. This year it seems a little early, I guess because the winter has been mild. We’ll see if the lawn follows suit.

Every year I tell myself I’m going to remember the first (and last) day I mow the lawn. And of course, I never write it down, so I never remember. I do know it’s always after my annual March Madness trip (which for me, is kind of an “enjoy the last week of winter and its associated lack of yard work” trip). This year, I’ll record the dates here for posterity.

I guess this means I’ve only got a month or so to put the deck back on the tractor. I’ve put that thankless chore on the list for this weekend.

Speaking of the March Madness trip, ESPN Bracketology has us seeing two #1 seeds again, for the second year in a row. This really sucks… (Why does it suck? Because we like to see competitive games, not #1s blowing out #16s.)

$#%!!? FAR

It’s Faculty Annual Report (FAR) season again.

Last year, FAR season was not fun. The FAR mysteriously “lost” a bunch of faculty reports (my theory was that it never saved them in the first place, but I digress), and many unfun hijinks ensued.

The author of FAR still works here, but he’s been sucked into the Peoplesoft black hole (don’t get me started), so yours truly ended up with the bulk of the FAR hassle last year. This year, yours truly is going to be out for most of FAR season with a newborn, and to put it mildly, that doesn’t break my heart. But that’s not the real point of this entry… Really, I just wanted to document a coupla things for future reference.

The FAR app displays 3 different due dates to users, and these dates change every year. The past 2 years, I’ve had the fun of updating the due dates, and each time it’s taken a bit of searching around to figure out where the dates are stored. Long story short:

The due dates live at [server-root]/etc/far/due_date.txt. This file can be human-edited, but there’s also a module within FAR that allows certain users to edit these dates via the web. To get this ability, your username has to be present in the table FAR.FAR_AUTH. Then, in the FAR app under the “Report Options” dropdown, you will see an option titled “FAR Due Dates”. Select this, and you can edit the due dates from there.

Also, it seems like every year, UMBC adds more academic departments, so it’s fairly common to get requests to add these departments to FAR. FAR maintains its own lists of departments (should it really do this? Probably not. Will it ever get fixed? Probably not). To add one, just add it to the table FAR.FAR_DEPARTMENTS.

That’s all for now.

Gripe du Jour: Palm eReader

I think I’ve figured out why eBooks are not more popular.

I’ve recently warmed up to the concept of reading books on my PDA. It’s actually a much more pleasant experience than I expected. The PDA came with a free eBook reader, and the books I’m reading are in the public domain, so my total outlay on this new hobby so far has been zilch. So, why am I complaining? Well, I refer to a dictionary fairly frequently when reading books. Currently, I use a printed dictionary even with my eBooks. It would be really cool, though, if I could just tap on a word, and see the definition. To do this I’d need an electronic dictionary on the PDA, and support for it in the software. Well, I can get this, but it’s not free. For $9.95, I can get the “full” version of the eBook reader, which includes a dictionary with software support. That’s a fair enough price for the dictionary and the functionality. I have no problem paying that. So, again, why am I complaining? The dictionary bundled with the $9.95 package is Merriam-Webster’s “Pocket” Dictionary, which has only 40,000 words. That means that most of the obscure words which I want to look up, probably aren’t going to be there. If I want a “real” dictionary comparable to my dead-tree version, I need to get the Merriam-Webster “Collegiate” Dictionary, which eReader.com is selling for $23. Now, what’s the problem here? Amazon.com sells the dead-tree version (Hardcover, no less) of this exact same dictionary for only $15!!!

So, let’s get this straight… The electronic version of this dictionary costs essentially nothing to reproduce and distribute, yet eReader.com is charging 50% more for it than the dead-tree, hardcover, much-more-expensive-to-produce version of the exact same dictionary. If I want the electronic lookup, I have to shell out $9.95 for the “full” eReader software, plus $23 more for the wildly-overpriced electronic dictionary, for a total of $32.95. For that price, I’ll stick with the dictionary I already have, thanks.

eReader.com isn’t the only bad guy here — I checked several other online sources for eBook-friendly dictionaries, and the prices were all similarly inflated.

There’s a lesson for the eBook vendors here — you need to price your products competitively (read “cheaper than the equivalent dead-tree copy of the book”), or people aren’t going to buy them. Let’s hope they figure this out soon, because it truly is a great format with lots of potential.

Demystifying your U of M Paycheck

Until recently, there’s been something I’ve always wondered about the paycheck I get from UMBC. We’re paid biweekly, which translates to 26 paychecks per year. Now, the University gives me a certain dollar amount as my annual salary. But if I add up the gross pay from each of those 26 paychecks, it always comes out to slightly less than what the University claims is my annual salary. Being the paranoid type, I always assumed the University was short-changing me. Happily, I was wrong. The figure the University gives me is for 365 days (or 366 days in a leap year). My paychecks cover 26 14-day pay periods, or 364 days. So, in most years, I’m receiving paychecks that cover only 364 days. To get my actual annual salary, I need to take the sum total of all my paychecks, divide by 364 to get the per-day pay rate, and multiply the result by 365 (or 366 in a leap year) to get my salary for a full 365 (or 366) day year. When I do this, the result always matches the annual salary reported by the University.

So what happens to the remaining 1 or 2 days worth of pay? It gets rolled into the following year’s pay, and every so often, we end up with a year where we get an extra paycheck (for a total of 27 paychecks). To an unwashed employee like me, this seems like a confusing way to do accounting, but it does all add up in the end.

While I’m on the topic, I should plug what is probably the most useful site on the State of Maryland’s website (at least for state employees): The Central Payroll Buerau Net Pay Calculator. You basically enter your gross biweekly pay, all pre-tax deductions, and number of exemptions from your W-4, and it tells you what your net pay will be. Very, very handy when you get a raise, or your pre-tax deductions are changing, and you want to see what effect it will have on your net pay.

Student IDs, and making the portal work for users who don’t have them

First: The facts of life.

  1. UMBC has the concept of a “student ID number.” This number is used in SIS as the primary key for almost every table. All students have these IDs, as do faculty members who teach courses, etc.
  2. uPortal itself does not use or require this number to do its work.
  3. The legacy myUMBC portal uses this number to do its internal session management. Also, we need to know this number to look up any SIS data on behalf of the user.
  4. uPortal proxies to the legacy portal to do most of its “real work” involving SIS functionality.
  5. When a user logs into either portal, they provide only a username and password. We need to be able to take that username and map it to a student ID. To do this, we query our campus LDAP directory.
  6. Not all users have student ID attributes in LDAP, for various reasons. In particular, if the help desk manually enters someone into the directory, they sometimes leave out the ID.
  7. These users have problems accessing the portal.

Now, in the old portal, we handled these cases by prompting the user to manually enter the student ID and a 4-digit PIN (don’t go there). In uPortal, we don’t have this logic. So, it just breaks. In fact, it breaks in such a way that “bad” HTML is generated, so the channels in question don’t render at all.

Well, the rendering issue is fixed now, but it was tricker than I thought it would be. It wasn’t just a matter of tidying the HTML in the legacy Perl code. The problem was actually happening in my local connection context code. Basically in these cases, the connection context can’t generate a valid legacy portal session at all. And when that happened, it was crapping out before it added a couple of necessary URI parameters to the web proxy URL. Long story short, it was trying to bring up a legacy portal login screen, complete with navigation, decoration, and lotsa sloppy HTML to boot, and uPortal of course was refusing to render it.

Fortunately it appears that the solution to this is going to be human-engineered, meaning I will just display some appropriate wording that tells the user how to remedy the problem. So, I shouldn’t need to do anything fancier than what I’ve already done.

As an aside, I’m still working on the best way to fix these HTML-tidy issues with the web proxy channels. First trick I try, is masquerading as the user with the problem, finding the bad channel, and examining it outside the portal by passing the same arguments to the legacy myUMBC web app. Then I can view the document source, paste it into emacs, and look for problems. Once I think I have it fixed, I save it as static HTML and point another web proxy channel at it, to see if it’ll render. That usually works. Sometimes I need a Java stack trace, which can be problematic because “ordinary” users don’t have the ability to display stack traces within channels (there might be something in portal.log, but it’s often hard to sift through this and correlate log entries with individual problems). In these cases, I hack the code to force the error condition to occur with my own account. Then I can see the stack trace, find out the nature of the evil, and fix it. Yeah, it’s klunky, but it gets the job done.

Digitizing our music library

Over the past year or so I’ve been slowly converting all of our CDs to MP3 format and putting them on the computer. Various things are motivating this project:

  • Convenient access to music at work, where I listen to the most music, and on my Palm, which I take to the gym and use as a poor man’s iPod.
  • Organizing our music collection and freeing up space. Our CDs are currently strewn all over the house, some of them sorted in racks, some of them unsorted in racks, others just lying around loose, etc. With the music all on the computer, the CDs could be boxed up and put away, where they’d take up less room and wouldn’t get lost.
  • Giving new life to our old shelf stereo system, where the 5-disc CD changer is slowly dying. It has an aux input where we could plug in a digital music source.

There are a few challenges with setting up a digital music library. The first is disk space. I’ll be addressing that by buying a 250 or 300 gig hard drive, which should easily hold everything. Then the digital music must be organized, made available, and distributed to the various places where we will listen to it. Currently, I organize my MP3s loosely by category (classical, pop/rock/jazz, childrens, soundtracks, etc) and then alphabetically by album or song title within those categories. Distributing the music is the biggest challenge. With the music on a Linux server, there are a lot of ways I can make it available: SMB, NFS, HTTP, you name it. Apparently I can even set up an iTunes compatible server, which could be very useful. Of course, the music can also be played directly through the computer’s sound card, or burned onto ISO9660 CDROMs. But the real question is, how do we get this music from the server, to the living room stereo, the kids’ rooms, the kitchen, etc., in a way that is user-friendly and doesn’t cost megabucks? That is a great question, one that I’ve been pondering off-and-on, and is sure to be the subject of a future entry..

Life with a tempermental snowblower

Well, we finally got some real snow here on the east coast, so that meant some rare action for the snowblower. This is our fourth winter with the snowblower, and it’s getting more and more tempermental with each passing year. It’s getting harder and harder to start, and it’s developed this habit of quitting on me before I finish clearing the whole driveway. It will always start back up, but then I have to kind of nurse it along the rest of the way. Now, this is one of those problems that tends to get forgotten, because I eventually do get the driveway cleared with it, and then it gets put away, then spring comes, and it sits all summer, and then it has the same problem the next winter. It’s just the way things go with equipment that doesn’t get used much.

Anyhow, I decided things would be different this winter, and I would make at least a halfhearted attempt to identify and fix the problem. So, after the usual routine of: Clear 90% of the driveway, restart snowblower after it quits, nurse snowblower through remaining 10% of driveway, I set to work. The best thing to do with engine problems is to apply the scientific method, ruling out as many things as possible, until you find the problem. So here goes:

Fuel cap venting issue: This was the first thing I suspected. Sometimes I can get it to start, or keep it from stalling, by loosening the fuel cap. If the fuel cap doesn’t vent properly, it can cause a vacuum that prevents fuel from getting to the carburetor. I haven’t totally ruled this out yet, but there doesn’t appear to be anything wrong with the fuel cap. I’ve read that they vent through the threads, and there’s a plastic standoff in the cap that keeps it from sealing tightly against the lip. This all appears to be intact and functioning properly.
Carb out of adjustment: The engine has always run a little lean, requiring me to partially choke it sometimes to keep it from missing. So I figured, maybe I need to tweak the fuel mixture. Well, it turns out I have a bogus low-emissions carb, with non-adjustable jets. So much for that idea.
Main jet gummed up: I drained the float bowl, unscrewed the main jet/emulsion tube, and blasted it with carb cleaner. It did look like there was a little bit of gunk in there. I should probably do this every spring. But unfortunately, this didn’t solve the problem.
Out of gas: Seems obvious, but there appeared to be plenty of gas still in the tank. However, I topped the tank back up, and it seemed to run OK again (well, “OK” with this engine is a very relative term). Apparently the fuel pickup tube (or whatever mechanism it uses) doesn’t go all the way to the bottom of the tank.

I think the next step is to examine the fuel tank, fuel line etc. to see if there is anything that could keep fuel from reaching the carb properly. I’ll do that at the end of this season. Once I’ve ruled that out, if I still have problems next season, I’ll break down and overhaul the carb. Eventually, I’ll get to the bottom of this.

VNC over ssh

Just for laughs today, I decided to try setting up an SSH tunnel to connect to my home VNC desktop from work. To my surprise, it was as simple as:

ssh homedsl -L 5901:localhost:5901
vncviewer localhost:5901

To my even bigger surprise, it works pretty well. The performance is good enough that I can do “real work” on the remote desktop. I even started up a MAME game, and it was playable. Much better than I expected, given that my connection at home is a DSL line with a slow uplink.

Looks like another useful tool..