DC Randonneurs Woodbine Wallop 200 km brevet

The last couple of 200ks were routine enough that I didn't bother writing ride reports. But I'll summarize before I forget what happened.

North by Northwest was a new brevet based on an existing permanent route, and only featured two hard climbs, a rarity for that area of Maryland and Pennsylvania. We got a pretty small field for such a nice route on a nice day, only about 22 riders. I rode up front with no-cue-sheet Jeff and Dave from SPP until the first big climb when I got dropped, and ended up finishing behind those two and Matt from PA. I rode in alongside Bill at the front of the non-mountain-goat category. I was disappointed, but not surprised, that I couldn't climb with the lighter guys.

And the Flatbread 200 was flat and windy as usual. We had a huge field, over 70 riders. I rode up front with Greg and Andrea and Mark V., and Dave and Bryan from SPP, until the Delaware border, when I realized that 20 mph into a headwind just wasn't something I could sustain all day. Plus I really needed to eat (I never remember to eat while sucking wind that hard) and find a bathroom. (Not nearly enough woods or cornfields in Delaware.) I ended up dropping way back and finishing an hour and a half behind the front group. Also, my brain was kind of fried and I missed a hard-to-miss turn. Luckily Ed and Mary on the tandem were close behind and yelled me back on course, and I followed their wheel for the last few miles. In hindsight, while chasing faster people is good exercise, I should have dropped off after 20 miles rather than 35.

And then I had a fun mechanical on a Crista century a couple of weeks ago. Just Riding Along on a small hill about halfway through the ride in the middle of nowhere, my back tire insta-flatted. I found that the wheel had actually cracked near the valve stem hole, and a sharp piece of the wheel had knifed through the tube. Luckily Chuck was close behind, and helped me fix it with duct tape and a tire boot to stiffen the broken rim, and I inflated it to only 55 psi to minimize stress on the rim and took a 29-mile shortcut and managed to make it back to the start in Warrenton without further problems. Didn't hit a significant bump or use my rear brake for the rest of the ride. I couldn't figure out my new cue sheet holder while stressing about my wheel, so I relied on new guy Mike from Google to lead the way, which he did flawlessly. The rim was a 2-year-old Velocity Aerohead OC with about 12000 miles on it. The consensus was that it was probably corroded from the inside from lots of rain riding. I'll try to replace my rims more often.

So I showed up for the hardest 200k of the year with a new rear wheel that had only done a few commutes. We only got about 15 riders, not too surprising for a very hilly ride on a 30-degree day that was forecast to be windy. At least it was dry so we didn't have to worry about snow or ice. Against my better judgment I started up front with Greg and Andrea and Chip and tall fast David, but I came to my senses and dropped off voluntarily on the second small hill about 8 miles in, rather than trying to stick to their speed until Mar-Lu Ridge at mile 37, when I would have definitely been dropped regardless. And, unlike Flatbread, this ride was hard enough that wasting energy chasing them could have rendered me unable to finish. I got passed by Bryan around mile 12 while I was taking it easy on a small descent with my untested wheel, then didn't see anyone else all day except at controls.

I was wearing a summer jersey and shorts, cotton and heavy wool socks, polypropylene long underwear top and bottom, thermal tights and my warmest winter jersey. Plus my Lake winter boots, a balaclava under my helmet, a reflective vest, and lobster claws. That was warm enough, except on fast descents where the wind went through all those layers. But if I'd had a jacket on top I would have got too sweaty everywhere but the descents, and constantly putting the jacket on and taking it off would have been too annoying, so I think I got it about right. I would have liked a warmer helmet, though, since my Bell has a zillion vents and fits too snugly to put a decent-sized hat underneath, so I ordered a Bern Brentwood winter bike helmet for the next cold ride.

At the first control at mile 26 I saw the 5 riders in front of me, and 2 or 3 of the riders behind me, and drank a chocolate milk. (It was cold enough that I should have had something hot, but I don't like coffee and didn't see any other quick hot options.) The wind was gradually picking up and was cold and right in our face. Mar-Lu Ridge came at mile 37 and it was as hard as usual. At least this time my derailleurs were correctly adjusted, so I had no problem getting into my 34×28 and staying there. The thing about Mar-Lu is that it's pretty steep most of the way up (4 mph for me, faster for the climbers), then gets steeper near the top (3 mph for me). And then there's a little notch and a second summit, though the little second climb is actually quite easy. There's a big descent down the back side, which I took mostly riding the brakes (to minimize the wind chill, and because I didn't fully trust my new wheel, but mostly because I'm a big wuss).

After Mar-Lu the course rolled for a few miles into Burkittsville and then up Gapland. Usually this part is easy, but today there was a huge headwind whipping through the valley so it was slow going. On many rides Gapland would be a feature climb, but after Mar-Lu it doesn't seem that bad, and the hill broke the wind. I stopped at the top to make sure I was going down the correct way (Townsend is the second right, not the first), then went down carefully. I remembered Townsend being bumpier; maybe they repaved it at some point.

The 15 miles from Gapland to Shepherdstown is usually a nice easy bit, but not riding alone with a big headwind. I kept looking down and seeing 12 mph. I had to pedal down hills that looked coastable. I just hoped the wind would be behind us on the way back. Crusing from Sharpsburg toward Shepherdstown I saw the lead foursome coming back the other way, probably 20 minutes ahead of me.

Shepherdstown Sweet Shop is the best control ever, because they have yummy food and clean bathrooms. I overshot it by a few feet, then turned back around and saw Bryan leaving as I arrived. I had some kind of strawberry danish (yummy) and a slice of chocolate torte (delicious) and a bottle of Nantucket Nectars lemonade (sickeningly sweet, like badly mixed Kool-Aid, with no real lemon flavor or tartness.) Mike, the next rider behind me, came in while I was about to leave, with RBA Bill and his camera trailing behind. Bill hadn't caught the lead riders with his camera, so I warned him of how far ahead they were. I refillied my water bottle (singular; I had only drank 28 ounces of Gatorade and a bottle of chocolate milk in 60 miles) and headed back toward Maryland. Well, actually I headed the wrong way, since I'd overshot on the way in reversing my path led to heading the wrong way, but I eventually got pointed the right way.

