It's all too much

Nelson Minar documents the political outrages of the COVID-19 era: it's all too much. The situation is appalling.

I hear and read business people talking about the opportunities at this time and I think of all the people getting screwed and opportunists like Mitch McConnell who are screwing us all over and I get sick to the stomach.

Never Summer training week twelve recap

Week twelve, a rest and recovery week, is done.

  • 3 hours, 21 minutes
  • 18.6 miles
  • 1786 feet D+

Saturday of week eleven, alone, I ran farther and got more D+ than this. And then went almost as far with more than twice as much climbing on the next day. I ran 3 times in week twelve, went for a half-hour bike ride, practiced yoga once, and had two solid strength and conditioning workouts in my backyard. We hung our TRX straps up under the deck and I'm doing rows and split squats with my rear leg suspended. I did resistance band walks and step ups with dumbells on a 24" retaining wall. I did enough traveling pushups on a ball to get pretty sore.

I worked a little harder and longer at my job this past week, ran a few more errands, helped my oldest daughter paint her room. I made some nice meals for my family and did hours of yardwork. Monday, my running training ramps up again: two hill interval workouts and 60+ miles of running are coming up.

The Never Summer 100k race hasn't been cancelled or postponed yet, but Quad Rock has been postponed. Originally on May 9, it's been moved to August 15. That's 3 weeks after Never Summer (7/25-26). I suppose Never Summer could be moved to September, still a nice time of year to be in alpine country, but shorter days and colder weather might complicate further postponement. We'll see. I'm beginning to think about what kind of self-supported or family-supported adventure I might do as a replacement.

Never Summer training week eleven recap

Week eleven required resilience and toughness. Cold and wet weather got in the way and I had some aches and pains, but in the end I met my goals for the week.

  • 11 hours 39 minutes
  • 56.6 miles
  • 7946 feet D+

Maxwell, Pineridge, and Reservoir Ridge were muddy and closed early in the week, so I did my shorter easy runs on the street. I began to get concerned that I wasn't going to hit my climbing goal.

I'd planned to do an early morning hill interval workout on the Towers trail at Horsetooth Open Space on Wednesday, but when I woke up my left knee was feeling very sore. Not certain that I'd be able to finish the workout, or even start it, I drove to the Soderberg trailhead and jogged extra slowly for 20 minutes on the flat trails below the hill. The sky was blue, the muddy trails were still frozen, good running conditions, and my knee eventually loosened up.

I went to the Towers trail instead of Stadium Hill because I had topped out during my last hill workout. Stadium Hill and the South Centennial Dr climb are just 450 feet high. The Towers trail climb is 1350 feet high. The bottom half has a mean grade of 12% and it levels off a bit in the top half with a mean grade of 11%. It's a dirt road providing access to the radio towers on the top of the first high ridge west of Fort Collins and has good footing and only a few wickedly steep pitches.

My workout: run/hike uphill at the fastest pace I could maintain for 5 minutes, then hike for 1 minute to recover, repeated 5 times. That's not a lot of recovery time, only enough for my heart rate to get from 165 b.p.m. down to 145, but the break helps me maintain a solid effort for 5 minutes with no slacking off at the end. In 29 minutes I made it almost to the top and hiked the rest of the way up as part of my cool-down. I'm definitely getting stronger and faster and felt good about this workout all the rest of the day, until I started to fall asleep at my desk around 5 p.m.

Thursday it snowed, a full foot of heavy spring snow, and I skied around the neighborhood instead of running. Temperatures stayed cool and the snow was still covering everything on Saturday, so I went for 20-mile run on the shoulder of the Horsetooth Reservoir road, out and back. There are some hills on that route, but only adding up to 2000 feet of climbing. Car traffic on the road was very heavy, clearly a lot of folks are taking scenic drives for their mental health. Everyone gave me plenty of room, and I'm grateful for that, but it was still a little bit nerve-wracking.

