Mackenzie joins the campaign

Tim’s 15 year old daughter Mackenzie will be joining our running “group”. I think it’s really cool that she wants to do this with her dad. And I’m impressed that she can even consider spending that much time with us.

Mackenzie, let me apologize now for the endless hours of geek-talk to which you’ll be subjected. Your dad and I can talk about smartphones, mobile apps, new web technologies, sailboat racing, swimming/cycling/running, and anything remotely related to any or all of these for hours.

You have both my heartiest respect and my humblest sympathies. 🙂

Welcome aboard.

Marathon training has begun

A very good friend made the mistake of saying he’d train with me if I wanted to sign up for a marathon. It would be a mis-statement to say I “wanted” to run a marathon (I certainly want to have run one), but I was deep in the throes of an early-winter-lack-of-motivation and was desperate for a reason to keep active. So…I said ok. And ok, yes…I have to admit, for full disclosure, I think it’ll be fun.

We came up with a plan for a Thanksgiving turkey trot 10k of some kind to get us started. If that went ok and my back seemed willing, we’d use that base to roll into a marathon plan.

So far, so good. We’re signed up for the Camp Letts Turkey Chase 10K on Thanksgiving Day.

Fun weekend racing Alberg 30’s

The 2010 Bruce Rankin Memorial Regatta, the annual Chesapeake Bay gathering of Alberg 30 racers, was treated to clear and breezy conditions!

J churned out a great write-up on the Alberg 30 Racing blog.

It was breezy enough the race committee decided to forgo spinnakers Saturday. Probably a good choice; understanding our honored Canadian guests were racing unfamiliar, borrowed boats, the spin would have been fun but a handful. Here’s a little video:

My first Half-Ironman complete!

Ok, so the posts have been a little thin…I’m not much of a blogger. But the big news is I completed my first half-ironman under my own power and feeling good.

My goal was the ubiquitous ‘just finish’ so I had fun and took it very easy. The truth is my training was no where near what I wanted so I didn’t feel the confidence that goes with feeling prepared. I had never swam the distance, ridden the distance, or run the distance. I had no idea what to expect. On top of that it was hot and humid. The heat index was reported at 101F. A lot of starters didn’t finish.

The big stressor of the day was warm water: for the first time in a long time (I heard 17 years) the water was too warm for wetstuits. Typically amateurs are allowed to wear wetsuits in water temps between 78F and 84F but aren’t eligible for prizes or placings. In this case the organizers, maybe because they hadn’t needed to deal with it in such a long time and didn’t have a method for recording who wore one and who didn’t, chose to disallow wetsuits for everyone. Well, for many of us this was not what we wanted to hear. In fact, at least one person didn’t start the “race” because they were so concerned. I never considered bailing, but I sure was nervous about it. The wetsuit is a safety blanket for us barely-ready-for-the-distance types. It’s not the cold we’re worried about, but the drowning. (Or at least the “using so much energy for the swim that we can’t lift our arms to put on our helmets.”)

The swim turned out to be fine, just longer than I hoped. Even being in the largest start wave of the day I was able to start clean, without any problems (of course there’s bumping any time that many people put their faces in the water and swim generally in the same direction, but no real kicks or swim-overs) and found my groove easily. There was a little extra effort and concern required after the first turn to swim across the current but no problems.

In T1 I took my time and put on plenty of sunblock. I knew I would be exposed to the all of the most direct sun. That’s another advantage of being fit and fast; you spend less time getting burned.

The ride was mostly uneventful. I really took it easy since I knew I would be suffering on the run regardless. I was going to be ok ‘suffering’ on the run, not ‘collapsing’. The ride is very flat, not technical, and scenic enough that I never really felt any mental strain for the 3+ hours. I rarely even got into Zone 2 heart rate and saved those times for when the wind was worst, just to keep a constant pace. I made sure to apply sunblock to keep the shoulders and knees from frying. Toward the end I definitely felt ready to be done with the bike, but that went away as soon as I got back into town and was reminded, by those already on the course, that I still had 13.1 miles to run. I’d rather stay on the bike another two hours, thankyouverymuch.

T2 was relaxed and slower than T1. I put on more sunblock and thankfully had brought another pair of socks for the run.