I made it all the way through Shepherdstown without any near-death experiences with the local bad drivers (college towns have the second-worst drivers in the country, after Florida). After the halfway point the wind was no longer in my face, though it was only a direct tailwind for a few wonderful miles. (We really need to figure out how to rig sails to bicycles so that we can benefit from the wind from more directions.) About ten miles of rollers led to Reno Monument Road and the worst climb of the ride. (Before the ride my opinion was that Mar-Lu was worse, but I'm changing it.) It was about noon and warming up a bit, so I stopped before the climb and took off my balaclava and my long underwear top and my reflective vest, and swapped my lobster claws for lighter gloves. Equipped to climb without roasting but probably to freeze on the descent, I did the first short steep bit and then the downhill, and thought I remembered Reno being longer than that. It is. The next part is brutal, winding up at 3 mph for a long way. Right before the top my heart rate hit about 180 and I decided to stop and catch my breath, the first time I've needed to stop on a climb in a while. I knew I was only about 50 yards from the summit, which made it worse. I stood there for a minute breathing slowly, then I drank half of my second bottle of Gatorade, then I rode up the rest of the hill. Getting started on the steep slope in my hard-to-clip-in winter boots wasn't easy, but once I got going the last bit wasn't hard in my newly rested state. I stopped again at the top to put my balaclava back on and zip up my jersey, and admired the bit of snow on the ground up there, then bombed down the descent for a bit, got scared by a blind curve and hit the brakes way harder than I meant to and almost went over the bars. That was the end of fast descents for the day, except for dead straight ones with the bottom fully visible and no cars in sight.

There was a 50-mile gap between controls so I was a bit tempted to stop in Middletown around mile 75, but I had a full bottle of water and a half bottle of Gatorade and some Gu and Clif Bars, so I kept going. Without the headwind I made a decent pace, around 15 mph, until the next big climb up the shoulder of US 40 and then up Shookstown Road. The cue sheet said the descent after Shookstown was twisty, and after my near-mishap on the previous descent I used a lot of brakes. The ride then wandered through a lot of familiar exurban roads around Frederick. A rider caught me from behind and I said hi, but he turned out to not be from our group, even though he had a bright orange reflective vest in broad daylight that was dorky enough to scream "randonneur." I dropped him on a little climb and then stopped to get some food out of my bag (embarrassingly, I can't open Clif Bar packages with gloves on while riding), and he passed me and then turned the wrong way onto Bloomfield Road. I almost yelled at him to get back on course, when I remembered he wasn't actually riding the brevet. (Good thing I didn't draft him, as it's illegal to draft people who aren't on the ride.)

Many of our rides end in Frederick, so I felt like I was heading for the barn, but there were actually 30 miles left. My new goal was to make it to the finish before dark, but I just didn't have much left after fighting the wind and hills. I went through the 7-11 at mile 111 fast, bought a bottle of Gatorade and a big Snickers, and ate them while some silly teenagers with especially stupid hair whined about not having enough money for all the cigarettes and lottery tickets and candy they wanted. Get off my lawn!

Just to be mean, the finishing stretch went over Buffalo Road. Not as bad as Reno or Mar-Lu, but still a pretty bad climb. I really had to pee and eventually found a stretch of woods out of sight of houses. It was approaching dusk so I put my reflective vest back on and turned on my lights. This made me safe and legal for after-dark riding, but my goal was still to finish before sunset. The sun went down when I was climbing Watersville Road, so I missed it by a few miles. It was too dark to easily see the street sign for Old Frederick Road and I hadn't put on my helmet light, but I eventually spotted the sign and made the last turn. From there it was a quick little ride into Pizza Hut in Woodbine. Volunteers Bill and Mike were there, but the five riders in front of me (four fast finishers and one DNF) were already gone. More pizza for me.

That was probably the hardest 200k I've done. My lungs were okay (except on the top of Reno) but my legs and lower back were beat. We had 2 DNFs out of 15 riders, one at the front (Went too hard and ran out of gas?) and one at the back (knew he couldn't make the time limit and shortcut his way home). Hills and wind and cold are a bad combination. In hindsight I should have slowed down a bit and waited for the next rider to catch me, to have a partner in the wind. But I didn't want to slow down, since I already felt like a slug. Probably exercise-induced testosterone poisoning.

Total climbing: somewhere over 10000 feet, depending on whose GPS you believe. Total food intake: 2 Clif Bars, 2 Gu, 88 ounces of Gatorade, 16 ounces of chocolate milk, 16 ounces of (vile) Nantucket Nectars lemonade, one strawberry danish, one slice chocolate torte, one large Snickers, and 3-4 slices of post-ride pizza. At the airport in Frederick they said the peak winds were 16 mph sustained with gusts to 22, but I think it was worse than that up in the mountains.

Goals for 2012: finish the 600 and get my weight down to 180 so I can go up hills faster. (Some people bike to lose weight; others lose weight to bike.)

Bicycles

Comments (0)

Permalink

git bisect for the impatient

I was testing Slugathon last night and found a bug.  Unfortunately, it was a GUI bug so my unit tests didn't catch it.  Luckily, the bug was easy to reproduce (I could see it in about ten seconds from the start of a new game).  So here's how I used git bisect to find which commit had the bug.  (Note: I had a clean tree with no uncommitted changes at the start of the process.  If I had uncommitted changes I would have used git stash first.)


$ git bisect bad

You need to start by "git bisect start"

Do you want me to do it for you [Y/n]? Y

$ git checkout HEAD~10

$ ./setup.py build; sudo ./setup.py install; ./slugathon server

(Did not see the bug.)

$ git bisect good

Bisecting: 4 revisions left to test after this (roughly 2 steps)
[b1b94b6253ad506cb03199bea6ff52e76ebedfb9] Remove some obsolete TODO comments.

$ ./setup.py build; sudo ./setup.py install; ./slugathon server

(Did not see the bug.)

$ git bisect good

Bisecting: 2 revisions left to test after this (roughly 1 step)
[cb7b8c2553f48a6d2a8c8eca5cb538927720874c] Rename Player.legions to markerid_to_legion

$ ./setup.py build; sudo ./setup.py install; ./slugathon server

(Did not see the bug.)

$ git bisect good

Bisecting: 0 revisions left to test after this (roughly 1 step)
[d0a783c61eba6ba5f70b3021252a46f301293727] Update legion and marker counts after StartMusterPhase.

$ ./setup.py build; sudo ./setup.py install; ./slugathon server

(Did not see the bug.)

$ git bisect good

69efbfd5e19220e46f588944a8692140933cb303 is the first bad commit
commit 69efbfd5e19220e46f588944a8692140933cb303
Author: David Ripton <dripton@ripton.net>
Date:   Mon Dec 5 21:34:36 2011 -0500

Rename Player.markerids to markerids_left for clarity.

$ git bisect reset

And that's all; it found which commit had the bug. I did a git log -p on that commit to see exactly what I'd changed, found a suspicious part of the patch a few minutes later, fixed it, verified the bug was fixed, and committed and pushed the fix. Easy.

Of course you can do this without git bisect; it just saves you the effort of manually doing the binary search through the range of possibly-bad commits.

Programming

Comments (0)

Permalink

DC Randonneurs Cacapon 200km Brevet

This one went perfectly, so it'll be a short and boring ride report. (Except for the bear.)

I packed my stuff the night before, including putting my bike inside my car. (My old car, a BMW M3 sedan without fold-down rear seats, wouldn't hold my bike without totally taking it apart, so I had to use a trunk rack. And the car didn't fit in the garage with the bike on the trunk rack, so I had to wait until the morning of the ride. But my new car, a Honda Fit, can hold my bike without taking any wheels off. Pretty amazing for such a small car.) So all I had to do was wake up at 5 a.m. (yuck), eat some breakfast, and drive to Middletown VA. Got there around 6:30, well ahead of the 7 a.m. start, which gave me time to listen to some stories about Paris-Brest-Paris last month. It was around 50 degrees, but felt chillier than that since it was 90 on Wednesday, and I was decked out in tights and a long-sleeve jersey and wool socks and a bright green reflective vest with the zipper on the wrong side for a right-hander to draw his sword. (Oops, I got a girl's vest. Luckily, anyone that can tell is automatically less manly than me for knowing too much about fashion, so it's okay.)

We only got about 15 riders for this brevet, a pretty small turnout for DC Randonneurs. Probably because most of the people who rode PBP are still resting. As we rolled off, I noticed my speedometer wasn't working, so I had to stop and reseat it in its bracket, which meant I started next to last. (Roger didn't bring lights and waited a few more minutes to make sure the sun was totally up.) Honestly, starting at the back is probably smarter anyway since I've missed the second turn of this route not once but twice in the past. I started off slow, but after a few miles decided everyone around me was just moving too slowly, and started passing people. Pretty soon I was all the way in the front, next to George. We rode together for a while, until he noticed that others were creeping up behind us. I decided I didn't want to be caught, and took off. Most of the fast people didn't ride today, and the fast people that did ride weren't feeling fast today, so nobody caught me before the first control at 17 miles.

At the first control I drank a 20 ounce Cherry Coke, turned off my lights, and took off my long-sleeved jersey. About five riders caught me while I was there, and Kelly realized he forgot his tubes, so I lent him one. While I was doing all that, George out-controlled me and retook the lead. But I took off second and caught him after a few miles. We rode together for a bit, until the first big hill which he climbed at his typical slow-and-steady-good-for-1200-km pace, and I climbed at my stupid going-to-burn-out-before-100-km pace, which meant I was back in the lead. I didn't think it would last long, but I didn't see another rider from our group on the road for the rest of the day.

The second control on the porch of a closed store in Siler was labeled an information control, but when I got there RBA Bill was there to take pictures and hand out food and sign cue sheets. I was happy to still be in front, though the rollers were starting to hurt a bit. I felt like I was descending better than usual, despite a few drops of rain. I'd recently (but not the night before the brevet, for once) adjusted my brakes, which gave me more confidence in my stopping ability and let me go faster without feeling like I was taking excessive risks.

When I got to the mile 61 control at Greg's Restaurant in Capon Bridge, I saw another bike parked out front. Hmm, I was sure I was in front. Then I saw it had a cue sheet for our ride. How did someone pass me? It turned out to be Leslie, who had shortcut the course to turn a 200k into a century. (This is of course cheating if you do it with fraudulent intent, but she told Bill she was doing it because she didn't feel up to 200 km that day, so it was okay.) So I was still in front. I had a chicken salad sandwich and took off toward Wolf Gap.

The 10 miles along Cacapon River road are the prettiest part of this ride, and also (as you can tell from the word "River") the flattest. I saw a few people canoeing on the river, and enjoyed digesting my lunch. The 8 miles along WV 259 were less fun, since they featured hills and traffic, but the traffic was pretty friendly and I got to the 7-11 in Wardensville in a good mood. This 7-11 was not a control (that'll teach 'em to not let us use their bathrooms) but my bottles were dry so I stopped anyway and bought some Gatorade and some kind of air-injected Hershey Bar I hadn't tried before. (Clever marketing — sell less chocolate and more air and call it a feature.) It was okay, nothing special.

I went down Trout Run road toward Wolf Gap, still ahead of the field. When I started climbing I got warm, so I stopped to take off more clothes and pee. Ten miles of (mostly) up and (some) down later, I reached Perry's Zoo. It was open for once, but I didn't need anything so I didn't stop. The climb up Wolf Gap proper is steep, but kind of anticlimactic after the ten-mile buildup. I stopped at the top to put my arm warmers back on, then zoomed down the descent. Well, zoomed by my standards, which is super-slow compared to any real descender, but I'm not that skilled and going too slow is better than crashing and losing teeth.

The descent turned into Animal Planet. First I saw a turkey vulture eating something on the side of the road. It saw me and took off, but went the same direction I was going at about the same speed I was going (maybe 27?), so I got a fantastic up-close look at a big ugly bird in flight for several seconds before it flew above the trees. Then I encountered a couple of pickup trucks going up the hill around blind corners in the middle of the road. Luckily bikes are skinny and I try to go around blind corners as far to the right as possible, so no head-on crashes ensued.

Near the bottom, the first dog of the day came out into the road to play. It wasn't that big, but it was brown and fast and had the angle on me and cut me off like a good defensive back. I was a bit worried that I was going to hit it, but it left me enough room to get by, and I was going downhill, so let go of the brakes and pedalled hard and zipped by. I was still a bit pumped from the dog when I saw something in the road ahead that looked like a *huge* black dog. Wait, that's not a dog, it's a bear! (And while it was huge for a dog, it was actually pretty small for a bear, probably less than a year old.) Luckily the bear was as scared of me as I was of it, and ran off into the woods, so I didn't have to deal with going around it. Finally, at the very bottom of the hill a second dog decided to chase me. It was tan, and a lot bigger than the first one, but also a lot slower, and probably more bark than bite, so I got past it without much trouble. That would be the end of the day's animal excitement, except for a couple of dalmatians on Back Road who chased me from behind their fence (thank you owners who actually keep their dogs in their yards), which hardly counts.