Sunday the weather was clear and warm and I went for a long and impractical slog in the snow in Lory State Park. I had to break trail for miles at a time and my feet have never been wetter, but I did complete the three climbs I set out to do. The going was so slow that I resorted to playing music on my phone, which I never do. The unbroken snow on top of the ridge was lovely. I appreciated the work done to clear dead and fallen trees up there more than ever.

https://live.staticflickr.com/65535/49795928826_0d56bc5b5a_b.jpg

Unbroken snow on Westridge

https://live.staticflickr.com/65535/49795385278_d7654794fc_b.jpg

Wishing I had brought skis at this point

https://live.staticflickr.com/65535/49795385798_81f1cf8e8a_b.jpg

Longs Peak from the summit

https://live.staticflickr.com/65535/49796234397_8dd4a78e24_b.jpg

Arthur's Rock from the west

Busy, distracted, and snowed in

I used to do these status updates when Ruth was traveling and I felt like I needed to announce reduced availability for open source work. My family is home, and safe, I'm very happy to say, and I can work from home, but I'm not able to carve out any significant time to work on my open source projects except where they block my projects at work. If you email me or my project lists for help, it might be days before I can respond. Same for GitHub issues. Since Fort Collins schools will remain closed through the end of the school year, this situation will probably continue into the summer.

https://live.staticflickr.com/65535/49784712806_ee0e9d8803_b.jpg

Stay home and stay safe if you can. To those of you who can't because of essential duties: thank you!

Never Summer training week ten recap

  • 9 hours, 23 minutes
  • 49 miles
  • 7402 feet D+

I ran 5 days, once less than last week, but my long runs were longer. Like last week, all of my runs had some hills. The Never Summer 100k course averages more than 200 feet D+ (this is the French abbreviation for dénivelé cumulé positif, the cumulative elevation gain) per mile. My runs this week were relatively flat, averaging 150 feet D+ per mile.

On the 8th I went back to Stadium Hill for a pyramid workout: 10-8-6-3-2-1 minutes going up with half time recovery intervals going down. I think I'm beginning to appreciate hill workouts on pavement. The grade is more regular and there's nothing to trip over or dodge. I can focus on my breath and effort level as I go up and I can work on spinning my legs while going down. I'm certainly putting in enough trail miles on other days. If Stadium Hill has a fault, it's lack of height. I did run out of steep hill in the last two intervals of my workout. From the top there are some iconic views of the reservoir, Horsetooth Mountain, and Longs Peak. It's worth the trip.

Saturday I went for a proper hilly run on the 5th and 6th climbs of the Quad Rock course. I avoided descending all the way to the Horsetooth Rock trailhead in the middle of the route and added some D+ by taking a sidetrip to the Horsetooth Rock summit and going all the way up to the radio towers twice. Just under 16 miles and just over 3500 feet D+.

https://live.staticflickr.com/65535/49766994906_35802ed659_b.jpg

Arthur's Rock trailhead

The weather was perfect. Dry and warm but not too warm. 45 °F when I left the Arthur's Rock trailhead at 7:30 a.m. and 60 °F when I returned at 11:15. I saw some friends near Horsetooth Rock, a flock of red crossbills on Spring Creek trail, and some ball cactus I'd never noticed before near the radio towers.

https://live.staticflickr.com/65535/49767314642_44e5cf2760_b.jpg

Mountain ball cactus near the radio towers

https://live.staticflickr.com/65535/49766462523_8e4cee753a_b.jpg

At the CPR tower

https://live.staticflickr.com/65535/49766994381_2e395279be_b.jpg

Longs Peak from the towers

https://live.staticflickr.com/65535/49766994751_10a42f264d_b.jpg

Horsetooth Reservoir and Fort Collins from Horsetooth Mountain

Twenty-four hours later I went back out in completely different conditions, a snowstorm and 15 °F instead of 15 °C. The Pineridge and Maxwell Natural Areas were empty. It was just me and the deer.