I had my first experience with leg cramps on the first two miles of the run. I say that somewhat tongue-in-cheek because they never really cramped, just spent a lot of time reminding me they were there and threatening to cramp. I figured I was a little under hydrated, astoundingly, so walked a bit and took Gatorade Endurance from every water stop. The bad news was even after the legs felt good, running for even 10 minutes put my heart rate in Zone 4…I can’t maintain that effort even on a day without the extra anquish that comes from heat and buckets of sweat. And there wasn’t any amount of ‘slow’ that was enough to keep the HR down in the sustainable range. I had hoped to run the whole 13.1 miles and that was now out-the-window. In the end I don’t know exactly, my Garmin 305 died at mile 5, but a conservative guess is I walked almost half the run. ah well. Next time more fitness and more hydration.

I finished in 7 hours 15 minutes. What’s more, I felt good. Don’t mistake, I was happy to be done but didn’t want to die either. I know my effort level for the whole day was not “race pace”, and in fact was less than “training pace”, but in the days following I felt good. Little blisters on the feet from the walking in soaked socks, good sunburns on my back where the jersey didn’t cover and I didn’t know to reach, but other than that no serious muscle soreness or pain. I went on a very light ride two days later and it felt great. We certainly didn’t push hard and it felt great to get the muscles moving.

Overall, I definitely erred on the side of caution, but I met all my goals: ‘Finish’, ‘don’t injure myself’, ‘don’t embarrass myself’, in that order.
Detailed results here.

Next year, a time goal!

Basement Training Center

So I’ve only been active in triathlon for a couple years and am not what I would call hard-core, especially in terms of “performance”, but I don’t have a problem running or riding outside in the cold. (Here I’m talking Annapolis, mid-atlantic cold…not Minnesota cold.)

Treadmill and trainer

New basement decorations - Treadmill and trainer

But this winter has been terrible for getting outside to do either. Freakin’ El Niño (which is Spanish for “the niño”) has dumped record snows and the temps have kept those twelve dozen feet of snow on the ground longer than usual. Two weeks after the this last storm and the sidewalks are still covered, travel lanes narrow, and almost every intersection is a blind turn thanks to the piles of dirty white stuff. Translation: train indoors or just plain nap. While I’m an inappropriately huge fan of the practice, no amount of Nap Mastery is going to get me through a half ironman un-embarrassed. With a new house (read: more space and less money) we’ve dropped our various gym memberships and have gone anti-social. A craigslist treadmill and a cheap, sale-priced-plus-membership-club-discounted cycle trainer have become my torture dujour.

Basement view of the South Forty

This indoor stuff is all new to us but I’ve already found the motivation to start work on the “distraction center”. 30 minutes on the treadmill is doable but, even with a nice view of the snowy south forty, 90 minutes on the trainer without more stimulation (read: brain candy) is just cruel and unusual.

I’ve started my Eagleman training

Eagleman is a great 70.3 event put on by the Columbia Triathlon Association in Cambridge, MD every June. I volunteered last year and came away terribly inspired…as I always tend to be any time I’m around these events and the people who populate them. So I signed up. Ha! (I’ve only done two other tris: Lums Pond Sprint two years ago and Columbia Oly last year.)

Ok, technically I “started” training a month ago but it’s been a rocky road. Between illness, record snowfall, and travel my schedule has been a mess.

BUT NOW, I’m totally on track. We have a cheap treadmill, cheaper cycle trainer and core ball in the basement plus I’m doing a great “tri” masters swim course that is really kicking my ass. That all bodes well for not injuring or embarrassing myself in June. I have to face the truth that my ego puts ‘don’t embarrass myself’ a very close third on my list of goals. (‘Finish’ is number one and ‘don’t injure myself’ is number two.)

I’ve known for a while that, for me, ‘fear of embarrassment’ is a stronger motivator than any other. ‘Live a long healthy life’ is way too long-term and abstract to get me out of bed.

Hard to run or ride in this.

Hard to run or ride in this.

ssh logins without a password

Setup

To set this up you first need to create an ssh identity on your local machine.

$ ssh-keygen -t dsa

Your user’s home will now have a .ssh subdirectory with the identity file (id_dsa) and the public key file (id_dsa.pub). Copy the contents of id_dsa.pub to <target server>/<username>/.ssh/authorized_hosts

You can automate this with the ssh-copy-id script.

