The first cut is the deepest

That’s not how I expected or hoped for my first kayak race of the season to go.

Dan and Jim told me about this little race in Canandaigua this weekend. It wasn’t on the NYMCRA calendar and it was very loosely organized. The web site barely mentioned the flat water part of the race, and I was getting contradictory information on where it was supposed to start. But heck, it was only 10k and I’d been itching to see how all the work I’d done this spring was preparing me.

On race day, Dan and Paul D decided not to race for various reasons. Dan still went with me, but he was going to do a downriver paddle on the part of the river below the slalom course where the flat water course ended. So basically that left Jim, me, and Julia as the class of the race. There were a couple of C2s and a C1 that looked like they knew what they were doing, but I knew we were going to be faster than canoes. So my goal was to stay with Jim as long as I could, and not blow up and keep ahead of Julia.

The start was pretty dicey – about 20 metres after the start there was a two tunnel bridge, and a couple of idiots in a raft were blocking one of the two tunnels, so we had to sprint for it. Julia, being much lighter than me, actually got there ahead of me, but afterwards I buried myself to try to pass her and catch Jim. Also there was a submerged log very early on that my rudder hit for fortunately it didn’t twist it like logs sometimes do.

Things went according to plan. For the bit where I’d worked hard to catch Jim and for about a kilometer afterwards, my heart rate was up around 171, which is the highest I’ve ever seen it. But after I caught his wake and he slowed down a bit, I recovered to the mid 150s with occasional trips up to the mid 160s when obstacles in the river made me lose his wake and I’d have to fight my way back to it. Julia and everybody else were out of sight behind us and I was able to concentrate on keeping on Jim’s wake and going hard but not too hard, averaging just a bit faster than 5 minutes per kilometer. And that took us to about the 7 kilometer mark.

At about the 7 km mark the water got rougher. Not actually white water, but lots of standing waves and twists and turns and narrow parts of the river. I lost Jim’s wake because I was spending too much time bracing instead of paddling, while his boat that was made for those types of conditions just powered on through.

At about the 7.5 or 8 km mark, there was a narrow bit where my rudder hit a submerged log and I dumped. Fortunately there was a flat part of the bank there and I was able to very quickly get out, get the water out of the boat, and get paddling again. But the water was really cold and I was shivering by the time I got in.

And not 10 metres later I got a sweeper branch in the gut, and I dumped again. This time I was using a gigantic log, about 3 times the length of my boat, to try to get out when it suddenly came lose and started heading downstream. So I had to let it go by and then get onto shore. The shore wasn’t quite as conducive to getting back in, and I’d spent a bit longer in the water, so I was pretty cold. And Julia came by as I was finally sorted out and getting back in again.

This time I resolved not to rush it, but I started paddling and realized my rudder was way off straight. It wasn’t easy to tell, because my feet had gone completely numb and I wasn’t sure if I was even pushing the tiller bar. I had to crash into shore again, get out with my feet in the cold water, and straighten the rudder. As I was doing so, the first of the C2s, a couple of women that Jim and I had met paddling on Red Creek a week or so ago, came by.

I set off again, and I’m not sure how much further I got. This time another submerged log got me, but after the log was very deep water. This time the current was so strong it ripped off my aqua shoes and took my camelback. I had to swim hard to make the shore, and when I got there the bank was so steep and so overgrown I couldn’t get my boat out to get the water out. I ever tried to break out the rear bulkhead to make it easier to dump the water, but to no avail. After a while, while the other C2 and the C1 came by, I realized I was going to have to go back into the water to dump out the boat. I wasn’t relishing that. I actually sat down on the bank for a while to warm up. When I stopped shivering, I went in and dumped most of the water out of the boat. During that time a guy came by in a squirt boat, so I realized that not only had I lost, but there was no way I was going to even finish in the top 3 kayaks. But then I had the problem of how to get back into the boat. I pushed and pulled the boat to get it into a position where I could stand up to my waist in water, and then sort of put one leg in, brace with the paddle and get the other leg in. It worked, after a fashion, but two guys in a fat, wide fishing kayak who were yelling at each other came by while I was doing so. At least I was able to pass them.

The finish didn’t come fast enough to me, but when the water wasn’t too wavy I managed to put on a bit of speed. At the finish, Dan and Jim and Julia took charge of my boat and paddle, and one of the volunteers gave me a t-shirt so I had something dry to change into. As I mentioned I didn’t have any foot protection at this point, so I kind of limped back to my car, and Jim and Julia brought me a hot dog and a bottle of water while I warmed up.

Jim and Dan went off on another down-river paddle, and I was supposed to pick them up in half an hour or so. So I was sitting there, taking pictures of all my scratches for my Facebook page when I suddenly realized that while all I could see where superficial scratches, there was an actual “puddle” (or a conglomeration of drops, if you want to be less melodramatic, and I don’t) of blood sitting there on the sill of the car door where I’d had my feet. I look at my left foot, no problems, look at my right and just about pass out from the sight of this huge flap of flesh there. I hobbled over to the first aid ambulance, and they say “you need stitches and a tetanus shot”. Before I could say “but my car is unlocked, my wallet is in it, and somebody has to pick up Dan and Jim”, they had me in the gurney and on my way to the hospital. So now I’m trying to figure out how to contact Julia to lock up my car, secure my kayak, and go pick up Jim and Dan, and also let Vicki know what’s happening. So I’m texting Vicki like mad, but I don’t have Julia’s cell phone number. I texted Stephen, since he works with her and probably knows her number, but he’s out of town and he never got back to me. I asked Vicki to post something on Julia’s husband’s facebook wall, because that’s the only way I know to get in touch with them.