https://live.staticflickr.com/65535/49766475518_3210018678_b.jpg

Horsetooth Reservoir and Centennial Drive from the top of the A

Outside of running, I practiced yoga once during week ten and went for an hour long bike ride with Beatrice. She turned 11 in December and this spring graduated to an adult size bike, 21 speeds and 26" wheels. Next week, I intend to practice yoga at least twice and resume weight training, somehow, while also running one more day, and supervising my kids' remote learning, and making the geo-doughnuts at work.

Never Summer training week nine recap

Let's do the numbers.

  • 8 hours, 53 minutes
  • 46.5 miles
  • 6362 feet D+

In week nine I moved my speed workouts from the gravel track behind the CSU Performing Arts Center to Stadium Hill on Larimer County Road 42C. This is the road that climbs the ridge south of Dixon Canyon Dam and connects to Centennial Drive, the route along the east edge of Horsetooth Reservoir. Stadium Hill starts with a grade of 4% and increases to more than 10% near the top. Tuesday I did a 2-4-6-4-2 pyramid. 2 minutes hard running up, 2 minutes easy jog down. Then 4. Then 6. Then back down the pyramid through 4 and 2-minute intervals. By the first 4 minute interval, I had rounded the corner into the steep part of the hill. At the end of the 6 minute interval, I had reached the intersection with Centennial Drive. At the end of the second 4 minute interval I was well into the Centennial Drive climb. I racked up over 1000 feet of climbing in 18 minutes of uphill running. This is much faster than I have run in a trail race. At the last Black Squirrel, for example, I went up the first, 1129 foot, climb (Quad Rock Climb #4 on Strava, 6% average grade) in 42:24.

Friday I did a little more hard running on the A Trail at Maxwell. I've had a goal since last year to complete the Pole to Road Strava segment (0.9 mile, 353 feet, 7% average grade) in less than 10 minutes. Friday I did it in 9:25. Local elite runners have PRs of about 7:30 and the record is 6:42. I think under 9 will be a good new goal for me. I'm quite excited about my fitness so far this season.

I practiced yoga twice at home, doing an approximation of the Vinyasa "flow" class that I used to attend on Friday mornings. Practice consists of closing my bedroom door, unrolling my mat on the floor, putting some cool jazz on our sound system, and following my memories of a basic flow. So far, I've practiced for 30 minutes at a time. If I can continue to stay focused for 30, I'll try extending it a bit. Being in charge of the yoga music is nice. No more weird hippie stuff chosen by other people, just weird hippie stuff chosen by me, like Up on the Sun and Saxophone Colossus.

Yesterday I got up early to beat the crowds and drove to Bobcat Ridge Natural Area for a long run. There had been snow and freezing fog Friday morning, and the ice was still hanging on in shady places and on top. Towards the end of my run, things had warmed and the ice was starting to come loose and fall from the trees, making a weird and wild crackling and clattering sound from every direction.

https://live.staticflickr.com/65535/49735805036_d820af20ce_b.jpg

At the trailhead

https://live.staticflickr.com/65535/49735262563_af8b9f617b_b.jpg

Pasqueflower on the top of Green Ridge

https://live.staticflickr.com/65535/49736132717_26c0fcee00_b.jpg

Rimed pines on Green Ridge

https://live.staticflickr.com/65535/49735262608_b6c2c4c9af_b.jpg

Looking west from the top of Green Ridge toward the snow-covered Mummy Range

https://live.staticflickr.com/65535/49736133202_02b31565dd_b.jpg

Looking east from the DR Trail climb to Horsetooth Mountain

Edward Abbey's statement that "Wilderness is not a luxury but a necessity for the human spirit" feels more true to me now than ever. I think I'd have a hard time getting up to make the geospatial doughnuts every morning if I couldn't get outdoors locally and ethically almost every day. I'm lucky to have access to places like Green Ridge and Horsetooth Mountain while helping limit the spread of COVID-19 in Fort Collins.

This morning I did a shorter loop in Lory State Park and, for the first time, at the insistence of Colorado Governor Jared Polis, brought a Buff (the tubular scarf) along to use as a face covering when passing other folks on the trail. Some people looked a little worried, which shows how we're not yet making masks a normal thing here.

pytest.raises excinfo subtilty

In the past few weeks I've seen multiple stumbles related to a subtilty of pytest. I'm going to explain how to recognize the issue and what to do about it.

Exceptions are an aspect of a Python package's API, just like the names of the functions, their parameters, and their return types. They also require testing. Pytest provides a handy context manager for this: pytest.raises.

def accept_numbers_lt_3(num):
    if not num < 3:
        raise ValueError("Number is not less than 3")


def test_unaccepted_error():
    with pytest.raises(ValueError):
        accept_numbers_lt_3(3)

That test will pass. The function does raise a ValueError when called with the argument 3.

To make assertions about details of the exception you might try the following.

def test_unaccepted_error_msg():
    with pytest.raises(ValueError) as excinfo:
        accept_numbers_lt_3(3)
        assert str(excinfo.value) == "Number is not less than three"

This test passes too. But wait, we mistyped the expected string. We're asserting that the message ends with "three" and that can't be true, can it? How did this test pass?

Here's the important thing: pytest "magically" changes the interpretation of assert statements, but it doesn't change the behavior of Python's "with" statements. That final assert statement in test_unaccepted_error_msg is never reached. Execution exits from the block when the ValueError (or any other exception) is raised.

The excinfo object has recorded the captured exception so that we can inspect it. We only need to move that assert statement to after the with block.

def test_unaccepted_error_msg():
    with pytest.raises(ValueError) as excinfo:
        accept_numbers_lt_3(3)

    assert str(excinfo.value) == "Number is not less than three"

Now this test will fail, properly. And we can change "three" to "3" and have a passing test of an exception message.

This issue is documented in a note in the pytest.raises docs, but is easy to overlook.

Never Summer training week eight recap

The second recovery week of my spring season is done.

  • 5 hours, 44 minutes
  • 33.1 miles
  • 2146 feet D+

I ran on 5 days, but did no speed workouts, no run taking more than 90 minutes. We've added dumbells and a BOSU ball to our home gym's equipment and I used those in two workout sessions during the week. Did you know that "humpbacked", in French, is "bossu"? A humpback whale is a "baleine à bosse".

I plan to keep running outdoors, but this week I made changes to where and when that I will stick to until the pandemic is over. It's not too hard for walkers to maintain six feet of distance, they're only passing people going in the other direction. A runner, on the other hand, is passing people in both directions, and more often. So, I'm avoiding the city's popular recreational trails, including my favorite Spring Creek trail, and when in town will be running on the nearly empty feeder streets. I need hills in my diet and don't want to avoid the nearby single track, but I'm going to go out earlier than I would otherwise like to avoid other users as much as possible. I feel good about this plan and so does my family.

I feel less good about not yet replacing the missing yoga in my schedule. Although I've been practicing regularly for years, even while I was living in France, I've been doing it in groups led by an instructor and have never cultivated a self-guided practice. I've heard people say that they have a hard time working at home. This is my experience with yoga. I'm finding it hard to get started.

Massage is another aspect of my training and recovery that I will be without. A foam roller and tennis ball aren't quite the same, but will have to suffice for a while.

COVID-19 and hydroxychloroquine

The story about spurious prescriptions for hydroxychloroquine hits close to home: this drug is my one prescription medication and the U.S. Bozo-in-Chief is causing a run on it. I got a 90-day refill on the 15th and am glad I didn't procrastinate. Let me make two things clear: 1) I'd be thrilled if hydroxychloroquine turned out to be an effective treatment for COVID-19 infection, and 2) Trump should seriously STFU.

There's more about this in the New York Times business section today.