$ ssh-copy-id -i ~/.ssh/id_dsa.pub user@host

Note: If you use a non-standard ssh port on the target–doesn’t everyone?–edit the script (/usr/bin/ssh-copy-id) at line 41:

{ eval "$GET_ID" ; } | ssh -p 12345 $1 "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1

You’re not quite there yet, but close.
If you try to ssh to your target now, you’ll be prompted for the local identity’s passphrase first. That’s a good sign; it means the target machine is accepting your public key authentication. You need to start a local ssh agent and add your identity to it.
(replace bash with your favorite shell)

$ ssh-agent bash
$ ssh-add

You’ll be prompted for the passphrase and the identity will be added to the ssh agent. The agent will use this identity’s authentication until you exit the shell where it’s running. (To avoid even this step, setup keychain.)
You can now ssh to your target machine without being pestered for a password or phrase of any kind.

$ ssh test@remoteMachine

When you can connect without being prompted for a password, you’re ready to go crazy with pssh.

Enjoy!

pssh to manage multiple systems

pssh (Parallel SSH) is a powerful tool if you need to manage multiple boxes. Originally developed by Brent Chun, it’s now maintained by Andrew McNabb.

Installation

Depending on your distro, you probably have pssh available in a repository of some sort. I know there’s a new version in the Fedora 12 yum repository and lots of binaries in RPM format. Since I was playing with a CentOS 5.4 installation, and pssh isn’t in the default repositories, I chose to grab the source from the new project home.

pssh is written in Python. Now, I don’t know the first thing about Python, but using ez_setup.py made the build and install exceedingly painless. (Follow the INSTALL notes in the tar file.)

Install setuptools, extract the source, and then build it:

$ wget 'http://peak.telecommunity.com/dist/ez_setup.py'
$ python ez_setup.py
$ tar -xvf pssh-2.0.tar.gz
$ cd pssh-2.0
$ python setup.py install

This will install the utilities to /usr/bin

Usage

$ pssh --help

usage: pssh [OPTIONS] -h hosts.txt command [...]
options:
--help show this help message and exit
-h HOST_FILES, --hosts=HOST_FILES
hosts file (each line "host[:port] [user]")
-l USER, --user=USER username (OPTIONAL)
-p PAR, --par=PAR max number of parallel threads (OPTIONAL)
-o OUTDIR, --outdir=OUTDIR
output directory for stdout files (OPTIONAL)
-e ERRDIR, --errdir=ERRDIR
output directory for stderr files (OPTIONAL)
-t TIMEOUT, --timeout=TIMEOUT
timeout (secs) (-1 = no timeout) per host (OPTIONAL)
-O OPTIONS, --options=OPTIONS
SSH options (OPTIONAL)
-v, --verbose turn on warning and diagnostic messages (OPTIONAL)
-A, --askpass Ask for a password (OPTIONAL)
-P, --print print output as we get it (OPTIONAL)
-i, --inline inline aggregated output for each server (OPTIONAL)

Configuration

Create a hosts file for pssh to act on.

$ more pssh_hosts.txt
# host[:port] [user]
192.168.5.10:12345 glen
192.168.5.11:12345 glen

Run

$ pssh -h /home/pssh_hosts.txt -P date

192.168.5.10: Wed Dec 30 03:44:40 GMT 2009
[1] 22:44:24 [SUCCESS] 192.168.5.10:12345
192.168.5.11: Wed Dec 30 03:42:22 GMT 2009
[2] 22:44:24 [SUCCESS] 192.168.5.11:12345

I’m not sure if I like the output from -P or -i better. I’ll have to play with both for a while.

To redirect the output to a file, use the -o switch and give it a directory name. In the output directory will be files, named after each of your targets, containing the command results.

There is some old documentation still available at Brent Chun’s original site, but it could be out-dated. I know the binary install location has changed and the --help switch has the newer options.

While playing with the 2.0 version from the Fedora 12 repo, I noticed the pscp command is now pscp.pssh. I couldn’t find any reference to why the change was made. The source I built from has the original pscp command. (Update: I came across this comment referring to a name-clash with PuTTY’s scp utility.)

Note:

pssh assumes you have publickey–no password entry–access to all the machines you’re managing. To set that up, take a look at this.

Enjoy!