As I was being admitted into the hospital, Dan phones me up to ask where the hell I was. I explained the situation, and he and Jim said they’d take care of things for me. And sure enough, while I was getting stitched up Jim and Julia come into my room and Julia starts taking pictures. Jim suggested that Julia send one of the more gruesome pictures to Vicki. But not only had they come to visit me, they’d also brought my car and my kayak and picked up all my stuff.

Obviously I’m home now. I’ve got 5 stitches in my foot, and I’m cautioned not to wear shoes very much for the next week or so. I’m sore and tired, and the numbness is starting to wear off on the cut. And I’ve got to figure out how to get Julia to send me copies of those pictures. But I did have 7/10ths of a great first race.

Programming Tests: Useless waste of time, or massive insult?

I just had to take another one of those stupid “BrainBench” programming tests for a job I’m applying for. (I’m not planning on leaving the place I’m working now, but as a contractor you always have to be ready to jump ship.) These tests are a complete and utter crock of shit. They don’t test if you can program, all they test is if you’ve memorized every obscure and complicated part of the literally millions of lines of Java API documentation out there. A typical question will show you four snippets of code, and ask you which is the correct one. And they’re not localized down into one part of the API that might be relevant to a particular job, either.

One of the questions was about how to set up a cookie handler on a persistent URLConnection. Another was on how to set the line width in a Graphics2D line. And another was on setting up a pipe between a sender and receiver. You know, if I’d needed to do any of those things in my 12+ years of programming in Java, I might have bothered to memorize that page of the API documentation. But I haven’t, so I haven’t. Instead, I’ve wasted my time learning useless things like how to write code so that when you or somebody else comes to add some functionality a few years from now, they can figure out why you did it the way you did it, and can add their stuff without breaking what you’ve got there. And how to debug an obscure exception that only happens after the program has been running for 45 days. And how to structure a program so that it’s fast, reliable, does what it’s supposed to do and doesn’t crash. You know, frivolous stuff like that.

Evidently I’m not alone in my hatred and disgust for these stupid tests. According to The Register, Ken Thompson, co-inventor of Unix and of the C programming language, isn’t allowed to check code in at Google because he refuses to take their stupid C language test. How stupid do you have to be to insult the man who invented the language by asking him to take some test that was probably written by some 24 year old “language lawyer” straight out of school who has memorized every obscure part of the language without being able to use any of it well?

So I’m guessing that I probably did horribly on that test, and that I’m probably not going to get an interview there, and that’s perfectly fine with me because I don’t want to work with people who were chosen because they’re good at memorizing language documents. They probably write horrible code, but think they’re great because they don’t have to stop and think and look things up.

Maybe VPS or cloud *is* the way to go, after all.

More problems setting up the new colo box:

  • I shut down with all three domUs running, and when it came back up, xend wasn’t running so they wouldn’t start up again. Further investigation showed that I hadn’t made my root partition big enough to handle when it saved the current xen state to /var/lib/xend. So I made a new lvm partition for /var/lib and mounted that instead. So far, so good.
  • While I was investigating this, I noticed my software raid was running in degraded state, because it had lost /dev/sda3. I re-added it and it started to rebuild it.
  • While it was rebuilding, I noticed that xen1, my first domU wasn’t running any more. When I tried to recreate it, it told me I couldn’t recreate it because its main disk, /dev/xen-space/xen1-space, was mounted in a guest domain. Oh oh.
  • Then I got a kernel panic. Double oh oh.
  • I rebooted, and tried to rebuild the raid without xend running, but I got another kernel panic.

This is supposed to be easy and fun, right?

I’m currently booted with the rescue disk, and I’m trying to rebuild the raid again. If that dies, it might be time to cut my losses.

Earthlink sucks, film at 11.

Earthlink is blocking email from my colo box (which is on a static IP, has never sent spam, and isn’t on any known block list in the world). I jumped through their hoops to report this fact, and got two emails within a few seconds of each other:

  • One claiming that I’m not blocked, so why am I claiming I am?
  • One claiming that they’re removed the block that they just finished claiming wasn’t there.

And of course, email is still bouncing. Of course they did caution that removing the non-existant block will take 2-24 hours.

Don’t you just love consistency?

In the last hour, I’ve been told

  • Don’t use SYSDATE in inserts/updates because although it’s bog standard SQL (I’m not sure if it’s ANSI standard, but it’s pretty common), it’s not supported by all Microsoft databases (even though we only use Oracle in this project)
  • Do use VARCHAR2 instead of VARCHAR, because although VARCHAR2 is only supported by Oracle, and in the current release it’s just a synonym for VARCHAR, some day it’s going to have different comparison semantics than VARCHAR and Oracle says to use it, so we have to use it.

I’ve also been told that these two tables, which I have to populate by hand using manually taking the rows and columns of a spreadsheet and writing “INSERT…VALUES(‘row’,’column’,’value’)” statements several hundred times, can’t use semantic primary keys because they want to use UUIDs. So instead of looking at the spreadsheet and seeing that in the row labelled “Insurance” and the column labelled “Security” that the value is “V” and converting that to “INSERT … VALUES(‘insurance’,’security’,’V’)”, I’ve got too look up the uuid for the Insurance row and the uuid for the Security column, and change that to “INSERT … VALUES(‘6BAC51EC-C636-4C31-9E95-367062AC23F7′,’C78BF79B-3178-4F07-ACD3-92DF2742C932′,’V’)”. And I’ve got to do that several hundred times. Yes, that seems *much* less error prone that using keys I can actually tell what they mean and easily tell if I’ve got the wrong one. Oh, and even better, the code that uses the information in this table will have to hit the database to look up these uuids so that they can find the value of the “insurance” versus “security” instead of just coding those values directly.