April 2005 Archives

"You come by it naturally"

My family is visiting this week, and one of the things we like to do is play word games. Usually, this means Scrabble, but this time we’ve been having a whole lot more fun with Yahoo’s Text Twist game.

The idea with this game is that you get six letters, and you have two minutes to come up with all the words that can be made with those letters. If you get at least one word with six letters in it, you can keep playing.

Christine and I have played it together in the past, and can generally do pretty well. It’s a whole different game when you get everyone in my family playing, though!

For starters, we haven’t yet missed a six letter word. For seconds, we regularly get all the words with a minute and thirty seconds to spare. The times are more based on the speed of whoever’s typing than anything else.

Tuesday night, we stopped after 200,000 points in order to go to bed (at least, I did, since I had to go to work the next morning).

Last night, we played for a couple of hours and got up to 400,000 points. We’ve kept that game open, and are probably going to try to get up to a million before they leave on Sunday.

I think Christine was somewhat shocked to see all of us (Mark included) going at it, and declared that I come by that skill naturally. :-)

Resume Tips

If you’re writing a resume, here are some things to consider:

  • Don’t misspell the name of the company to which you’re sending your application. I know my company doesn’t make it easy, but nearly every misspelling has been in the third word, not the second one, which would be understandable, if not forgivable.

  • Grammar is not optional in cover letters.

  • Cover letters are not optional. They’re how I determine if your resume is worth reading, since you wrote it with half-inch margins and 10-point font and I’m trying to read it on a fuzzy Windows screen since your school’s career center bundled half a dozen of them all together in such a way that my Linux PDF viewer won’t open it.

  • If you’re applying for a position as a database administrator, don’t talk about how “very extremely excited” you are about our “engineering position.” If you do, be especially sure not to talk about your written skills thereafter.

  • Unless you’re writing in Ancient Greek, you should strongly consider (a) using periods at the end of sentences, and (b) putting at least one space after each of them.

  • If you are writing in Ancient Greek, you definitely get bonus points for that (you can even use domain language like “Oracle” without breaking a sweat), but you’re really taking a risk that not every database administrator who reviews your application will be able to read it.

  • Concerning major database vendors: if you’re applying for a database administrator position, you’re really hurting your case when you miscapitalize or misspell the name of a database system (e.g. the person with “experience in mySQL” and the one with “experience in Oracles”).

  • Proofread your letter. Have someone else do it as well. Find someone who is very adept in written English (or Ancient Greek, if you’re taking that risk) and have them edit it. Consider avoiding hard-core poets, who are less known for their standard use of punctuation. But really, if your cover letter is full of grammatical and spelling errors, you’re not establishing a good track record for written communication, and I can only assume that your verbal skills are equally poor (and since you’re never going to get a phone call, you won’t be able to prove me wrong).

  • Including “horoscope talk” is a good way to ensure that I will do everything I can to make sure you don’t get hired. Horoscope talk is when you use flattering comments about our company that don’t actually imply any knowledge whatsoever of what we do or whether or not we do it well. In a word, lying — if not about our company, then about your knowledge of it. I don’t care what your skills are in this situation — morality is more important.

I actually came across all of those in the past week, and all but one of those this morning. Except the Ancient Greek one.

Now, if you send me your resume in reasonable Ancient Greek (i.e. not a word-for-word translation), and you didn’t find out about the job by reading this post, I will hire you. Not because you know Ancient Greek (although I don’t think there are any laws saying that I can’t discriminate on the basis of knowing long-dead languages), but because you actually cared enough about the position to research it, learn that I’m the current DBA there, and learn more about me, and go through the trouble of getting your resume translated. If you’ve done that much, I don’t even care whether or not you know about databases — I’ll train you. As soon as you write that resume and figure out how to get it to me through the HR department. :-)

On Driving

Christine can get frustrated with my driving, generally because I’m unusual in my reading of speed limit signs. In my interpretation, “speed limit” does not mean “average cruising speed,” “minimum speed,” “speed suggestion,” or “5 miles-per-hour faster than you should be going if you see a cop ahead” (that one bugs me — if you insist on going 10 mph above the speed limit, at least have the decency not to slam on your brakes and almost cause an accident because you see a car in the median).

Anyway, last night we were driving through town and she commented on how much longer it was going to take since I was driving, because I insisted on going five mph below the speed limit.

I pointed out that it might have had something to do with the car directly in front of us which was also going five mph below the speed limit.

She didn’t think that was a particularly good excuse.

Let There Be Icing

I just added five icons to an administration page in Reflection. What a difference!

Graphics were an important part of the Reflection 1 code, and I knew I’d end up having them in Reflection 2 as well, but it seemed more important to get the page editor working than to have a pretty icon for it. I stand by that — you need to have a cake before you can put icing on it, but the transition from functional to enjoyable is notable.

The page editor also has a much nicer inline HTML WYSIWYG thingy now, which works more nicely with both Firefox and IE. It also has the advantage of not having a name that sounds like foul language.

Time for a massive check-in and test run, then I can make these changes live.

Repeat Afer Me

I will not rewrite my code from scratch.
I will not rewrite my code from scratch.
I will not rewrite my code from scratch.
I will not rewrite my code from scratch.
I will not rewrite my code from scratch.

To be fair, my programming has improved by leaps and bounds since I put Reflection in mothballs back in 2002, and I’ve changed architectures (CGI to mod_perl, and the old code would not make porting a trivial matter), but there’s still a lot of code there that I may be able to bring into the new framework.

In other news, Reflection 2 tests now cover 37.9% of the code, up from 22.2% on Monday.