The last control of the day was at Larkins Store near Edinburg, where I bought another bottle of Gatorade and two Reeses King Cups. Apparently regular peanut butter cups are too small for Today's Fatter Americans, so now they make bigger ones, 200 Calories per cup. Yum yum yum. I ate my candy and refilled my bottles and drank the excess Gatorade and used the Porta-Potty and headed for Back Road. This ride features 17.8 miles of Back Road, which feels like forever, and I was sure someone was going to catch me from behind, but they didn't. The last 10 miles from Back Road to Middletown went by very quickly. There was no Civil War re-enactment this time (our ride is now scheduled not to conflict with it, for better hotel rates), so the scenery was less exciting than usual.

I finished first (for the first and probably last time) in a not-very-impressive 9 hours 55 minutes. Kelly got a flat right near the end, so we were both glad I loaned him that tube. Pretty much a perfect day for me — no flats, no wrong turns (!), I remembered to eat and drink enough, and my legs held up.

Bicycles

Comments (0)

Permalink

PyPy is still the fastest Python

PyPy 1.6 was just released, so I ran my Project Euler benchmark script again.

The script runs my pile of Project Euler solver programs across various implementations of Python available on my computer, and gives results only for the ones that finish successfully in less than a minute on all of them.

The contenders this time were PyPy 1.6, CPython 2.7.2, CPython 2.6.7 with Psyco, and Jython 2.5.1+. (Unladen Swallow appears to be dead, and IronPython is surprisingly painful to install on Linux, so I left them out.)

This time, 125 programs qualified, out of 197 working solvers. (Some programs require the gmpy library, which doesn't currently work on PyPy or Jython. And some use Python 2.7 syntax, which won't work with Psyco or Jython. And some are just too slow.)

Once again, PyPy is fastest, followed by Psyco, then CPython, then Jython. PyPy and Psyco are roughly twice as fast as CPython, and Jython is roughly twice as slow as CPython. (Though a lot of that is startup overhead; Jython gets more competitive for longer-lived programs.)

script pypy 1.6 jython 2.5 psyco 2.6 CPython 2.7
euler1.py 0.10 2.76 0.10 0.03
euler2.py 0.10 2.73 0.10 0.10
euler3.py 0.21 4.17 0.41 0.41
euler4.py 0.32 4.67 0.42 0.31
euler5.py 0.11 3.65 0.11 0.11
euler6.py 0.11 3.25 0.12 0.11
euler7.py 0.32 4.98 0.31 0.62
euler8.py 0.10 3.44 0.10 0.10
euler9.py 0.11 4.06 0.11 0.20
euler10.py 1.43 9.42 2.04 8.61
euler11.py 0.11 2.75 0.10 0.11
euler13.py 0.10 1.42 0.10 0.10
euler14.py 4.86 7.99 1.42 2.93
euler15.py 0.11 2.73 0.10 0.12
euler16.py 0.10 1.62 0.10 0.11
euler18.py 0.20 3.13 0.10 0.10
euler19.py 0.10 3.04 0.10 0.10
euler20.py 0.11 2.74 0.11 0.11
euler21.py 0.21 4.47 0.10 0.31
euler22.py 0.12 3.97 0.11 0.12
euler23.py 3.45 18.13 7.01 15.39
euler24.py 3.54 32.17 7.91 5.47
euler25.py 0.62 4.60 1.11 0.20
euler26.py 6.39 18.62 11.25 5.19
euler27.py 1.12 10.42 1.32 9.93
euler28.py 0.10 2.74 0.12 0.12
euler29.py 0.11 3.85 0.11 0.11
euler30.py 3.15 9.51 5.17 4.15
euler32.py 2.23 6.37 5.17 4.16
euler33.py 0.10 3.45 0.11 0.10
euler34.py 4.56 12.45 12.09 15.48
euler35.py 4.95 30.77 7.38 28.47
euler36.py 1.93 5.89 3.04 3.24
euler37.py 9.62 34.24 14.57 16.42
euler38.py 1.32 6.98 1.83 1.83
euler39.py 0.30 3.86 0.10 0.31
euler40.py 1.12 6.40 0.83 0.72
euler41.py 4.68 18.73 5.42 4.97
euler42.py 0.22 3.86 0.10 0.10
euler44.py 0.61 5.77 0.71 3.25
euler45.py 5.59 10.45 2.96 2.34
euler46.py 0.20 5.56 0.22 1.73
euler47.py 0.71 8.32 0.72 4.86
euler48.py 0.10 4.65 0.11 0.10
euler49.py 0.41 6.11 0.62 0.61
euler52.py 0.41 5.08 0.81 0.81
euler53.py 0.32 4.27 0.21 0.20
euler54.py 0.43 5.06 0.22 0.42
euler55.py 0.61 5.17 0.41 0.41
euler56.py 1.14 5.98 1.63 0.92
euler57.py 0.41 5.68 0.53 0.72
euler59.py 13.76 15.08 14.57 13.56
euler61.py 0.31 4.27 0.20 0.11
euler62.py 0.20 3.84 0.31 0.20
euler63.py 0.20 3.34 0.20 0.10
euler65.py 0.11 3.06 0.11 0.12
euler66.py 1.31 20.25 8.00 13.35
euler67.py 0.42 3.36 0.11 0.11
euler68.py 0.10 2.54 0.10 0.10
euler69.py 0.10 3.55 0.10 0.10
euler70.py 0.41 7.00 0.81 0.72
euler71.py 0.22 5.18 0.31 1.01
euler72.py 6.48 38.36 6.38 54.47
euler73.py 2.95 21.28 2.95 27.14
euler75.py 11.95 6.47 0.71 2.33
euler77.py 0.51 6.48 0.21 0.41
euler79.py 0.10 1.72 0.10 0.10
euler80.py 0.61 2.43 0.72 0.61
euler81.py 0.30 2.02 0.10 0.10
euler82.py 0.51 7.28 0.30 0.30
euler83.py 0.21 2.84 0.41 0.61
euler84.py 1.52 19.45 6.58 22.46
euler85.py 9.15 21.56 10.53 12.86
euler87.py 2.24 5.57 1.23 1.12
euler89.py 0.10 2.33 0.10 0.10
euler93.py 2.63 10.96 5.76 11.66
euler94.py 24.61 21.98 27.12 22.97
euler97.py 2.93 9.32 2.73 3.46
euler98.py 0.41 3.65 0.51 0.61
euler99.py 0.12 2.24 0.11 0.10
euler100.py 0.10 1.62 0.10 0.10
euler101.py 0.41 3.04 0.10 0.10
euler102.py 0.10 2.43 0.11 0.11
euler103.py 0.10 1.72 0.10 0.10
euler104.py 1.01 4.17 1.82 1.72
euler105.py 1.74 6.19 0.51 0.41
euler106.py 1.52 7.41 0.51 0.41
euler107.py 0.21 4.88 0.21 0.41
euler108.py 2.83 12.77 8.11 11.66
euler109.py 0.30 9.60 0.41 2.14
euler111.py 4.57 26.96 5.68 25.42
euler112.py 6.38 12.35 13.28 17.82
euler114.py 0.10 3.24 0.10 0.10
euler115.py 0.21 4.76 0.20 0.30
euler116.py 0.10 3.75 0.11 0.10
euler117.py 0.11 3.35 0.12 0.12
euler119.py 0.10 1.72 0.10 0.10
euler120.py 0.10 2.33 0.10 0.10
euler121.py 0.10 3.74 0.10 0.20
euler123.py 4.06 22.27 7.70 7.58
euler124.py 0.72 7.38 0.72 2.84
euler125.py 1.13 4.97 1.64 1.73
euler126.py 1.52 12.44 3.66 16.31
euler135.py 3.86 6.37 2.33 3.65
euler142.py 0.21 4.66 0.10 0.32
euler143.py 0.11 2.54 0.12 0.12
euler150.py 0.52 5.39 1.02 0.91
euler157.py 0.10 1.42 0.10 0.10
euler162.py 0.10 2.43 0.10 0.10
euler171.py 0.10 1.43 0.10 0.10
euler172.py 0.51 2.83 0.51 0.51
euler173.py 0.61 2.93 0.71 0.91
euler174.py 3.65 6.58 3.65 3.34
euler181.py 0.10 2.33 0.10 0.11
euler190.py 0.10 1.62 0.10 0.10
euler202.py 0.12 3.35 0.10 0.10
euler205.py 1.02 8.51 1.12 0.71
euler207.py 0.41 4.36 0.20 0.81
euler222.py 0.10 1.72 0.10 0.10
euler230.py 0.11 3.54 0.11 0.12
euler233.py 0.12 3.15 0.12 0.12
euler234.py 4.56 19.15 7.40 9.96
euler235.py 0.42 4.86 0.62 0.42
euler240.py 10.36 50.91 11.76 22.39
euler267.py 0.51 3.95 0.20 0.41
total 209.07 946.66 267.48 473.62
wins 82 1 57 55

Programming
Python

Comments (0)

Permalink

ROMA Leesburg 400 km brevet ride report

The Leesburg 400 starts 6 miles from my house, which is so convenient I had to ride it.  I actually wanted to ride to the start, but 400 km is a long way and 12 more miles might be the straw that broke the camel's back, plus (more importantly) I would have needed to get up a bit earlier, so I wimped out and drove.  The ride started at 5 a.m., but since it was so close I was able to wake up at 4, eat a bowl of cereal, and still make it to the Comfort Suites by 4:30.  There were 14 riders there, about 5 of whom I recognized.  It was about 50 degrees with a slight breeze at the start, pretty much perfect weather.

