July, 2006

Posts
  • Eric Gunnerson's Compendium

    Seven deadly sins of programming - Sin #2

    • 17 Comments

    One of the guys on my wing during my freshman year of college was a trust-fund kid. His great-grandfather had done well in the market, and had left some money for each the great-grandkids.

    Michael wasn't paying for his schooling, nor was he paying for his cars, his clothes, his nice stereo, or his ski vacations. But that was okay with us, because he *was* paying for pizza, and he *was* paying for beer. Or his trust fund was.

    Everything was fine until spring came around, and Michael got some bad news. His trust fund had been set up to carry him through 4 years of school, but because he spent money so fast, he had burned through all of it in less than two years. He was forced to get a job at the local grocery store to finish the year out, but couldn't afford tuition and had to leave school and find a job to support himself.

    ========

    It typically shows up in chapter two or three of the programming book. There's a section titled something like, "What is an object?", which speaks in flowing terms about the wonderful work of object-oriented development, and uses one of the following examples:

    • Geometric shapes
    • Animals
    • Musical instruments
    • Cephalopods (rare)

    In this section, we find out that a square is an example of a polygon, a cheetah is a cat and also a mammal, and so on.

    All of this to introduce is to the concept of "is-a".

    We then see an example where we can ask any polygon how much area it covers, tell any mammal to walk, and tell any cat to ignore us while we're talking to it, all through the wonders of inheritance and virtual methods.

    Good taste and a firm grasp of the relative usefullness of this concept would dictate spending 10 or 20 pages explaining these concepts, but most texts significantly exceed that, and most programming assignments spend a fair bit of time on that as well. Kindof like how linked lists rule your life for a month or so.

    It's therefore not surprising that many younger developers think that inheritance is a feature that you should, like, "use" when you write software.

    There are a few problems with this.

    The first is that "is-a" is, in my experience, a pretty rare relationship between objects. More common is the "looks the same on one dimension but has different behavior across another dimension".

    Good luck implementing this:

    public class Monotreme: Mammal
    {
        public override GiveBirth()
        {
            // add appropriate implementation here
        }
    }

    That's the sort of thing that tends to be non-obvious when you first create an object, but annoying obvious when you've bought into the whole inheritance mindset.

    That's not to say that inheritance isn't useful. It's just to say that you should understand that a MemoryStream isn't really a Stream, at least in the true "is-a" sense, and be prepared to deal with it.

    The second problem is more philosophical and aesthetic. I recently wrote code like this:

    class ClimbList: List<Climb>
    {

    }

    Which seems like a perfectly reasonable thing to do, at least on the surface.

    But the surface - or at least the surface area - is a problem. List<T> is a pretty extensive class, and when I defined ClimbList, I was saying that ClimbList does the proper thing when any of the List<T> methods or properties are called.

    I'm pretty sure that's not true. Or at least, I'm not at all sure that it *is* true (I have no tests to support such a belief), but users of ClimbList don't have any way of knowing that the only methods I'm currently using are Add() and the indexer. Intellisense brings up all of them when I go to call one of the methods I wrote.

    Which brings us in a long and roundabout way to our penultimate sin:

    Sin #2 - Overuse of Inheritance

    So, what should you use if you don't use inheritance (and I am advocating that you approach it carefully and thoughtfully - it's a similar decision to adding a virtual method)?

    Composition. Make the object a field inside of your object, and then write the forwarders that you need (it's usually not more than one or two).

    And, if you really need inheritance in your design, add it carefully and thoughtfully.

  • Eric Gunnerson's Compendium

    Carmichael Training Systems Review

    • 13 Comments

    Carmichael Training Systems "Classic" Review

    www.trainright.com

    This spring, I decided to pony up some money for a real training plan, rather than the "just ride" approach that I've used in the past.

    I looked at a few options. If you want to interact with a real human, it seems that the going rate is around $100/month, either from Carmichael, or CycleU. (If you have other coaches to add, please reply in the comments). And, of course, you can spend more than that if you want.

    That seemed a bit excessive for my goals (which aren't race-related), so I decided to opt for the TrainRight "Classic" package for $40/month, which gets you access to their online training schedule ("dynamically built according to your current fitness and goal event"). You also get access to their forums where you can ask specific questions, but you don't have somebody "assigned" to you personalizing your schedule.

    I'm going to break this review into three parts (more or less):

    1. Some training theory
    2. How the system works
    3. How well does it work
    4. Limitations of training without a coach.
    5. Limitations of the TrainRight package
    6. Summary

    Some training theory

    A very short intro into training theory. I won't do it justice, but you can get the basic idea. If you want more, get The Ultimate Ride and/or The Cyclist's Training Bible.

    Most endurance athletes train using periodicalization, which is a short way of saying, "weeks of increasing intensity, followed by rest weeks". A typical approach might spend 3 weeks ramping up the intensity, followed by a week at lower intensity (often with a fitness test at the end), and then another cycle.

    Overlaid on top of that is a series of different periods, which Carmichael names "Foundation", "Endurance", "Specialization", and "Transition" (I think those are in the right order). Foundation is all about aerobic energy, Endurance also focuses on aerobic but adds some higher intensity work, and specialization adds lots of high intensity.

    Here's the way I like to think of it:

    Aerobic training gives you the baseline, and sets how hard you can work in a steady state. High intensity training gives you the ability to produce more power for short periods - like climbing hills, working at the front of a paceline, etc.

    Aerobic by itself means you can ride a long distance, but you can't ride faster. High intensity by itself lets you produce that high power, but if you don't back it up with good aerobic capacity, you can't hit as high of a peak, nor can you deal with as many peaks before you blow up.

    If you graphed your power for a ride, there are flat parts and peaky parts. Aerobic training pushes up the overall average effort, and high intensity pushes the peaks higher and lets you have more of them.

    And now that I've covered 25 pages of theory in 3 paragraphs, onto the TrainRight system.

    How the system works

    TrainRight Classic bases its scheduling on two things - an interview that you fill out, and a field test.

    The interview steps through a bunch of questions - when is your goal event, how many days do you want to train each week, how many hours, that sort of thing.

    The field test is used to gauge your fitness level and, more importantly, to figure out the HR ranges for different exercises. You do need a HR monitor, and it's easiest of you have one that has a computer interface. Cadence is also useful. I use the Polar 720i, which stores all the data and lets you download it to your laptop.

    For the field test, you pre-fuel, do a good warmup (with a few high-intensity intervals), and then ride your heart out (figuratively and sometimes literally) for 3 miles without stopping. You take 10 minutes to recover, and then you do it again. And then you're pretty darn tired. My average HR for my first field test was something like 158 BPM, while my max is somewhere in the low 170s.

    From that, you can get an average HR during that time. That HR is related to your lactate threshold (LT), which is the point where your body no longer is able to buffer (ie deal with) the lactate acid accumulating from your aerobic fuel system. That is roughly the point where the feeling changes from "that hurts" to "I have to stop". (note that this is before "has anybody seen my lung?")

    From the average and your age, the TrainRight system generates a set of heart rate ranges, and your online calendar shows not only the exercises you're supposed to do, but the heart rate ranges you need to target during those exercises.

    Initially, you'll get lots of simple miles. In the endurance period, a typical workout for me would be 1.5 to 2 hours at 80-140 BPM. The goal is to spend 95% of the ride in that range.

    Staying that slow will be difficult if you're used to riding hard or you ride in a group, and I spent a fair amount of time plodding up hills at the back of the group so I wouldn't blow out of the range.

    In addition to that work, you may get some muscle tension (low cadence/strength) drills or fast pedal (high cadence) drills as part of the workout.  This mix changes as the season goes on, adding tempo rides (20-30 minutes at a higher heart rate), and a few different kinds of intervals. Hill intervals are especially fun in a group. You get to attack, ride off the front, let people catch you, attack, and repeat.

    Periodically, you will get additional field tests scheduled. This lets you track your progress, set new HR ranges as you train (it's common for people to push their average field test heart rate up as they get more trained), and suffer every month or so. That new data feeds into your revised schedule, and you also get an "end of period" review, which asks whether you want more/less time for your workouts, different days, easier/harder workouts, etc.

    How well does it work?

    Count me as a convert to organized periodicalized training. It's really hard to ride that easy at the beginning of the period, but my aerobic capacity increased considerably. I went from 140 BPM making me fairly out of breath to being able to talk comfortably at that level.

    And when I got into the speed work/hill work, I definitely am faster on climbs (note the all important "er" in that...), and can deal with the pacelines we sometimes do at the end of our workouts. And the hills seem overall less taxing. On flying wheels this year, I got to the Fall City - Issaquah Hill - which is a 400 foot climb of gradients up to around 13% (ish) that comes at about 80 miles into the ride - and found that halfway up the hill, my legs still felt fine.

    Limitations of training without a coach...

    TrainRight says the classic program is "optimal for active individuals, entry-level event participants, and first-time competitors".  Which is essentially true, though they don't give you the details of their approach, and it turns out that the details aren't very well handled. I'll talk about that more in the next section.

    But the big problem is that without a coach, it's really hard to accurately set your training intensity.

    Or, at least, I didn't have a good idea on how to set my intensity - it could be that they've just done a poor job at telling people what to do.

    For example, at the end of my first period, during the questionaire, it asks me if I want to adjust the intensity up or down.

    How should I know? I know that I'm not working that hard, but I also know that I'm not supposed to be working that hard right now. 

    That comes up over and over. I bumped up my intensity later, had a couple of hard weeks, and was a bit run-down at the end of them. Was that okay, or was I working too hard? What sort of performance could I expect at my training level? Was I putting in enough training time to realistically complete my goal event?

    The web interface and directions are silent on that, as is the coaches forum, for the most part. And I think that's a big problem. Part of it is inherent in not having a coach, and part is due to their implementation.

    The other problem is that you don't get the motivation/interaction/richness that you would get from having a real coach, but I think that's inherent in choosing that package I did. If you want that, you should expect to pay for it.

    Limitations of the TrainRight Classic Package...

    So, those are the issues with web-based instruction (perhaps "non-personal" instruction is a better term...) in general, and they are significant.

    In this section, I'll talk about the limitations on the TrainRight implementation of web-based training, compared to my vision of what the ultimate web-based system could do.

    The issues are many and varied, and putting on my "PM design hat", it's clear that they haven't spent much time looking at how people actually use the system and using that data to make it look better. Here's a list of things that I've come across:

    • No cookie support, so you have to login every time. My data just isn't that important. Give me the option to not have to do this.
    • Scheduling is buggy. My schedule consistently shows 5 workouts the weeks that I have a field test instead of the normal 3. And lots of others have similar issues.
    • "Ask in the forums" is too often the answer. This I find especially annoying because they're costing themselves time and effort as well. If I'm reading the description for PowerIntervals, why isn't there a link to a FAQ? That sort of cross-linking is pretty much absent, and it isn't an expensive thing to do.
    • Popup window sizes are miniscule. Why do you put information in a 400 x 200 window and then make me scroll it. This is just stupid UI.
    • I have to transfer my workout information by hand every time, instead of grabbing it from my polar software or straight from my HR monitor. And every time, I have to tell it that my info is in miles, not meters, and it always asks for information on my power output despite the fact that I don't own a power meter, and even if I did, the classic program doesn't support it.
    • No meta-period schedule information. How do the phases lay out over the year?
    • No future schedule until the field test is done. I understand that the field test will change the details, but it's Friday night. I have a field test in the morning, and I'm trying to play my Tuesday and Thursday rides. I may do them with my group, or I may do them by myself if the workouts don't fit in well. But the UI won't show me, and god forbid I have to postpone the field test if the weather's bad - I'll get no workouts at all.
    • There's no way for me to add multiple events. If you plan to do a warm-up event - a century before your double, or a metric before your century - you'll need to know that you need to taper, do the taper, and then work around your schedule afterwards.
      You can say that you did different workouts or skipped them, but I couldn't see any change in the schedule afterwards.
    • You don't take vacations.
    • You don't do group rides. A system could shuffle around the activities knowing that I do group rides during the week and typically ride by myself on weekends, but this one doesn't. I can, however, do this manually.
    • Don't expect a really in-depth response to a question, especially if it is a fairly individual one.

    The problem comes down to this.

    The business model for CTS is selling coaching services to athletes, and their corporate activities are arrayed around that. The Classic package is primarily useful as an upsell to their direct coaching programs, and having a great classic experience may actually be against their business goals.

    Summary

    Before I finish off, I'd like to note one more thing.

    CTS has a promotional agreement with PowerBar. Nothing wrong with that, but their association often goes beyond informational to marketing. Most of the coach responses in the forums that mention nutrition (though not all) only talk about PowerBar products. I find this especially annoying when dealing with sport drinks. There's lots of anecdotal data that says that different people have different experiences with different drinks - one drink may work great for one athlete and cause stomach upset with another athlete. To recommend only a single drink without noting that fact does a real disservice to their athletes.

    The advice from forum members in this area is markedly better than that of the CTS coaches, and I really think they should re-examine their policy in this area.

    So, on to the summary. I find myself conflicted at this point.

    On the one hand, the training definitely worked for me. On the other hand, their web-based system isn't great, and has some serious limitations.

    My recommendations:

    • If you would class yourself as a non-athlete who's getting into cycling and you want to do your first century, something like the classic package would be a good fit for you. You will get well-defined workouts and you are very likely to complete your target event.
    • If you're somebody who has a few season's of cycling under your belt, you should be aware of the limitations of the TrainRight package, and consider other options (which I'll talk about below).
    • If you are somebody getting into racing, I think the limitations of the classic package are too severe (though there are some racers that use it).

    All in all, I'm happy I spent the money, but I think I've learned what I can, and don't think I'll continue next year. I'm considering a couple of options:

    1. Actually spending the money for a coach. Cycling is a hobby, and I'm probably not going to pony up that much money given what my goals are (or the lack of real goals). 
    2. Spending some money getting a plan designed, but then running it myself. CycleU will provide consulation on a per-hour basis.
    3. Buying PC Coach. This looks interesting - the software seems nicer than what CTS does, and, more importantly, that's how the company makes their business, so they likely have more focus on making it better.

    I think I'm leaning towards the third one, but haven't decided yet.

    [Update]

    I should have noted that any of the Carmichael training requires a 6 month committment. They are nice enough to refund 25% of that money if you cancel ahead of time, because of the large investment they had to make to render web pages for you.

  • Eric Gunnerson's Compendium

    Seven Deadly Sins of Programming - #3

    • 14 Comments

    I'm sure this is going to be a contentious one. I don't have a good story about this one, so I'm just going to go right to the sin.

    Sin #3 - Overuse of Virtual

    There are two schools of thought when it comes to virtual. They are:

    1. Always use virtual
    2. Only use virtual when absolutely necessary

    The first group's argument is that original designer of a class is a poor judge of how the class might ultimately be used. Making all methods virtual allows the users of the class to easily extend/modify the behavior. Non-virtual methods make more work for the user.

    (or that's the argument I've heard - please comment if there's something I missed...)

    The argument is true. Virtual does make extensibility easier. The problem with virtual is robustness.

    The original designer of a class has a good idea for what the class is about, and the implementation is designed (either explicitly through the tests written with TDD, or more implicitly through the mind of the designer) to support that idea (or contract, if you prefer).

    In other words, the designer has an explicit idea about what extension points he wants to support in the class. If virtual is only on those points, then the designer has (or should have) done sufficient testing on those points, and it's pretty likely that users who extend through those points get the behavior they want. And since only a few methods are virtual, the fact that a specific method is virtual is an important clue to the user that that method *is* an expected extension point.

    If virtual is on every method, the user can extend in a lot of ways, but it's very unlikely that the designer thought of all those ways - or all combinations of those ways - which means that such a user extension is going into uncharted territory. Maybe it doesn't work when you try it. Maybe it works now, but breaks with the first update when the object behavior changes.

    I prefer the "you can only do these 2 things, but I promise that they work" classes to the "you can do any of these 12 things, but they may or may not work" classes.

  • Eric Gunnerson's Compendium

    STP 2006 - one day

    • 18 Comments

    T- 2.5 days:

    It's the Wednesday before STP. STP is the biggest cycling event in the Seattle area, in which 9000 riders will leave from Seattle, hoping to reach Portland under their own power.

    Most will ride 100-125 miles on Saturday, and then finish the remainder of the 204.5 mile route on Sunday. About 20% will leave slightly before sunrise on Saturday, hoping to reach Portland before dark. They plan to spend 10, 12, or even 15 hours in the saddle.

    They are, by any reasonable measure, more than a little disturbed.

    I am one of those riders.

    Of course, cycling is a pasttime of relative insanity.

    The casual rider feels sane because he knows "crazy people" who ride 50 miles at a time. The 50-mile-rider feels sane because he knows "crazy people" who ride single day double centuries.

    A good indication of the relative insanity of the STP one-day riders is the universal reaction from riders who are thinking of doing it. Their reaction isn't, "wow, that's a long day", or "I wonder if I can make it?". Nearly universally, their reaction is, "4:45AM starting time? That's crazy..."

    I feel sane because of these people. And they feel sane because of these people, who are crazy enough that they don't care about their sanity. Which is good, because they are at the top of the pyramid.

    T-1.5 days:

    Tonight I spent some time getting my stuff together. Here is my list (well, lists, actually - there's one for my backpack (going on a truck, a second (carried by me) , and one of things to do before I leave.

    Bike:

    • Helmet (Giro Pneumo, red/white)
    • Gloves (Pearl Izumi, very gamey)
    • Sunglasses (Bolle)
    • Sunscreen (Coppertone sport 30)
    • Headband (Voler)
    • Shoes (Nike)
    • Camelback (70 oz)
    • 10x Accelerade
    • 4 Clif bars (Chocolate brownie, the only worthwhile flavor)
    • 4 Clif bloks ("Cliff" and "Block" are two words that we can't spell...)(Cran-Raspberry)
    • Heart Rate Monitor (Polar 720i)
    • Jerky x 2 (1100 mg sodium per serving)
    • Phone (Nokia)
    • Extra tube (Continenta)
    • Jersey (Cannondale) with number already on it. Racers crumple theirs so that they don't rustle in the wind. You can do this as well, but note that if you wear a camelback over the top, it sort of ruins the effect.

    Bag:

    To do:

    • Parking pass in truck
    • Bike with number in truck. STP gives you a number card (approximately 85" x 32") to go on the front of your bike so that the event photographer can identify you. They also give you a small adhesive label with the number to put on your helmet. Some people put the number tag inside the front of their frame, which identifies the bike but not the riders. The photo proofs aren't big enough to tell what I look like, so I forgo the card and put the adhesive label on the bike.

    T- 6 hours, 45 minutes:

    This happens at 8PM on Friday night, where I head to bed. I manage to get some quasi-sleep between worrying whether I'll hear my alarm.

    T-0:

    Federal regulations prevent my from actually telling you when I got up, but you can calculate it from the previous entry. I get up, eat a clif bar, have a glass of accelerade (you really need the sugar when you start off early), put in my contacts, and then put on my clothes.

    Which brings us to a delicate topic. Chafing is an issue for some riders on long-distance riders. To get around it, you use what is known as "Chamois creme" on the pad inside your shorts (and on the complementary parts of your anatomy) to address the issue. The one I use is known as "Chamois Butt'r" (yes, those cyclists have such a sense of humor). Other cyclists use Bag Balm (Made in Vermont since 1899, for udder care. If you're childless, you undoubtably find this pretty weird. If you're a parent who used it on diaper rash, you're nodding your head). Some of the pros use a creme from Assos, though I avoid it because a) it has menthol in it, which seems like the wrong choice for such an application, and 2) they don't use cyclists in their ads.

    That task completed, I pull on my underarmour base layer (very nice in the heat), and my jersey.

    I then put on sunscreen, which is arguably one of the strangest things to do in the middle of the night.

    I then leave to pick up F. at his house in Redmond. We get there, load his bike, and I realize I left both my water bottles in the fridge. Back to my house, pick up the bottles, and fly over to UW to the start. Meet up with S., who was also going to ride with us. Drop our bags in the portland van (there are other vans stopping at other places for the two-day riders).

    Wait at the start for them to re-open the start (they have to start in waves), and roll through the gate at 5:00 AM.

    (All times are ride times, not counting stops)

    Mile 1

    There's a steady "tick, tick, tick" as I pedal. I look down, and see that my cadence sensor is hitting my crank. Reach down and move it, but it starts ticking again. Not really a recommended maneuver when you're riding in a group. Finally stop, and realize that the tabs on the bottom of my carbon fiber bottle cage have broken, and the bottle is sitting on the sensor. Sensor finally gets caught and bent under. No more tick, no more cadence, but I can do without it.

    Mile 24: 1:20

    We stop at the REI headquarters stop for a nature break. I go to the water station. Fill up the bottle halfway, add in my accelerade powder, shake, top off with water, put on lid. Taste.

    Amazing.

    REI is on of the pre-eminent outdoor retailers in the world. Cascade is one of the best cycling clubs around. But neither of them know that:

    1. Garden hoses - especially new garden hoses - have lots of plasticizers in them. Not ones that you should be drinking.
    2. You can get hoses that are drinking water safe. They aren't even that expensive.

    If they did, I wouldn't be drinking a bottle filled with parking lot runoff.

    Mile 43.3: 2:24

    "The Hill"

    Okay, so it's a bit steep, but if my polar data is right, it's only a little over 200 feet. Not really a hill in my book. Wouldn't be in the top 3 on flying wheels.

    Mile 60?

    So far, we've spent most of your time in pacelines. It's hard not to with this many riders - you will catch up with people and join their line, or if not, you'll be at the front of another group.

    But the problem with the these pacelines is that most of the people aren't experienced, so the pace wavers up and back, which makes it hard to ride in.

    But about this time, we hook up with an organized group, all wearing Vitamin Water jerseys. There are about 6 of them, they rotate every 2 minutes, and - most importantly - they pull a very steady pace. We ride with them for about 2 hours. It is wonderful.

    Mile 100: 5:27

    The first century ends in Centralia. Many two-day riders stop here. They have a food stop for the one-day riders, but inexplicably all they have is fruit. For somebody who has been eating clif bars, clif bloks, and accelerade, fruit is not high on my list. I have some jerky, and after about 20 minutes, we set out on our second century.

    I should note here that 5:27 is the fastest century I've done.

    Mile 113.4: 6:09

    We reach Napavine, WA. Not really noteworthy, except for the fact that they have closed one of their streets for a festival. The street we'd like to ride on. There's nothing going on on the street, but the officials make us ride very slow for 1/2 mile, and then walk our bikes for 1/8 mile. Nobody knows why, but it slows us down a bunch. It takes us 9 minutes to go 1 mile.

    While waiting for a train, I notice two things:

    1. My head hurts
    2. My stomach doesn't feel good
    3. I don't feel like eating anything sweet.

    This bad. If I don't eat enough, I'll run out of carbs and bonk. But at this point, there's not much I can do about it, so we ride on.

    I'm having trouble staying in the pacelines. Like driving in rush hour, small changes in speed up front amplify towards the back, and you spend time alternatively riding hard to close a gap and coasting (or feathering your brakes). Doing that is making me feel worse.

    I send another text message to my wife. Usually I just send her the mileage, but this time I tell her that I'm looking for the grupetto. (Sorry about the translated page, but I can't find a good page in English.)

    Mile 128: 7:03

    Another stop. Feeling about the same (not good). I'm still not able to drink much accelerade, as it makes my stomach worse. I try to drink more water, which I can tolerate in small quantities.

    Mile 140: 7:45

    This stop is at Castle Rock High School. I pull off to the side and lay down in the shade of a tree. F and S are concerned. I'm *concerned*, because I still have at least 4 hours of riding left.

    After a few minutes, I wander over to the school to experience the wonder that is indoor plumbing, and to buy a peanut butter sandwich and some cold water. This tastes pretty good. On the way back to the shade I pass more than one rider sleeping on the lawn.

    When we start riding again, I'm riding behind my friends at my own pace. I look back at one point, and there are two riders drafting behind me. They pull in front, I slide behind, and we pull up to F and S, and now our group is 5.

    And I feel sick again.

    Turns out that as long as I set the pace, I don't feel as bad. "Put the sick guy at the front" isn't the most logical approach, but it works, and I ride either at the front of our group or behind our group.

    My legs feel fine. If I keep spinning at around 100 RPM and keep my HR between 110 and 120 (maybe 140 on climbs), things go pretty well. Thank god for the tailwind.

    Mile 152.8: 8:27

    We take the Lewis & Clark bridge (named after Lewis & Clark, a college in Portland) across the Columbia. I tell S that I may starting singing "Roll on Columbia" on the crossing, but the climb is fairly steep, and while I can remember "Your power is turning our darkness to dawn, so roll on, Columbia, roll on", I can't remember any of the seven verses.

    On the way down to the Oregon side, the rider in front of my brakes suddenly before an expansion joint, I shout "slowing", hit the brakes, and hope that the people behind me don't hit me. That's not the kind of thing you want to do after 8 1/2 hours on a bike, but everybody else is paying attention, and we get into Oregon fine.

    And we still have 50 miles left to ride. Bastards.

     I ride on at a steady pace. S and F either lag behind a bit, or ride up in front.

    Somewhere around mile 170, F disappears ahead of me. That's fine - I know that I'm holding both of them up, and while I'm having no fun at all, I'm sure that I'll finish.

    Mile 189: 10:43

    I have half a bagel and some pretzels, and dunk my head in water. That helps

    Soon after the last stop at 189, S pulls off as well. I ride on, still feeling the same, but thanks to my training, my legs still feel fine. If my head and stomach were okay, this wouldn't be that bad.

    Mile 204.5: 11:46

    The finish line celebration. As you pull through on the path, people cheer for you, and you get a "one-day finisher" patch.

    I run into F and his mother as I wander around. I go to the adjacent hotel, grab my backpack, and ride to my hotel.

    I check in, go to my room (two floor up is hard to climb), and collapse on the bed. My plan had been to take a shower and go out for some food, but it's all I can do to call my wife, take a shower, take out my contacts, and crawl into bed. My head hurts, and my stomach hurts. I drink as much water as I can (not much) and try to sleep.

    I wake up at 12:30, still feeling crappy, drink a whole bottle of water, and then finally get some quality sleep. But I'm awake again at 7AM, miraculously feeling decent, and eat breakfast.

    And then I ride 3 miles to the train station (on a very tender butt), and ride Amtrak back to Seattle.

    What worked:

    • My training was good. My legs never ran out of steam, and I was always fine aerobically.
    • S and F were good companions
    • The support was pretty good, with the exception of the aforementioned parking lot runoff
    • Riding the train back was a nice way to get back.

    What didn't work very well:

    • I tried to get used to getting up early by getting up at 5 that week. That made me more tired than I thought.
    • In retrospect, I think the headache and stomach upset was sinus/allergy related. I don't usually have problems in this area, but I think I had a touch of it at Flying Wheels. If I'd taken the right drugs, I would have done better. Southwestern Washington is a lot drier and dustier than Puget Sound.
    • I should have grabbed something real to eat at Centralia.
    • I should have planned for food fatigue. You can only eat the same food for so long.
    • Start pouring water on to cool off earlier.
    • If you stop drinking your energy drink, drink more water. Lots more water.

    Food:

    I'm surprised how short this list is:

    • 5 bottles accelerade
    • 2 clif bars
    • 2 bags clif bloks
    • 1/2 bagel
    • 1 peanut butter sandwich
    • One chicken-vegetable wrap thingy
    • 1/2 banana
    • 1/2 bag pretzels

    Misc:

    • 204.5 miles, 11:46, 17.4 MPH. Not bad for feeling crappy and having that walk in Napavine. Make it 11:40 @ 17.5 MPH without the Napawine slowdown.
    • 4422 calories (Polar estimate)
    • 86930 heartbeats
    • 123 BPM average heart rate
    • 3620 feet elevation gain.

    Would I do it again? Well, it was absolutely the worst day I've ever spent on a bicycle, but if I didn't feel so sick, I could see doing it again.

  • Eric Gunnerson's Compendium

    Windows DVD Maker - Hello, Projects...

    • 8 Comments

    During our initial implementation of DVD Maker, one of our mantras was "We are not an authoring tool". Our target is people who currently aren't making DVDs, not those that have already mastered the intricacies of creating a DVD with the very extensive authoring packages already available.

    That meant we kept things very simple. This was usually a good thing, but in one case, we made things too simple.

    There was no easy way for users to save their work. If I created a nice DVD of a family vacation, and burned six copies, when Aunt Edna (the one from Florida, not the one from Maine with the fondness for martinis...) asked for an extra copy, I'd have to try to remember all the settings and walk through them again.

    Nor could base my DVD of the May 17th soccer game on the settings I used for the May 10th soccer game.

    We got a fair amount of feedback on this, and therefore decided to add real project files to DVD Maker.

    Things that have changed:

    1. There is now a File menu at the left end of the taskbar, to the left of "Add Items". On it, you'll find the usual suspects: New, Open, Save, Save As, and a four-item list of recent projects.

      Having a menu on a taskbar makes the UI a bit strange, but it was the best approach that we could come up with, and it works nicely.

      That's on the "add pictures and video..." page. On the "Ready to burn disc" page, the file menu only has the save and exit options.
    2. When you try to exit with a project that hasn't been saved, DVD Maker will ask you if you want to save the project. 
    3. Clicking on a .msdvd file will launch DVD Maker with that project file.

    Those are the official changes.

    There are also a few "officialy unsupported so don't come to me if your porch is attacked by carpenter ants" details.

    DVD Maker has always supported a format through which other applications could pass content. This is used by both Movie Maker and the Picture Gallery, so when you select content and choose "burn to dvd" (or whatever it's called...), DVD Maker will show the content in all of its glory. The project file is merely an extension of that format. The project file format will be specified somewhere in the docs, but it's a very trivial XML format.

    The format is also used by the tape-to-disc wizard launched when you plug in a camera. In addition to passing the project file, it passes the -clickonce flag to DVD Maker, which then burns the disc without bringing up the normal DVD Maker UI.

    So, a clever user could take all of these *unsupported* features, and string them together to automate the burning of a DVD. As long as he wasn't overly concerned with the longevity of his porch...

  • Eric Gunnerson's Compendium

    Bad Computers in Movies

    • 1 Comments

    I read Photoshop Phriday every week, but "Computers in Movies" is especially nice. Who can forget the incredibly touching:


    Or the critically acclaimed:
  • Eric Gunnerson's Compendium

    The Microsoft Interview

    • 1 Comments
    Here's a nice post on how to answer questions at the Microsoft Interview...
  • Eric Gunnerson's Compendium

    Going to Seward for a week

    • 6 Comments

    We're taking a family vacation to Seward in a week or so. We're planning on doing some fishing and taking a boat tour, but I'm wondering if there's anything else that we should do.

    Any other "must see" sites? Any places for great photos?

    I am going to laze around part of the time, but if I do that too much, the trip might turn into a folly...

Page 1 of 1 (8 items)