I recently signed up for a service with a monthly subscription, and had a minor billing issue. The service came in two forms — price X/month with a setup fee, or price Y/month with no setup fee. Doing the math, it was clear that if I stayed with this service for at least five months, I’d be saving a considerable amount of money by going with the setup fee. So I did.

Unfortunately, they goofed, and put me in the higher monthly rate, so I called them to have it fixed. They were quite friendly, and corrected the problem right away. They also reset my billing date at the same time.

Now, this sounds pretty innocuous, and is a great example of customer service, which I don’t find very often these days.

Shortly thereafter, I got a statement saying that a payment had gone through for the service. Great. The statement had the wrong date, but I just noted it and moved on, thinking “buggy software, they must have a problem when they send out the first invoice, and have just never noticed.”

When the second one came, I figured I might have a problem. The reason was not so much that the date in the receipt was still wrong, but rather that the receipt came five minutes after the first one.

You see, when I said they “reset” my expiration date, it somehow got set to zero in unixtime. For the uninitiated, that’s January 1st, 1970.

On top of that, their billing software was set up to run automatically every five minutes, and just added a month to the expiration date each time they billed your credit card.

When the third one came, I logged in to my credit card statement, and sure enough, there were three authorizations there (and this was not a cheap subscription). Time to call customer service. :-)

Fortunately, this was not a company where you had to wait on hold for half an hour — a person picked up the phone right away, and I was able to explain my problem to him. Their first attempt to solve the problem didn’t work, but by the time eight authorizations had gone through, they got it fixed. They refunded all of the charges, extended my expiration, and waived the setup fee, so I’m pretty happy on the whole — especially since I got a glimpse of how an automated billing system works. You can bet I’ll be thinking of that when it comes time for me to write one!

Takeaway points:

  1. Don’t run your billing system on a five-minute loop when you only sell monthly and annual subscriptions. There’s no need, and it can get you into very embarrassing situations. Especially when you accept new customers over a long weekend.

  2. If the expiration date is 30+ years before your company started, that just might be an error condition. Any reasonable database will let you set constraints for things like that, and it’s easy to add a line of code to your program to do the same.

  3. If you’re setting an expiration date, make sure it’s in the future, especially if you’ve just processed a payment. Bill multiple months worth of activity at the same time, if need be. That way, at least the payment will be denied (or require confirmation) when you try to apply 400 of them all at once.

  4. If you don’t follow these points and have your billing system blindly running every five minutes, make sure someone can call you and get a real person immediately. If you have an automated telephone system, I suggest the following: “For service in English, press or say 1. Pour service en francais, appuyez ou dites 2. If our billing system is charging you every five minutes, please repeatedly and urgently shout and hit 0, and you’ll get moved to the front of the line.”

After all, you’re going to have to refund all that money, and I don’t know that you’ll get your merchant fees back.

Life is Less Nuts

For the first time in at least a week, I’m not feeling completely overwhelmed by work, more work, taxes, web development, database development, still more work, church, answering customer E-Mails, adding new features, and trying to make sure the various web apps actually work, and at reasonable speeds. I even played some piano today.

The taxes are essentially done. We have a rather large bill this year, so I’m not particularly inclined to send it in early. (Strange how the government can’t figure out exactly how much to deduct when you have a married couple where both hold regular jobs and have side-jobs, particularly when one of them went from full-time to 80% time half-way through the year, and picked up some church work in addition to that.)

I’ve switched to FIFO (first-in, first-out) mode at the office with a little reshuffling, since I have 92 hours left working there and about 600 hours of work assigned (and that’s just counting the critical, must-happen stuff). The only way I’m going to get anything done is by not multitasking, and so far it has been working fairly well, at least from my vantage point.

On the Technically Sound front, I have my development and production systems synchronized now, so I can make and test changes without risking downtime, which is a bigger issue now that I’m hosting some higher traffic sites. I also tracked down a horribly inefficient query that was taking 5.8 seconds per page load and dropped it down to about 40ms. That felt good. :-)

In the realm of mostly useless testing metrics, Devel::Cover tells me that I have 22.2% of my library code covered with tests, with a total of 131 tests. Most of these tests were in the past few days — previously, I was just testing using WWW::Mechanize, which didn’t cover any of the library code (largely because most of it wasn’t written until a week ago).

Oh, back to the corporate side: I got my first “that was helpful” reply to the tutorial E-Mails I’ve been sending out off and on for roughly a year now. Woo hoo! Before today, I figured I was just writing for people’s amusement and to cement my own learning. The topic? “Neat Perl trick to get a date” (which I admit wasn’t a particularly well-thought-out title, but only one person picked up on that, so I didn’t get a chance to send out the humorous reply I was planning).

Putting a journal online

I’ve been wanting to do this for a while now. Given that I was able to get an RSS reader going fairly quickly, I thought I’d go for a simple blogging interface as well.

Perl, Mason, Markdown, and 12 minutes, and I’ve got something that I’m not about to sell on the mass market, but it’s enough to get me going. :-)

Trying out some RSS

I’m starting to frequent an increasing number of sites looking for good articles to read, and most of them have RSS feeds. I haven’t been particularly happy with the RSS readers I’ve used to date, so I decided to write my own.

An hour and 70 lines of code later, my personal news page was online. I love Perl.

Recent Entries

Who's on first?
I’m going through the settings of a hard-core E-Mail program, and came across this lovely setting: Copy To Address to…
USPS Extreme Cost-Saving Measures
In the July 2010 edition of the PCC Insider (a USPS publication) is found the following statement: There are 26,000…
At 1:15am this morning
At a hotel, after a day of eventful travel and 3.5 hours of sleep the night before, it’s (almost) needless…
My Amazon.com Wish List