Matt sent us off with minimal ceremony at 5 a.m.  The route went down Route 7 Business, Catoctin Circle, and then up Dry Mill Road.  A few hours later these roads would be pretty crowded, but we were pretty much the only people silly enough to be out there that early.  We saw a few deer on Dry Mill, but nobody ran into any this time.  Gravel and potholes were more of a problem, but I didn't see any crashes.  We had some light traffic on Route 9, but had Clarkes Gap Road to Waterford to ourselves.  We zipped through Waterford with the group mostly intact, then through the circle in Lovettsville, and up Berlin Turnpike to the bridge over the Potomac.  Last time I crossed that bridge (the other direction, on last year's DC Randonneurs Frederick 400) it was a minefield construction zone, but this time the bridge was fine.  We zipped up Maryland 17 to Harmony, heading up toward Burkittsville.  By then the front group had dwindled to 8 riders.

Paul and Carol eventually dropped off, and then Alec noticed they were gone and slowed down to wait for them, and I was at the tail end of a group of 4 fast guys.  I stuck with them for a while, but around mile 27 it started warming up, and I wanted to take off some clothes, and I also realized that I hadn't eaten anything.  And of course if I tried sticking with the fast guys to the end I was sure to blow up.  So I stopped on the shoulder for a couple of minutes and let the fast group go, then continued by myself up Spruce Run (not very steep, but very narrow and thus not a great place to be passed by cars) and then Route 77 through Catoctin Mountain Park (the easy way through the park; not too much climbing.)

We came out of Thurmont on Route 15 North.  I will give props to Maryland for having really wide shoulders on some of their highways, but it's still not much fun to ride alongside lots of speeding traffic.  Near the end of the 7 mile stretch on 15, Alec and Carol and Paul caught me, and I fell in behind them as we got off the highway onto 15 business.

Unfortunately, there were Detour - Local Traffic Only signs on 15 Business.  We hadn't heard anything about the detour, so we didn't know if bikes would be able to sneak by.  Until we reached the missing bridge.  Oops, we had to reverse course and take the detour.  We gathered up a couple of other riders and took the detour, hoping it would end up back on 15 Business.  I got a bit too excited on a flat part and ended up dropping Paul and Carol, which was a really bad idea since we were off the cue sheet and Paul knew the area way better than the rest of us.  The detour signs eventually went away and we ended up on Confederate Avenue inside Gettysburg Battlefield Park, having missed our control.  Eventually Alec figured out that we should have turned onto Emmitsburg Road, and we backtracked, and found our control at Gettysburg Battlefield Resort, with 10 bonus miles.

The control didn't have any appealing food, so I just bought some water and ate a Clif Bar and a Gu packet, and took off some more clothes.  I left by myself after about 15 minutes, and started riding back through the battlefield.  I passed another rider, who hadn't found the control yet and was not happy about it, and gave him directions.  I guess April isn't peak tourist season, because thankfully there weren't nearly as many Civil War veterans in gigantic cars trying to run over cyclists as the last few times I rode through Gettysburg.  I rode through Fairfield, Sabillasville, and down the wide shoulder of Raven Rock Road to Smithsburg.  I was kind of annoyed about the ten bonus miles, since that would mean more riding after dark later, but my legs were okay.

Somewhere around Smithsburg I was caught by Alec and Paul and Carol again.  I rode with them through the pretty Mountain Laurel Road section, then over to Antietam Battlefield, which is much less tourist-infested than Gettysburg and thus usually much nicer to ride through.  We had a control at 116 miles at Battlefield Market in Sharpsburg, a really good control with decent food.  I ate some fried chicken and some coconut pie, and then hung around outside resting for a while.  We went across the Potomac into Shepherdstown West Virginia and then almost got run over by a left-turning geezer who never saw four brightly-dressed cyclists in broad daylight.  Have I mentioned that each cyclist should be allowed to yank one motorist's drivers license per year?  Luckily our brakes worked and nobody crashed, and we kept going down WV 480 and WV 9.

This was probably the worst part of the ride, because it's a two-lane road with too much traffic and a narrow pothole-infested shoulder.  Trying to dodge the potholes to your right without getting run over by the pickup tracks passing on your left isn't much fun, but there aren't always better roads available.  After about 10 miles we were far enough from Shepherdstown that traffic dropped off a bit, and then we turned off toward Summit Point and then over the Virginia border toward Winchester.  This is one of the few parts of the Virginia - West Virginia border that's not on top of a mountain, which was nice.  My chain had been squeaking all day (because I got caught in a thunderstorm on my commute home on Wednesday and had forgotten to lube it afterward) and Alec noticed and gave me some chain lube, which helped with both the noise and my shifting.  We skirted the edge of Winchester then took Middle Road and Back Road toward the 171-mile control at Matt's house near Strasburg, where there was some good food waiting.

Unfortunately, the recent rain meant the Stan Miller Memorial Low Water Bridge over the Shenandoah was underwater, so we had to take a detour through Front Royal where there's a higher bridge.  Yay, Saturday night traffic.  The detour wasn't on our cue sheets, but Paul knew the way, so I resolved to stay near him no matter what to avoid getting totally lost.  It cooled off fast when the sun went down, so I put on almost all of my clothes and turned on all my lights and followed the other three riders down VA-55 for what seemed like forever.  Then we had to ride in some traffic in Front Royal, and cross a bunch of lanes to make a left onto what eventually became Happy Creek Road, which featured some construction that made the lane too narrow for a car to safely pass a bike.  Luckily we had a good driver behind us, who patiently followed us through the construction zone, so it wasn't a problem.

We got back on 55 toward Marshall.  Traffic was light but fast, so we had to watch our back, but nobody passed us too closely.  We did have one big dog try to chase us, but we all dodged it.  It took forever, and we were starting to get cold and tired, but we reached the 213-mile control at the Marshall 7-11 around 11:30 p.m.  We bought and ate various imitation food; Coconut M&Ms are pretty yummy.  And we left around midnight to head back to Leesburg.

Marshall to Leesburg is only 38 miles, but it seems a lot longer when you're tired.  We went up Zulla Road toward Middleburg, then up Mountville and Snickersville and Watermill and Lincoln toward Purcellville.  I'd ridden all these roads before, but not in the middle of the night.  The good part was the lack of traffic; the bad part was finding all the potholes in the dark.  But we did our best to point out the road hazards, and nobody crashed.  We had one scary moment when some idiot came tearing down the road at easily double the speed limit, but luckily he was (mostly) on the other side of the road.  We all bailed onto the (nonexistent) shoulder anyway, then resumed riding.  Carol led a sing-along to keep everyone awake, though I didn't help much since I couldn't remember the words to anything.

Lincoln features one of those radar speed detection signs, which meant I had to sprint for it.  And I registered possibly the worst sprint of my life: 16 mph.  Hilarious.  At that point we were on really familiar roads: Route 7 Business through Purcellville and Hamilton, then down Dry Mill into Leesburg.  There's another radar speed sign on Dry Mill, so I gunned it again, and managed 28.  Alec claims the second sign was clearly reading high, while I think the first sign was reading low.  We're probably both right.

We got to the hotel at 3:13 a.m.  Though it took a couple of minutes to wake up our sleeping volunteer so we could officially finish.  I ate a few post-ride cookies and then left, before I had a chance to get too sleepy to drive safely.  My speedometer said I rode 258.8 miles (the course was supposed to be 251.4, so the first detour cost us about 10 miles and the second gave us about 2.5 back).  Average moving speed was 13.7 mph, a decent pace.  We had some hills, and some wind early, but it was calm late.  And I was lucky enough to follow people who knew the way in the dark, to avoid adding more bonus miles.

Other than the two bridge detours, it was a pretty uneventful ride.  I didn't bonk or dehydrate or have any flat tires.  Dropped my chain twice, so I need to do some front derailleur limit screw adjustments.

Thanks to Paul for navigating, Alec for giving me some much needed chain lube, Carol for keeping us all awake, and Matt for running the brevet.

Bicycles

Comments (0)

Permalink

DC Randonneurs Contrary Mother of All 300ks Ride Report

