George Carlin once said something to the effect of: "On the highway, anyone who drives slower than you is an asshole, and anyone who drives faster than you is a maniac."
Over the Thanksgiving holiday last week, we put in a lot of highway time as we travelled around, and I think I'd like to expand that list a little bit. Here's my list of annoying types of drivers.
- Fast-Lane Fanatics -- These are people who pull into the fast lane as quickly as possible as soon as they get on the highway, and stay there until it's time to exit. They refuse to get out of the fast lane, even if they're being passed by most or all of the traffic in the other lanes. Frequently, these drivers will have a long line of cars piled up behind them because they're driving at or near the speed limit, blocking the way of people who want to go much, much faster.
- Fast-Lane Phobics -- The opposite of a Fast-Lane Fanatic, these people will avoid the fast lane by any means possible. Even if the fast lane is wide open, they will go to extreme measures to weave in and out of traffic in the middle and rightmost lanes on the highway in order to pass other cars.
- Grand Prix Racers -- This type of driver views the other cars on the road in much the same way as a downhill skier views the flagpoles on a ski slope. They dodge through traffic at a speedy pace, as though they were playing a video game and the other cars were simply obstacles to be avoided, or other slower cars in a Grand Prix race.
- Doppelgangers -- A Doppelganger is unable to choose either a contant speed or a lane to drive in without following another car. Frequently, this sort of person will choose the fastest car on the highway and mirror their every move. If the car that they're following exits off the highway or somehow shakes them loose, the Doppelganger will become confused and will slow down until another car passes them that they can latch on to. In no case will a Doppelganger ever be at the front of a pack of cars.
- Leeches -- These drivers will always follow extremely close to the cars in front of them. While they sometimes exhibit Doppelganger-like qualities, Leeches aren't particular about following a specific car so much as they want to stay close to any car that happens to be in front of them. If a Leech is behind you, you will often think that they want you to drive faster or get out of the way; however, if you change lanes to try to allow a Leech to pass you, they will sometimes just switch lanes too so they can stay on your bumper.
- Spacers -- Unlike a Leech, a Spacer will always keep at least 2 car lengths between their car and the car in front of them. At higher speeds this can be a safe way to drive, but in slow-moving traffic it becomes infuriating to anyone behind them, because other cars will pull in front of a Spacer at an almost continual rate, and they will come to a complete stop long before they approach the rear of the vehicle in front of them.
- Blockers -- Blockers seem to enjoy simply keeping other cars from being able to pass them (or anyone), not by driving aggressively, but rather by clogging up entire lanes of traffic. They act as rolling roadblocks, creeping up in the lane next to other cars and then going exactly the same speed so that anyone behind them becomes trapped. In extreme situations, they will box one or more cars in, rendering them unable to move.
- Random Accelerators -- These people drive very close to the speed limit about 80% of the time, but occasionally they will floor the accelerator for no apparent reason and pass 5 or 6 cars, only to gradually slow down to their natural speed limit pace and allow all of those people to get back in front of them. If a Random Accelerator is also a Blocker, they can wreak havoc on the traffic patterns for miles and miles.
- Distracted Drivers -- Distracted Drivers are always performing at least two of the following actions as they are rambling down the road: talking on a cell phone, changing the radio station, trying to find a CD, applying makeup, unfolding a map, eating a hamburger, or grabbing something in the back seat. Their speed varies greatly, and they can occupy up to three lanes of traffic at any given time due to the fact that they drift all over the road.
- Casual Observers -- Some people don't seem to be driving to a particular destination so much as they are just cruising around looking at things like billboards, exit signs, and colorful trees. They are generally characterized as Casual Observers. They tend to drive slowly and with unpredictable acceleration patterns, and they may eventually exit the highway or get out of the way... or maybe not.
- Cutters -- A person who tries to slide in front of another car with as little space as possible between their rear bumper and the other car's front bumper is referred to as a Cutter. These drivers take great amusement in passing and then cutting quickly in front of unsuspecting vehicles, especially if the other drivers then have to slam on their brakes in order to avoid a bumpercar collision. True Cutters aren't trying to get anywhere quickly; they just like the thrill of the cut.
- Hard Brakers -- A Hard Braker will hit their brakes suddenly at random intervals, and then keep going as though nothing happened. It is often unclear whether these people are seeing things, or they are falling asleep at the wheel, or if they are simply lunatics.
- Lane Shifters -- This type of driver can never be in the same lane for more than about 100 yards. While this is also a characteristic of a Grand Prix Racer, the Lane Shifter isn't necessarily trying to drive quickly and pass people, they simply get bored or frustrated with any lane that they end up in. If a Lane Shifter also happens to be a Cutter or a Hard Braker, they can be quite difficult to drive next to.
- Competitive Jerks -- The Competitive Jerk drives normally until they suspect that someone is trying to pass and merge in front of them, at which time they hit the gas and speed alongside the offending passer/merger and do everything in their power to keep the other person from getting in their lane and "invading" their territory. This caveman-like behavior will continue until the other car is either forced off the road (success!), behind them (acceptable), or is somehow able to maneuver ahead in traffic (failure). Normal driving patterns will then resume until another poor sap attempts to pass and merge, at which time the cycle will begin again.
- Angry SOBs -- The most dangerous and unpredictable type of driver, an Angry SOB will assume the driving pattern of some or all of the styles listed above, but in threatening and homicidal ways. The problem is, they're not driving that way because that's how they happen to drive, they do it because they have singled out one or more other cars to terrorize, and their end game is to cause damage or pain to the other drivers -- in short, they are violent sociopaths. While this type of driver will make you quite angry, you should avoid them at all costs because they frequently carry weapons that they are anxious to use.
For those of you who will be celebrating Thanksgiving on Thursday, here are some recipes you might enjoy (if you're looking for just one or two more side dishes to squeeze on the table):
Regarding the sausage stuffing, that's one of those really love-it-or-hate-it kind of dishes. Yes, it's unbelievably fattening, but the way I look at it I'm already eating about 5 pounds of food, so what's another 1,000 or so calories? Don't look at me like that. You know you want some too. And it tastes sooo good...
Now, I understand how you might not trust my Thanksgiving recipes if you saw my turkey pictures last year, but let me assure you that the charred bird was a cooking error, not the result of a bad recipe. And besides, that particular turkey ended up tasting pretty good after we scraped the skin away, thank you.
Really. It did. Trust me.
A couple of days ago, I was in the mall and I noticed that the haircut shop there was pretty empty. I figured that people just didn't tend to go to the mall to get haircuts, so that would be a good place to try. No lines, get in and out quickly, and maybe do some shopping.
So yesterday I went to said haircut place in the mall, and sure enough there were no lines and I got seated right away. Sadly, I realized a few minutes later that I was getting a Bad Haircut, and that was probably the reason for the lack of patronage. Here were my Bad Haircut clues:
- During the haircut, I was afraid to engage in any small talk, for fear that the barber would forget what she was trying to do.
- The clippers never actually touched my scalp, making the shaved portions of my head quite uneven and bumpy.
- At one point the lady asked if I wanted "a little more" off a certain section. I said "yes", and she lopped off at least an inch of hair. So much for "a little"...
- As she was trimming around my ears with the scissors, she had a lot of trouble figuring out how to "approach" the side of my head. She kept leaning in different directions, trying different angles, and turning the scissors in unusual and dangerous ways.
- When she was done, she couldn't find a good way to style my hair. She finally handed me the comb and said, "Why don't you try?"
- When I got out of the chair, my fingers were sore because I had been unconsciously clenching my hands together as hard as I could for the past 20 minutes.
- The entire time I was getting my hair cut, I was writing this blog entry in my mind.
- As I left the barber shop, I walked as quickly as I could and avoided eye contact with everyone around me, for fear of public humiliation. This was made a bit more challenging by the fact that the shop was in a large mall, on the weekend before Thanksgiving, right next to where the kids were getting their pictures taken with Santa.
In the end, I guess it doesn't look as bad as I thought it would. It's kind of choppy, and the cowlick on the back of my head is sticking up like a rooster, but no permanent damage. I'll probably need another "touch up" cut pretty soon, but my Mom always told me that the difference between a good haircut and a bad haircut is 2 weeks, and I'm sticking with that. At least there were no awkward eyebrow moments like the last time (by the way, have you seen Tom's sympathetic eyebrow picture? Fabulous. I might make that my desktop wallpaper this week...).
Here's something for your Notes Designer client to chew on:
LS2J Examples Database
In Notes 6, Lotus introduced a feature called LS2J that allows you to call Java classes from LotusScript. I've never really had a chance to use LS2J before, so I decided to spend some time this week understanding it and trying to figure out some interesting reasons to use it. The result of my labor is a database with a few script libraries and agents. Here's what you'll find inside:
- An agent that makes an FTP connection to a server, lists files and directories, and downloads a file. Using LS2J for this type of thing allows you to perform multiplatform FTP client operations, without relying on LotusScript calls to Windows DLLs.
- An agent that allows you to use regular expressions in LotusScript. I wasn't intending to teach you how to use regular expressions if you've never used them before, so I kept the examples reasonably simple.
- An agent that can resize, rotate, and otherwise manipulate JPEG image files. It also has an example of how LS2J can allow you to use Java multi-threading in LotusScript.
So there you go. Have a nice weekend.
UPDATE: Looks like Jens Bruntt has been pretty busy with LS2J recently too. He's posted an example of zipping files using LS2J, as well as an agent that makes thumbnail images.
I was trying to figure out why the LS2J zip agent sounded familiar, and I finally remembered that Andrew Pollack had mentioned it almost 3 months ago. Based on the comments from other people who are working with LS2J already, it looks like I'm might be playing catch-up trying to figure out how to use it.
:-)
Several weeks ago, Brendon Upson (of
Puakma fame) let me try out a beta of his Web Booster product, and I thought it was pretty cool. Now that
Web Booster is gold, you might want to take a look too.
On the surface, you can think of it as a reverse proxy for your web servers. Instead of hitting your web server(s) directly, you can set up Web Booster to be a front end, so the users are transparently hitting Web Booster instead of the web server. Simple enough, right? So why would you want to do that...?
Well, a couple of reasons come to mind:
- Web Booster caches the data for you, which should make everything more efficient
- Web Booster uses standard HTTP data compression, which should make the data transfer to the users faster
- If you want to make one of your web servers accessible to the Internet (a mail server, perhaps), but you don't want the security risk of exposing the entire corporate server to the world, you can just put a Web Booster box in the DMZ, punch a hole in the firewall to allow it to talk to your internal server, and let Web Booster to handle the Internet traffic (and exposure) for you
- Web Booster understands LTPA tokens, so you can handle single sign-on with multiple Domino and/or WebSphere servers transparently
- Web Booster also has an optional module that allows you to do single sign-on between NT and Domino web servers
That last piece (SSO between NT and Domino) is the coolest feature to me, but also the one I haven't had a chance to play around with much. In any case, lots of potential.
Anyway, I've been meaning to mention that all week. And no, I'm not getting any kickbacks for talking about the product -- I tried it, I liked it, and I wanted to tell you about it.
I finally got around to finishing and releasing
OpenLog version 1.0 over on the OpenNTF site. That kind of stuff is always a lot more work than I expect it to be. I'd write more about it here, but I'm tired and I'm going to bed right now.
If you're not familiar with my little OpenLog database project, the nutshell is that it provides a very easy way to log LotusScript and Java errors and events in your code. Lots more information than you're probably already logging. See my original announcement of the project for more detail, or just download the database and try it yourself.
Here's something that I've heard of before, but never knew whether or not it was real. Confirmed at TruthOrFiction.com, there actually is such a thing as
Kopi Luwak coffee.
Why would I doubt its existence? Well, apparently the coffee is made from coffee beans that have been eaten by and then excreted from an Indonisian monkey. Okay, so it's not a monkey, it's something called a Palm Civet, but that's really beside the point. What's important here is that the coffee beans have passed through the entire digestive system of an animal -- monkey, cat, raccoon, whatever -- and after they've been crapped out they're washed off, roasted, and ground up for a hot cup of java.
Yeah.
I was told that Raven's Brew Coffee used to have Kopi Luwak t-shirts that said "Good to the last dropping", but I didn't see them on the site anymore. Maybe Maxwell House got mad about the slogan...
The other day I noticed that there were a bunch of temporary-looking files in my Notes program directory. They were all named using a convention of "eo###tm" (like eo54477740tm, eo54477984tm, etc.), and the file sizes were all over the place -- everything from 20 KB or so, all the way up to 3 or 4 MB. I opened a few of them in a text editor and discovered that they were Word docs, PDFs, and other assorted file types.
It finally occurred to me that they were files that had been attached to e-mails. Hmm, what have I been doing with e-mail attachments recently...?
Ah yes, the Winmail.dat file conversions. To give you a clue about what was going on, try running this agent against a selected e-mail that has an attachment:
import lotus.domino.*;
import java.util.*;
import java.io.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
DocumentCollection dc = agentContext.getUnprocessedDocuments();
Document doc = dc.getFirstDocument();
RichTextItem body = (RichTextItem)doc.getFirstItem("Body");
Vector v = body.getEmbeddedObjects();
Enumeration e = v.elements();
while (e.hasMoreElements()) {
EmbeddedObject eo = (EmbeddedObject)e.nextElement();
if (eo.getType() == EmbeddedObject.EMBED_ATTACHMENT) {
InputStream is = eo.getInputStream();
System.out.println(eo.getName());
is.close();
//eo.recycle();
}
}
body.recycle();
doc.recycle();
} catch(Exception e) {
e.printStackTrace();
}
}
}
Now take a look at your Notes program directory. Do you see any eo*tm files? I'm running Notes 6.51 on XP, and I do. One for each attachment I called getInputStream() against. The Notes Designer Help gives us a further clue as to what's going on:
EmbeddedObject.getInputStream creates a temporary file. The file is deleted when EmbeddedObject is recycled.
Well, I thought that my EmbeddedObject object up there would get recycled when the RichTextItem that contains it gets recycled, or at least when the Document gets recycled. Nope. Apparently not. As long as you have that eo.recycle();
line commented out, the recycling never seems to take place (or at least the temporary file never gets deleted). Since the file is in the Notes program directory instead of the Notes temp directory, it never gets cleaned up either, so you could really start building up those files over time.
I also found out that you have to explicitly close the InputStream before you recycle the EmbeddedObject too. For example, if the eo.recycle();
line is there but the is.close();
line is not, the temporary file remains there as well (which makes sense, because something else could be using it).
So that's your Lotus Notes recycling tip for the day: if you call EmbeddedObject.getInputStream()
, make sure you close the stream and recycle the embedded object -- in that order -- when you're done with them.
I updated the Winmail.dat conversion agent to reflect this change as well (I just added one line of code). If you've been using that agent, you should probably add the call to recycle(), and manually clear out any temporary files that you may already have.
Dear God,
Please grant me the wisdom to vote for the right guy, the tolerance to deal with people who are voting for the other guy, and the patience to accept a situation where my guy might not win.
Please allow my vote to be counted properly, and for any lawyer who tries to cause my legitimate vote to be disqualified, please send him or her on your Divine Bullet Train to Hell (which you would probably be doing anyway, but I'd just like to make a humble suggestion here).
And God, thank you for allowing me to live in a country where I am allowed to vote freely, and bless those who have given their lives and blood to fight for that privilege.
Amen.