It's called the Mother of All 300ks because it's 300 km long (actually more like 309 km, but who's counting?) and really hilly.  And it's called contrary because we're riding it backwards from the way it was originally ridden.

The start was at 5 a.m., in Middletown Virginia, which is about 70 minutes from my house.  So I had to leave around 3:30, which meant I had to get up by 3, after about 4.5 hours of sleep.

The forecast was for about 40 at the start, over 60 in the afternoon.  So I wore my summer shoes with two pairs of socks, a short-sleeve wool jersey and a thermal jersey, my best cycling shorts with thermal tights, lobster claw gloves, and a warm balaclava.  I had a cycling cap, rain jacket, sunglasses, and lighter gloves in my bag.  The weather forecasters got it wrong; it stayed in the 40s all day, with a bit of rain and a lot of fog.  Should have worn my winter boots, or at least brought shoe covers.  But other than my toes I wasn't too cold; never needed to put on the rain jacket.  Also never needed the sunglasses.

I brought 2 28-ounce bottles of Gatorade, 4 Gu packets, and 4 Clif bars.  I had a bowl of cereal before I left the house, and then a big bagel at the start, so I figured I'd be okay until the sun came up.

Since an awful 8-flat century last year, I always carry 3 tubes and a spare tire on long rides.  A few days before the ride I put a 25 mm Gatorskin tire on the front of my bike, to match the one I put on the back a couple of weeks earlier.  I figured this would decrease my chance of a flat, and make rough roads more comfortable, compared with the 23 mm Krylion Carbon that was there before.  I also adjusted my front derailleur screws to avoid dropping my chain, like I did too many times on my last brevet.

There were about 40 riders at the start.  I managed to stick with the fast group, about 17 riders, for a while.  Probably not a great idea to burn energy riding at 20 mph, but I was fresh and the early hills were just gentle rollers.  One rider in the group hit a deer and was slightly banged up; after that I tried to give myself a bit more space, but stayed close enough that I didn't have to navigate for myself in the dark.  Trusting the herd to navigate was a mistake because we all missed a turn and did a bonus half-mile.  Then we had an information control at mile 17 before crossing a big highway at a traffic light, which bunched everyone together again until the second control in Siler at mile 34.

After that control the route got hillier and the faster riders flew off the front and I ended up riding by myself at a slower speed.  There wasn't a control with food until mile 60, so I ended up eating a Gu and a Clif bar and making myself drink more Gatorade than I really wanted.  And then the mile 60 control didn't have any food that looked good, so I just bought some Gatorade there to refill the bottle I'd drunk, and ate another Gu and another Clif Bar.  I left the control a bit behind three other riders, and immediately missed a turn because I was following them rather than watching the cue sheet.  Eventually they stopped to see if I knew where I was going, and I didn't but was sure we'd gone way more than 0.1 mile, and turned back around to find the turn right after the control.  Another 2 bonus miles.

The Slanesville control was a good one: general store plus convenience store plus restaurant with bathroom.  I'd only eaten about 1200 calories to go 82 miles, not nearly enough, so I had a slice of pizza (would have had two, but there were only two left and another hungry rider was standing right next to me) and a bag of Doritos and more Gatorade.  Still not enough, but I didn't want to gorge myself and cause stomach problems, so I resolved to eat more often and kept going.  I also bought some AAA batteries because one of my taillights was looking a bit dim.  (I never put new batteries in both of them at once, because I don't want them failing together.)  I caught up with Paul and Carol and rode behind them for a bit, but then they had to stop and I kept going alone again.

There were some more rollers, then a couple of miles on the shoulder of US 50, then a whole lot of empty rolling roads with bad pavement.  I gradually slowed down, probably due to not having eaten enough, and five or six riders passed me.  I was riding alone when I approached a turn that the cue sheet said would have loose dogs, and sure enough two dogs came running out into the road to meet me.  But it was a little dog and a medium-sized dog, both looking more playful than vicious, so not too bad.  But just to be safe, I whipped around the corner fast, not quite as fast as I wanted because a slow-moving pickup truck was blocking the road, but fast enough to avoid running into the pooches.  And continued down horrible roads at low speed.  I wasn't sure how much of the slowness was due to the road and the hills, and how much was due to not eating enough, but nobody else caught me from behind.

When I reached Lost River at mile 138 I was certain I was bonking, and the Lost River Grill had a menu that looked decent, so I ordered a real meal: onion soup, some kind of wrap, onion rings, and a milkshake.  Unfortunately a bunch of other riders came in right behind me, and there was only one waitress and probably only one cook, so it took a while to get all that food.  But it was good, and I probably needed the break.  I ate with the tandem team of John and Cindy, chatted with a couple of other riders, then left to climb Mill Gap and Wolf Gap.  I wanted to make sure to get down the steep side of Wolf Gap before it got dark.

Unfortunately I got a flat right at the top of Mill Gap, and it took me about 15 minutes to fix it.  I never found the cause, so I'm going to assume it was a pinch caused by the rough road, though that's surprising since it was a brand new 25 mm tire, I was going uphill (so not fast) and I don't remember hitting a particularly huge bump, just a zillion small ones. So maybe I have bad rim tape or something; I'll find out if I get another front flat soon.  While I was up there two tandems and two single bikes passed me, and sunset kept coming closer.  But it was 15 more minutes to digest dinner, and by the time I started climbing Wolf Gap the bonk was gone.  I stopped at the summit for a couple minutes to put on more clothes for the cold descent, and John and Eric caught up.  It wasn't dark yet, but there was very thick fog on the east side of the mountain, and I didn't fully trust my just-fixed tire, so I had to descend at 15 mph.  (Of course I don't descend windy roads very quickly anyway, so this wasn't a huge loss.)

I was almost out of food, so I went off-course a bit to the Sonoco station to buy a couple of candy bars, which I ended up never eating.  (But it was still a good idea to get them, because I was almost out of food, and really didn't want to bonk again.)  John caught up with me there, and we decided to ride back together.  On the steep hill when we first got on Back Road, I dropped my chain, for the second time that day.  A few miles later, two big dogs ran out into the road in front of us, but they backed off and let us by when we yelled at them.  And about halfway down Back Road, my headlight bracket got loose and my headlight started drooping and illuminating my front wheel instead of the road, so I pulled over into a church parking lot to fix it.  Carol and Paul and Chris went by while I was doing that, then John and I caught up with them and decided to ride with them the rest of the way, to avoid getting lost.  The five of us did the last 12 rolling miles or so of the brevet at a moderate pace, and finished just before 10 p.m., with a time of 16 hours and 51 minutes.

So what did I do wrong this time?  Two navigational errors (both when following other people, but still my fault) adding up to about 2.5 bonus miles, imperfectly adjusted derailleur limit screws resulting in two chain drops, one flat tire of unknown origin, cold toes caused by trusting the weather forecast and failing to wear my winter boots or bring shoe covers, and bonking from not eating enough.  The bonk probably cost me an hour, and the flat definitely cost me 15 minutes, so if I avoid those mistakes, I should be able to do this ride in 15.5 hours next time.  (Of course I'll probably make different mistakes, or it'll be windy, or something.)

Bicycles

Comments (0)

Permalink

DC Randonneurs Urbana 200 ride report

DC Randonneurs does the Urbana 200 every year, but somehow I'd never ridden it before.  And I also missed this year's first brevet, the Tappahannock 200, because I broke my bike the night before.  (Okay, I actually wimped out because of the forecast 30 mph winds.  I really did break my bike the night before, but I have other bikes and would have ridden one if the forecast had been less dire.)  I did ride the Dart last weekend (with the excellent Team Sins of the Fleche: George, Joel, Lowell, Mike), so I had one 200 km ride in my legs this year, just not at brevet pace.

The start was at 7, so I set the alarm for 5.  Ate a bowl of cereal and a banana.  Got to the Urbana park-and-ride without drama around 6:30, then rode over to the Waffle House to sign in.  I followed another cyclist over there, and we took the scenic route, so I started the day with a bonus half-mile.  I was preregistered and the sign-in volunteers did a good job, so it only took a couple of minutes to get my brevet card.  We got a huge crowd for such a hilly ride — over 60 people, including a bunch of first-timers.  I don't know if that's a sign of general growth in randonneuring, or just because it's a Paris-Brest-Paris year.  It was well below freezing, 23F at Frederick Airport according to the National Weather Service.  I was wearing shorts, a short-sleeved wool jersey, polypropylene long underwear tops and bottoms, thermal tights, my warmest winter jersey, a balaclava, two pairs of socks (cotton and wool), and my Lake winter bike boots.  And I was still chilly, though not chilly enough to put on my rain jacket.  (Figured I'd warm up once we got going.   Most of me warmed up, but not my toes, which were cold even through two pairs of socks and my boots.  Guess I should bring toe covers next time, or wear two pairs of heavy wool socks.)

We left right at 7.  I took the lead for about 3 seconds because the start is the only time I ever get to lead a brevet, and then dropped back in the pack.  I stayed in the front group until I dropped my chain to the inside on the very first climb that required the small ring.  I had installed a new front derailleur on Thursday night (because the old one was broken), but didn't get the limit screws set right.  Putting the chain back on cost me about a minute, which meant the big fast group was long gone.  Oh well, wasting energy chasing them is a bad idea anyway.  I eventually fell into a small group with Joel, Maile, Alec, and a few other people whose names I don't know.

The first control was at a 7-11 in Union Bridge.  I bought some 79 cent peanut butter cookies, ate a couple, and took off after Chuck and Crista on their tandem. There was too much downhill for me to stay near them, so I ended up riding by myself for a while.

We reached the longest climb of the day, MD77 through Catoctin Mountain Park near Thurmont.  I got really hot going up the hill, and ended up stopping twice to lose some clothing.  (And ate a Clif Bar while I was stopped.)  I made the mistake of not putting my balaclava back on at the top, and just about froze my face off going down the other side.  It gave me a headache, like the kind you get when you eat ice cream too fast.  This was a recurring theme for the day: too hot going uphill, too cold going downhill.  I was actually pretty proud of my descending on this brevet — I'm still a wimp and tend to brake too early and too hard if there's a sharp turn, stop sign, etc. at the bottom of the hill.  But on the long screaming descent down the back side of Catoctin I pretty much went full speed.

We snuck just over the line into Pennsylvania and had a control at Earl's Market in State Line. I wasn't very hungry so I just bought some Powerade (they didn't have Gatorade — I guess Coca-Cola's market pressure is strong) and some Doritos, and finished the cookies I bought earlier, plus a Blackberry Jet Gu packet.  (I figured the caffeine might help with my headache.)  That was the halfway-point of the ride, so I took off back for Maryland.

Only 14 miles later, we had another control at a KOA Camp Store in Williamsport.  I got some Gatorade there, and took off after Paul.  Passed him, but then dropped my chain again and he passed me back, and we met at the information control at mile 95.  We found a general's birthday on a plaque, wrote it on our cards, and took off for the Battleview Market just a couple more miles up the road.  I still wasn't super-hungry so I just bought some macaroni salad (pretty good) and more Gatorade.  I didn't like the distribution of controls on this ride — too many of them were clustered together — but sometimes that's necessary to make it impossible to shortcut the course.

After the last control we got to ride through Antietam Battlefield, which is always nice.  (It's mostly flat, pretty, and not chock-full of tourists who can't drive like Gettysburg.)  I rode with Paul and Maile and Alec for a while, but then I jammed my chain between my biggest cog and my rear wheel (luckily not too hard, and luckily not doing any actual damage) and got dropped by everyone while I fixed it.  Then it was time for a couple more big climbs,  Gapland (the easy way) and then Mar-Lu Ridge (also the easy way).  Our Dart team did both of them (the hard way) last weekend, so it was nice to see the other side. I descended Gapland pretty well, but I knew there was a traffic light at the bottom of Mar-Lu and wasn't too confident in my front brake (my front wheel needs truing), so I crawled down at 20 mph and had to wait for the red light, and never saw the big group of riders that had been just ahead of me going up Mar-Lu again.

After the climbing was done, it was just some simple rollers back into Urbana.  I was fine almost until the end, but I mixed up the two roundabouts on the cue sheet, couldn't find 355, went back to look for it, and ended up doing a couple of bonus miles.  Also, during this extra riding a guy in a truck decided to pass me then immediately turn right.  Luckily he used his signal, so I was able to panic-brake and avoid the right hook.  Drivers: do not pass a bicycle then immediately turn right.  If you're turning, just stay behind the bike at 15 mph for a few seconds then turn behind it, and nobody gets squished .  Thanks.

I finally found Ledo's Pizza, and ate four tiny squares of pizza (total amount of pizza equal to about one real slice) and three yummy brownies.  Not nearly as much food as on the Dart, but I'm down about 20 pounds so far this year and trying to drop another 20 so I can climb faster (and also probably not die of a heart attack in my 70s, etc.), and doing my best not to pig out after rides.  (During rides is different — if you need the calories you need the calories.  After the ride you *want* the calories but you no longer *need* them, unless you're already skinny and want to avoid losing weight, or you have another ride tomorrow and need your glycogen replenished for it.)

My finish time was just over 10 hours.  If I hadn't got lost at the end I would have been just under 10 hours.  If I had properly adjusted my front derailleur to avoid all the chain issues, I might have made it in 9:30.  Anyway, the moral of the story is to try not to work on your bike the night before a brevet, or even two nights before a brevet.  (I did ride the bike to work the day before the brevet, but my commute isn't hilly enough to really need my small ring, so I only shifted into it a couple of times, not really enough of a test.)

While 10 hours is pretty slow, this course was quite hilly, and it's still only March, and it was cold which always slows me down, so I'm okay with it.  No flat tires, no dehydration or bonking, just the chain issues and the one near-right-hook marring an otherwise great day.  Thanks to all the volunteers who make these brevets happen.  Seriously, $5 for an all-day ride with pizza and brownies at the end?  I don't think you'll find a better bargain than that anywhere.

Bicycles

Comments (0)

Permalink

DC Randonneurs Cacapon 200k ride report

In the month since the last brevet, I lost six pounds, and took my bike to the shop to get the horrible creaking noise from the bottom bracket fixed. (As I suspected, it was just loose, and just needed to be removed and reinstalled tighter. But I failed twice to get it tight enough myself and figured it was worth paying a pro.) And the weather report said wind but no rain. And the Capacon route is really pretty, as are the changing leaves in the mountains along the Virginia - West Virginia border. So I figured it would be a great ride.

I packed everything the night before, then woke up at 4:45 a.m. to give myself plenty of time. Ate a quick breakfast (unlike last time), made good time in the early morning lack of traffic, and got to Middletown, Virginia around 6:15. But my GPS got confused about where the Super 8 was and sent me the wrong way on Reliance Road, out into the sticks. I hadn't written down alternate directions, but Middletown is small enough that just driving back toward I-81 and looking for the Super 8 sign worked fine. Not sure why I believed the GPS in the first place.

The temperature at the 7 a.m. start was in the high 40s, with some wind already. I decided to wear a wool short-sleeve jersey, a winter-weight long-sleeve jersey, shorts, heavy tights, wool socks, light full-finger gloves, and summer mountain bike shoes. This worked out pretty well. I had a light jacket and a balaclava in my bag just in case, but never needed them. I also had arm warmers, cotton socks, and fingerless gloves, in case I got hot later.

We started right about dawn, so I had my reflective vest and ankle bands. Both of my Relite taillights gave me problems — the LEDs and batteries were fine but the switches were refusing to stay in the on position. I removed the taillights from the bike, slapped them around a bit until they stayed lit (do not try this with traditional bulb lights), and put them back on the bike in time for the start. I always use two taillights so that if one fails, I'm still visible. (Note the clumsy foreshadowing.)

I took the early lead out of the parking lot (the only time I ever lead a brevet is at the very beginning). The Civil War reenactment was on the same day as our brevet again, and there was an amusing sign on a house that said "Blue Bellies Go Home." For the second time in a row I missed the first right turn at the only traffic light in town. Well, I didn't quite miss it this time. I was pretty sure it was the correct place to turn, but couldn't see a street sign that confirmed it (the street sign on the opposite side had a different name), so I waited there for everyone else to get there and confirm that it was the right place, then followed. The big group split in half a few minutes later, and I was feeling pretty good, so I sprinted up to join the tail end of the fast group.

I stayed at the back of the group for a while, then we hit a small climb followed by a dead straight, not very steep downhill. I think I was the heaviest rider there, able to out-coast all the skinny people, so I zoomed off the front, having a great time. And right about then Chuck and Crista zoomed by, reminding me that tandems are way faster downhill than even fat cyclists. (Chuck also turns a lot better than I do.)

We hit a medium-size climb, at which point the better climbers disappeared. I thought I was climbing better than on last month's brevet, but not well enough to actually keep up with the fast people, so I just stayed with the tandem to avoid using up too much energy early. We rolled into the first control at mile 17, while the leaders were still there. One of my taillights was missing — guess I didn't snap it back on very well. (Oops, but that's why I have two.) It was fully light by then, and starting to warm up, so I turned off my lights, took off my heavy jersey and reflective vest, and put on my arm warmers. Then I followed Chuck and Crista out of the control.

I rode with the tandem (falling off on the downhills, catching back up on the climbs, but choosing not to pass since they always set a quick-but-sane pace) to a control manned by our RBA / photographer Bill at mile 34. The control had some food and water, so I ate a banana and topped up my half-empty bottle. Then I continued following them up until a great view around mile 40. At that point Chuck and Crista stopped to take pictures, and I kept going alone. It was a really beautiful morning, and I was feeling good. I kept expected the tandem to come whizzing by on every downhill, but they didn't catch me until around mile 55.

I got to the lunch control at Greg's Restaurant in Capon Bridge at mile 61 still feeling good. Greg's wasn't expecting 30+ cyclists to show up at once, and it was taking forever for people to get their food. I decided to just get my card signed, use the bathroom, and take off without eating lunch there. (I'd eaten a Clif Bar and a banana and a Gu packet, and drunk a bunch of Gatorade, and there was more Gu in my bag, so I thought I could make it to the end without bonking, even if I skipped lunch.) Chris had the same idea, and left just ahead of me. I caught him and we rode together for the nice easy mostly-flat ten miles along Cacapon River Road. Jeff joined us for a while, and Randy and another fast rider said hi as they went by into the distance.

At one point a medium-sized brown dog came charging out of a yard after Chris, who was about 100 yards ahead of me because I'd stopped for a few seconds to fix my chain. Chris never even noticed, and he was going faster than the dog could run. The dog gave up on him, then turned to try to get me. I had to decide between slowing down and making it easier for the dog to catch me but less painful for me if I ran into it, or staying at full speed. I decided to sprint right at it, yell to scare it away, and dodge at the last minute if that didn't work. The dog acted tough until right before I arrived, but then I think it figured out that I was bigger than it was and that it would lose the crash, and let me go by without actually trying to bite.

After a quick stop at the 7-11 in Wardensville to get more Gatorade, we started the long slow club up to Wolf Gap. Chris said his goal was to take it slow and easy, and I agreed and decided to stay behind him. I dropped my chain two more times on the way up, so I fell a bit behind the other two, but the climb was much easier than I remembered from last time. I caught Jeff at the top, but stopped for a bit to put my arm warmers back on for the descent, and he went down first. Then I went down the steep, twisty eastern side of Wolf Gap. The cue sheet said hard right curve in 0.2 miles, so I rode the brakes until I reached it to make sure I wasn't going too fast. My back wheel was shuddering under braking as if it were way out of true, which didn't give me any confidence in my ability to stop hard, so I rode the front brake most of the way down the hill. Needless to say, the other guys were long gone by the time I got to the bottom. But I didn't crash.

I eventually reached the 100-mile control at Larkins Store, bought more Gatorade and some chocolate milk, drank, used the porta-potty, and headed down Back Road toward the finish. It had been fairly breezy all day, but we were lucky enough to have the wind behind us for this section, which was great. We zoomed down the road at 20+ mph for 17 miles, our fun interrupted only by one idiot in a pickup truck. (All the other drivers I encountered that day were nice.) But he was only honking and yelling, not trying to run me over or throwing stuff at me, so I didn't bother calling the cops on XPS-9561, this time.

Traffic was not too bad on US11 heading toward Middletown. There was a half-shoulder for a while, which I rode on, but then it went away and I had to take the right edge of the highway. The cars were polite and passed safely. Eventually we reached the Civil War reenactment, with police out in force to escort pedestrians across the highway, and traffic actually slowed to the town's 25 mph limit. I didn't quite have the legs left to do 25 myself, but I went around 18. My finishing time was 9 hours 41 minutes, 90 minutes faster than last time I did this brevet. Of course last time I broke a pedal and had to one-foot the last ten miles, so not really a fair comparison.

It was a really good day. I still need to improve my descending, but I say that after every hilly ride. And I need to replace two taillights and true my rear wheel. But I think I climbed pretty well, and I didn't bonk or dehydrate despite skipping lunch, and I didn't completely miss any turns. (Okay, I sort of missed two, but not by enough to credit myself with any bonus mileage.)

Food and drink consumed: About 120 oz. of Gatorade, 16 oz. Coke, 20 oz. chocolate milk, about 16 oz. water, one banana, one Clif Bar, 2 Gu packets. That doesn't seem like nearly enough calories, but I didn't bonk. (I was hungry enough at the finish to eat 3 slices of pizza, so I was probably close.) This is the closest I've come to a liquid diet on a brevet. I've been drinking Gatorade instead of water when possible on long rides lately, to try to sneak in some extra calories even when I forget to eat, and it seems to help.

Bicycles

Comments (0)

Permalink

PyPy gets faster

In a previous post, I mentioned that PyPy was the fastest Python implementation for most of my Project Euler programs, but that it was very slow for a few of them.

This is no longer the case. The jit-generator branch was merged a few days ago, fixing a weakness with code that uses generators. And now PyPy is clearly the fastest Python implementation for this code, with both the most wins and the lowest overall time. Psyco is still pretty close. Both are a bit more than twice as fast as CPython.

I compared PyPy trunk, Unladen Swallow trunk, Jython 2.5.1+, CPython 2.6.6 with Psyco, and CPython 2.7.

PyPy is very strong across the board. Its worst result is on euler94, a Sudoku solver that heavily uses sets and copy.deepcopy.

Psyco still does very well, but it doesn't work on Python 2.7 yet and still doesn't work on amd64, so it feels more and more like a dead end.

Unladen Swallow hasn't had a commit since August. I suspect it's just resting, not dead, but it's falling behind PyPy in performance. Version 2.8 of LLVM has been released, but Unladen still requires version 2.7.

CPython is the baseline. I used 2.7, the latest Python 2. (Some of my Euler programs work in Python 3; some don't.)

Jython is by far the slowest. Its large startup overhead hurts on the easy problems, and the mature HotSpot JIT isn't enough for it to catch up on the harder ones. Jython does have the advantage of being free-threaded, but since this code was originally written for CPython it rarely uses multiple threads and so doesn't really benefit.

Here are the numbers.

script PyPy Unladen Jython Psyco CPython
euler1.py 0.01 0.12 3.65 0.10 0.02
euler2.py 0.10 0.10 3.94 0.10 0.10
euler3.py 0.23 0.91 6.40 0.51 0.40
euler4.py 0.31 0.84 6.49 0.41 0.42
euler5.py 0.12 0.12 5.38 0.12 0.12
euler6.py 0.12 0.11 5.50 0.12 0.11
euler7.py 0.33 0.52 7.29 0.12 0.73
euler8.py 0.13 0.12 4.77 0.11 0.11
euler9.py 0.11 0.32 6.67 0.10 0.21
euler10.py 2.34 6.02 11.81 1.93 12.02
euler11.py 0.10 0.10 4.28 0.10 0.11
euler13.py 0.10 0.10 3.36 0.10 0.10
euler14.py 3.88 2.76 8.46 1.96 3.07
euler15.py 0.11 0.11 4.00 0.10 0.10
euler16.py 0.11 0.12 3.58 0.11 0.13
euler18.py 0.10 0.10 3.45 0.10 0.10
euler19.py 0.13 0.11 3.06 0.12 0.10
euler20.py 0.10 0.10 2.45 0.10 0.10
euler21.py 0.10 0.21 4.16 0.10 0.21
euler22.py 0.10 0.10 3.95 0.10 0.10
euler23.py 3.84 21.33 15.36 4.45 12.03
euler24.py 5.97 5.66 31.25 6.97 5.46
euler25.py 0.71 0.91 3.44 0.91 0.20
euler26.py 9.59 10.84 20.61 9.74 3.54
euler27.py 1.33 7.08 12.35 1.32 11.33
euler28.py 0.11 0.12 4.37 0.12 0.11
euler29.py 0.22 0.12 6.49 0.12 0.22
euler30.py 3.95 4.45 10.72 5.37 4.26
euler32.py 2.83 3.54 9.20 4.95 3.34
euler33.py 0.11 0.12 5.26 0.11 0.10
euler34.py 4.35 12.33 13.86 12.67 16.08
euler35.py 5.59 18.19 30.04 6.47 25.47
euler36.py 1.83 3.24 7.39 2.93 2.44
euler37.py 10.92 12.44 39.17 14.57 17.50
euler38.py 2.24 1.31 9.91 2.14 2.34
euler39.py 0.21 0.42 5.79 0.10 0.41
euler40.py 1.12 1.63 7.30 0.42 1.13
euler41.py 4.25 3.94 20.63 5.46 4.76
euler42.py 0.11 0.21 4.98 0.12 0.11
euler44.py 0.91 9.41 7.48 1.02 3.75
euler45.py 8.01 2.73 12.06 2.73 2.12
euler46.py 0.52 1.13 6.98 0.31 1.14
euler47.py 1.44 2.44 8.03 0.73 3.65
euler48.py 0.10 0.20 5.49 0.21 0.10
euler49.py 0.62 1.74 6.72 0.82 1.02
euler50.py 2.23 52.50 58.27 6.11 56.61
euler52.py 0.61 0.81 5.36 0.82 0.71
euler53.py 0.22 0.42 5.98 0.21 0.42
euler54.py 0.41 0.32 7.59 0.32 0.32
euler55.py 0.82 0.73 6.39 0.52 0.73
euler56.py 0.92 1.22 5.98 1.03 1.43
euler57.py 0.52 0.72 6.09 0.53 0.82
euler58.py 6.67 34.19 44.30 7.60 53.89
euler59.py 11.42 8.19 17.06 12.81 14.35
euler61.py 0.31 0.21 5.38 0.11 0.10
euler62.py 0.42 0.32 6.49 0.53 0.22
euler63.py 0.21 0.21 6.89 0.20 0.11
euler65.py 0.10 0.10 3.85 0.10 0.10
euler66.py 1.92 7.68 23.86 7.18 12.33
euler67.py 0.11 0.12 4.77 0.11 0.12
euler68.py 0.11 0.12 4.16 0.10 0.11
euler69.py 0.11 0.21 4.96 0.11 0.11
euler70.py 0.73 0.61 7.18 1.02 1.22
euler71.py 0.21 1.44 6.48 0.32 0.91
euler72.py 7.23 30.18 37.07 8.42 49.23
euler73.py 9.50 22.54 21.23 3.35 24.59
euler75.py 2.12 2.22 5.56 0.62 2.43
euler77.py 0.41 0.30 4.86 0.20 0.41
euler79.py 0.10 0.10 3.13 0.10 0.10
euler80.py 0.91 0.71 3.94 0.72 0.62
euler81.py 0.10 0.20 3.54 0.10 0.10
euler82.py 0.71 0.30 8.70 0.30 0.20
euler83.py 0.20 0.81 4.04 0.41 0.61
euler84.py 2.65 15.13 23.56 4.66 19.91
euler85.py 7.98 7.99 22.23 10.41 13.85
euler87.py 1.93 1.74 7.28 1.03 1.23
euler89.py 0.11 0.11 5.17 0.11 0.10
euler93.py 3.54 5.56 12.72 6.58 12.33
euler94.py 34.69 29.33 24.57 26.20 20.42
euler97.py 3.64 4.95 10.61 2.63 3.13
euler98.py 0.41 0.61 3.84 0.51 0.61
euler99.py 0.10 0.10 2.12 0.10 0.10
euler100.py 0.10 0.10 2.43 0.10 0.10
euler101.py 0.20 0.10 4.76 0.10 0.10
euler102.py 0.10 0.10 3.44 0.10 0.10
euler103.py 0.10 0.12 2.94 0.10 0.10
euler105.py 0.61 0.41 7.90 0.42 0.41
euler106.py 0.71 0.51 8.82 0.41 0.51
euler107.py 0.31 0.62 7.19 0.31 0.31
euler108.py 3.66 19.55 17.52 8.86 10.62
euler109.py 0.41 1.23 11.61 0.62 2.36
euler111.py 2.64 17.94 25.92 6.19 17.00
euler112.py 4.57 12.55 12.85 12.45 14.97
euler114.py 0.11 0.21 5.17 0.10 0.11
euler115.py 0.31 0.42 5.58 0.21 0.41
euler116.py 0.11 0.12 4.86 0.11 0.12
euler117.py 0.11 0.12 4.76 0.12 0.11
euler119.py 0.10 0.11 3.74 0.10 0.10
euler120.py 0.11 0.11 3.56 0.12 0.11
euler121.py 0.20 0.30 4.87 0.11 0.32
euler123.py 5.59 5.42 24.12 7.08 7.48
euler124.py 1.24 1.84 9.22 0.62 2.77
euler125.py 1.32 1.52 6.28 1.22 1.11
euler126.py 4.06 15.59 13.75 3.85 17.70
euler128.py 9.50 21.56 26.49 12.63 14.76
euler135.py 3.34 5.36 7.48 2.22 3.34
euler142.py 0.20 0.71 5.57 0.22 0.51
euler143.py 0.11 0.11 4.46 0.11 0.10
euler157.py 0.12 0.12 3.97 0.11 0.12
euler162.py 0.10 0.10 3.44 0.10 0.10
euler171.py 0.10 0.10 3.74 0.11 0.11
euler173.py 0.93 1.12 6.17 0.61 1.53
euler174.py 4.45 4.16 8.08 3.74 3.23
euler181.py 0.10 0.10 3.85 0.11 0.10
euler190.py 0.10 0.10 2.43 0.10 0.10
euler193.py 0.10 0.10 2.12 0.10 0.10
euler202.py 0.10 0.10 2.74 0.10 0.10
euler205.py 0.92 0.72 10.16 1.03 0.72
euler207.py 0.21 0.83 6.29 0.32 1.43
euler222.py 0.10 0.10 3.44 0.10 0.10
euler233.py 0.10 0.10 3.35 0.10 0.10
euler234.py 4.46 9.00 19.12 7.71 7.48
euler235.py 0.20 0.20 5.47 0.32 0.22
euler240.py 14.57 14.52 48.67 12.14 22.65
total 250.37 509.72 1211.07 282.73 569.37
wins 68 33 0 59 51

Programming
Python

Comments (2)

Permalink

Civil War Tour 200km Ride Report

I was moderately excited to ride the DC Randonneurs Civil War Tour for a second time. I remembered that the ride went over Mar-Lu Ridge, had lots of information controls, and that Antietam was a great place to ride while Gettysburg was a death trap full of inattentive tourist drivers. I forgot just how hilly it was.

Woke up bright and early at 5 a.m. Didn't eat breakfast at home. Got to the start at Perkins in Frederick around 6:30, leaving plenty of time before the 7:00 start. Didn't eat breakfast at Perkins either. It was 47 degrees, quite chilly for September, but I brought arm and knee warmers so I felt ready for it. Said hi to a few people, then went outside and checked out a few unfamiliar bikes.

My left knee warmer stayed in place perfectly. My right knee warmer started falling down before I even started pedalling, and kept falling down until it got warm enough to take it off. I hate knee warmers. Should have just worn some tights over my shorts — my bag is plenty big enough to hold them.

We started rolling at 7, and the people who hadn't dressed for the cold started shivering. I was fine, except for the slipping knee warmer. The first info control was only 0.3 miles from the start, and was marked as a control on the brevet card but only as a point of interest on the cue sheet. I remembered it from last year, and stopped to write down a date from the sign. Most of the riders kept going. Luckily this control wasn't really needed to establish the brevet distance, so nobody got disqualified. But it did mean that I lost the group right away. (It took me a while to find the right date on the sign, and then my pen wouldn't write and I had to dig out a golf pencil.) Not a big deal; I was going to lose the fast riders on Mar-Lu Ridge anyway.

Realizing I hadn't had breakfast, I ate a Clif Bar then started cranking. Just missed a green light crossing Route 15 and got to wait a couple of minutes for the next one before starting up Mar-Lu at mile 12. My bike shifted great, but I climbed slowly. About halfway up, Roger blew by me on his vintage Trek. Bill was waiting at the top to take pictures. I was pretty warm from the climb, but I knew the descent would be cold so I kept all my clothes on. Then I bombed about halfway down the descent, until I saw a curve and got scared and slowed down to about 25. Yep, I've been riding brevets for over three years now and I'm still a wuss. But I still have all my teeth.

Rode through Burkittsville, and caught a couple of riders. Any hubris was soon checked when Chip and another rider who had started late caught and passed me. Went up a big hill (didn't remember it being so big), then down the nasty bumpy shady descent of Townsend Road. On the way down, a truck decided to pass me. And then I saw a pothole, but couldn't swerve around it because the truck was right next to me. I tried to unweight over the bump, but didn't do a very good job, and my front tire hit pretty hard. At first I thought I'd been lucky enough to avoid a flat, but by the bottom of the hill my front tire was feeling soft. I pulled over to fix it. About a dozen riders passed me while I did so, way more than I thought were behind me. Several asked if I needed help, but I didn't. It was a simple tube swap and I was moving again in about 15 minutes.

The first real control was at Battleview Market in Sharpsburg. I bought a big bag of Jalapeno Combos. Volunteer Ed offered me a jug of free water, which made me realize I'd hardly had anything at all to drink. (Too cold to be thirsty.) So I chugged half a bottle of Gatorade and refilled it with water, ate a few Combos, and took off after some other riders toward Antietam Battlefield.

Antietam is a very nice place to ride. Pretty fields, fairly flat, nice roads, not many cars full of tourists. There was an information control somewhere. I wasn't sure where so I just kept riding until I saw a big group of cyclists reading plaques. Then I wrote down the solder's name and continued toward the not-very-secret secret control, where Bill and Chuck and Crista stamped our cards and wrote down our names. One road in the battlefield had been recently covered with pea gravel and wasn't very fun to ride on, but nobody fell. The rest were fine, and we were heading out of the park and up MD34.

I was in a group of six or seven riders for a while on 34. Then a couple broke off the front, and a couple fell off the back, and someone stopped to tinkle, and eventually I was riding alone. I was making pretty good speed on the flat section, but at mile 52 we started the long easy climb up the shoulder of Raven Rock Road, and everyone passed me. Everyone. I resisted the urge to speed up and ride with the cool kids, and just kept on chugging at 6 mph. Almost an hour later (literally) I was done. A few miles later the cue sheet warned of traffic on PA16. Worse, there was a paving crew. Meaning I could wait for a while for them to let the traffic on our side go, and then get passed by a huge line of annoyed (at me, even though the paving was actually causing their delay) vehicles in a narrow lane. Instead, I started walking my bike down the shoulder. Then when the line of oncoming traffic stopped coming, I took the lane and pedalled as fast as I could, hoping I'd make it to the end of the paving zone before the cars coming from behind could catch me. I made it, and it was glorious having an entire freshly paved highway to myself for a couple of miles.

There was a one-lane covered bridge at mile 67 with a one-car-at-a-time traffic signal. It would not change for my bike (weak sensor?). And no cars would pull up behind me. Three cars (including a police car) approached the other side and all three took the green even though I was there first. Finally it was clear to safely run the red. Fix your sensors, Penndot or local equivalent thereof. I'm happy to obey the laws but you need to meet me halfway.

Entered Gettysburg around mile 76. Went through the park, past the distracted tourist drivers, past Ed and Mary and Bill taking pictures, stopped at the US 15 crossing forever waiting for a convoy of WW2 vehicles (second year in a row our brevet coincided with their wrong-war reenactment), came out of the park into the town, and hit the control at the 7-11. It had warmed up by then and I was a bit low on water, so I bought a bunch of Gatorade (2 32-oz. bottles for $3, score). Drank all that didn't fit in my water bottles, ate some Gu and some Combos, and left the control pretty quickly. I think I controlled pretty well on this ride.

The route went back into the battlefield for some more tourist dodging, some more pretty scenery, and some more info controls. Rode with Chris and Bennett for a while, then alone in front of them, then Bennett passed me, then Chris passed me. I wasn't very tired but I was slowing down a bit. And the constant clicking of my slightly loose bottom bracket within its titanium shell was driving me nuts. (Maile and Bennett both commented on it, so it wasn't just me noticing, either. I've tried and failed to fix it myself, twice, so I'm planning to take the bike into the shop this week.)

There was a non-control at a High's at mile 108. I was low on water so I stopped to buy some, and also bought a turkey wrap since I hadn't had any real food all day. While I was there Maile on her new custom bike and Gary on his purple IF and Bernd and first-time brevet rider Erik rolled up. I hung around waiting for them for a few minutes and then rolled out in a group of 5. We nicely pacelined for the first few miles on a flat shoulder, with Maile pulling a train that included three guys twice her size. Then we hit some hills and Maile and Bernd were off the front while we three larger guys were falling off the back. Then the turkey wrap's miracle energy boost hit and I suddenly had a lot of energy and chased the climbers down. But someone told me that Erik was new and didn't have a cue sheet, at which point I went to the back of the group to make sure he didn't get dropped and lost.

I stayed with Erik and Gary, with Maile and Bernd within sight, until about five miles from the finish when my rear tire started feeling soft. I don't remember hitting anything, and I didn't find anything poking into the tube, but there was a gravel section around mile 98 and 23mm tires plus 200+ pound rider plus gravel always equals a possible flat. I pumped the tire back up and didn't hear a fast hiss, so I just rode the last few miles at a conservative pace, and finished seven minutes behind the rest of the group.

I wasn't very hungry for pizza because I'd just had the turkey wrap, so I just guzzled some water at the finish and chatted for a few minutes then headed home. My time was 10 hours 11 minutes, or 33 minutes slower than last year. But I can blame that on the two flats and the time walking along the shoulder of the paving detour of PA 16. I'm probably climbing a bit slower than last year, but not much.

Great weather, nice course, great volunteers, and no really bad drivers. And I set a new personal record for fewest bonus miles: 0.4. (I missed a turn but realized it right away.) A very good day.

Bicycles

Comments (0)

Permalink