The author

Dullroar
a heaping plate of rambled eggs

My personal web site. You're probably not interested.

Outdoor Adventures

Trip reports from over the years. See here for my 14ers list, and here for my 13ers list. See my working toward ultra-light pack weights here and here.

Grand Canyon

A three-day traverse along the Tonto platform.

Al had been planning this trip for years. She wanted to go down the Hermit trail and come out five days later at the Tanner trail, a distance of about 75 miles. We ended up getting as far as Cremation Creek, and then backtracking and coming out on the South Kaibab trail on the third day.

First Day—Friday, October 18, 2019

Hermits Rest to Salt Creek—12.7 miles

The five of us (Al, Saleck, Yoni, Sophia and myself) hit the trail at 10:45am. The seven mile down-hike was long but not that difficult. Once we started on the Tonto trail things changed. Fairly rugged country, with more ups and downs that the maps show. By the time we got to Monument Creek I was staggering from dehydration and not eating enough (a problem throughout the trip, because at the last minute and Al's urging I dumped my food, but then didn't like much of what was brought, and the additional loss of appetite meant I was at a caloric deficit the whole trip). We ate at Monument Creek and then hiked on in the dark, finally hitting Salt Creek around 8:30pm, where it was immediately into the sleeping bags to crash.

Second Day—Saturday, October 19, 2019

Salt Creek to Cremation Creek—14.2 miles

We started at 7:45am, with the goal of meeting Al's father Randal at The Tipoff on the South Kaibab trail by 4:00pm. We made it to Horn Creek by 10:10am, and Indian Gardens around noon. Then we met Randal just a bit late and hiked on in the dark to Cremation Creek, getting lost a few times on the way (the trail is not as well-traveled as the more popular "down-and-up" ones, and can be hard to find, especially at night, and especially as I've discovered my night vision is now officially shit in my old age). I was feeling short-tempered due to a few things that had happened, and knew I couldn't handle the upcoming "big days" requiring 20+ miles each day while carrying 10 liters (22 lbs) of water each day. So I decided to hike out the next day with Randal (who was only over-nighting) and Saleck, who decided he'd had enough. However, after dinner Al ran a pow-wow, and she, Yoni and Sophia decided we should all stick together and hike out the next day.

Third Day—Sunday, October 20, 2019

Cremation Creek to South Kaibab trailhead—6.7 miles (3,200' climb out)

The day went according to plan, with a long, hard grind out on the South Kaibab trail. Al and I made it first and she took her dad's car and went to get the van, only to find out it wouldn't start! So we ended up having to call AAA and get it towed to Flagstaff, where we spent the night in a hotel and then rented an SUV for the trip back to Cali. On the way back we stopped and did a day hike to Arizona (Ringbolt) hot springs on the Colorado River below Lake Mead. That might well have been the best part of the trip!

Distance
33.6 miles
Time
3 days
Starting Elevation
~6,650'
Minimum Elevation
2,995'
Ending Elevation
~7,200'

Twining Peak

A nice jaunt from Independence Pass to Twining Peak (13,711').

Had tried for this peak in 2013 and got turned back in a blizzard. This time went much better, starting at Independence Pass and passing over Point 13,500' both ways. The tundra was in full bloom.

Starting Elevation
12,095'
Maximum Elevation
13,711'

A video from the summit. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Mt. Evans

I climb Mt. Evans (14,264') from Echo Lake.

The following is from my trail journal.

After a night at the Indian Hot Springs in Idaho Springs I got up early and was at the Echo Lake trailhead at 6:30am. It was a nice, long hike through a hanging valley with the Chicago Lakes, which would be a good destination hike on their own. After leaving their basin it was a bit of a slog up to Summit Lake, but I did see mountain goats and bighorn sheep while heading for the summit.

The path from Summit Lake to the summit is just a long meander with mostly a nice path or cairns. Roachs says the route from Echo Lake to the summit is 6+ miles, 14ers.com says more like 8.5 miles, and I'm with them. I reached the summit at 10:50, so 4:20 to the top, which I thought was a good job given the 5,000' elevation gain.

Met some cyclists on top who were on vacation (Rob, Steve and Phil) and Phil offered me a ride back to Echo Lake in his car (he was doing support that day for the other two), and I took it.

One-Way
8.5 miles
Time
4:20
Starting Elevation
10,650'
Maximum Elevation
14,264'

A video from the summit. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Mt. Massive, Redux

Al and I climb Mt. Massive (14,421') the day after my birthday.

The following is from my trail journal as Al and I were finishing up her final section hike on the Colorado Trail.

After a wet night we woke up to a misty campsite at 11,300' on the east side of Mt. Massive. We camped on a ridge just off the Colorado Trail about a half mile from the Mt. Massive trail. We were up and on the the trail at 7:00am, and hit the Mt. Massive trail at 7:20. We cranked and were on top at 9:40! We left some dudes in the dust (Al has a competitive streak), but there was a mom and her 11-year-old boy from Leadville who were doing his 11th 14er and they left us in the dust!

We left the summit at 10:00 and were back to the CT where we had hung our packs at 11:30 (we ran down part of the way, Al singing Beatles songs the whole while). We then hiked to the Mt. Massive trailhead (Halfmoon) parking lot for a break. From there we walked the Colorado Trail to the South Elbert trailhead parking lot, completing Al's CT adventure after three years of section hikes.

We then hitched back to Buena Vista with two guys, Dave and Steve. When Dave heard Al say she had completed the CT he walked to his car and brought her a beer! When she said I should get one I said I don't like beer and he brought me a Gatorade. Nice guys.

We spent the night at Cottonwood Hot Springs (of course), and went and watched O Brother, Where Art Thou? at the B.V. drive-in, Al's first drive-in movie. All in all, a great day.

Time
4:10
Starting Elevation
~11,300'
Maximum Elevation
14,421'

Video from the summit of Mt. Massive. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Centennial Peak

A beautiful day in the La Platas near Durango where I climbed Centennial Peak (13,062').

No real trip report on this one. I truck camped in the woods and hiked up the trail to Sharkstooth Pass. A quick glance at that peak made me decide, "No, thanks"—just a block of choss, no matter how cool it looks from the distance. I then went up the ridge to Centennial Peak. I enjoyed the incredible view of Hesperus Peak and the rest of the La Plata range, with Indian Ridge just across the valley bringing back memories of the Colorado Trail the year before. Then I went back to the pass and a little bit up towards Sharkstooth, spending some time in a shale(?) rock formation that was just packed with marine fossils. After that it was a pleasant hike back to the truck, to then go spend some time in the Durango Hot Springs near Trimble.

Maximum Elevation
13,062'

Video from the summit of Centennial Peak. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Mt. Yale, Again

My second time climbing Mt. Yale (14,196'), this time solo.

All my trip journal says: "Got up early on Saturday and re-climbed Mt. Yale, 20 years after the first time. Took about five hours round-trip. Again, beautiful weather on top, great views in all directions, although South Park was dramatically socked in with either morning fog or fire haze from Utah."

Round-Trip
9.5 miles
Time
~5:00
Starting Elevation
9,900'
Maximum Elevation
14,196'

Click on any picture below to see the slides full-sized.

Huron Peak

My second time summiting Huron Peak (14,003'), although this time I could see.

I had climbed Huron Peak before, on September 21, 2014, but the summit had been socked in by clouds and the view was literally no farther than 50' or so. It was a good climb, just no payoff. This time I got the payoff! The following is from my trail journal.

Was at the upper trailhead by 6:30 a.m., and on top at 8:50. View were incredible, especially of the Apostles. Lake Ann is still frozen and Lake Ann Pass is completely snowed in, with a cornice on top. No CT/CDT thru-hikers getting through there this week without traction at least. A year ago to the week (the day after the 4th, when I was thru-hiking the CT), it had some snow to deal with, but nothing like this year. Wow.

Round Trip
6.5 miles
Time
2:20 to summit
Starting Elevation
10,560'
Maximum Elevation
14,003'

Click on any picture below to see the slides full-sized.

Castle Peak

I climb Castle Peak (14,265'), my first peak in the Elks, with a lot of snow.

The following is from my trail journal.

Was up and walking up the road from the creekside campsites towards the creek crossing at 5:30 a.m. The road was rough and I am glad I didn't take the truck any higher, especially because it was blocked with snow not far past the creek anyway. After that it was snow, snow, snow, all the way up, especially once past timberline. Luckily, in all but two cases while snow covered the road in most places, usually there was a "lip" on the edge of the road to walk on. And what a walk it is! Not hard, mostly, just long.

Finally made the basin above the mine, and it had a good portion of snow filling it and the various couloirs in the cirque. Put on my microspikes. The snow was in much better shape than it had been a few days before on my Ellingwood Point attempt. Crunched up the trough on the left as far as I could until I saw the trail for Castle Peak summit break off. Then I followed it up the ridge, mostly class 3. Summited (my 29th!) by 10:11. After photos, I briefly went down the ridge toward Conundrum, but after a couple of hundred feet I turned around for three reasons:

  1. There was a very short but exposed down-climb I didn't like doing solo (down-climbs are my weakness).
  2. I watched two people take longer to get off the couloir below the Conundrum ridge. Snow was still going all the way to the top. One of them made it down about ⅓ of the way and then obviously panicked. I could tell from clear across the valley. After staying frozen there for what seemed like forever, the other down-climbed (bad) the exact same chute (bad) toward their stranded partner. After some discussion, the upper (more experienced?) climber headed to their left (my right)—more under Conundrum and away from the ridge. Then they did a big arcing loop down and around. The stranded friend finally followed, what else were they going to do? Sit there? The confounding factor wasn't the slope or the snow, per se, but the runout was into a barely melting but still plenty wet tarn at the bottom of the chute, and if braking went bad, you'd end up in the cold, wet water. Anyway, that was on my mind as taking the "easy" way down everyone recommends was obviously out.
  3. Which meant having to summit Castle again if I went over and then came back, and I did not want to, plain and simple!

So I turned around, spent some delightful "alone time" on the summit—other than the ice chute couple, I had the entire cirque to myself the whole time! The weather was pleasant, with a little wind, but welcome, mostly. Some clouds later on.

The descent was long, although I did get to glissade a few hundred feet! Fun. Back at camp around 4:00-ish.

Round Trip
13.5 miles
Time
10:30
Starting Elevation
~11,200'
Maximum Elevation
14,425'

Click on any picture below to see the slides full-sized.

A Bit of Weather

We got rained and hailed on all day, but luckily this one came through after we set up camp.

From my through-hike of the Colorado Trail in the summer of 2016.

Walk Through Blooming Tundra

A great example of the beauty of blooming tundra.

From my through-hike of the Colorado Trail in the summer of 2016.

A Ptarmigan and Chicks

I got to see ptarmigan and their chicks multiple times. It was always a joy.

From my through-hike of the Colorado Trail in the summer of 2016.

Walk Through Wildflowers

A walk through a beetle-killed forest with beautiful wildflowers blooming.

From my through-hike of the Colorado Trail in the summer of 2016.

Big Country

The Colorado Trail isn't all walking through high mountains and summit views. Here is a view in cattle country in the Cochetopa Hills.

From my through-hike of the Colorado Trail in the summer of 2016.

Early Morning Elk Herd

A true privilege to get to see this. I watched them for half an hour.

From my through-hike of the Colorado Trail in the summer of 2016.

A Tad Windy

A bit windy (it got worse!) in the Collegiate Peaks Wilderness.

From my through-hike of the Colorado Trail in the summer of 2016.

Lake Ann Pass

View from the summit of Lake Ann Pass (12,588').

From my through-hike of the Colorado Trail in the summer of 2016.

"Typical" Campsite

Here is a "typical" campsite, this one at Lake Ann.

From my through-hike of the Colorado Trail in the summer of 2016.

Hope Pass

View from the summit of Hope Pass (12,508') on Independence Day.

It was notable because there was no wind and I hadn't seen anybody to this point, even though it was a beautiful three-day weekend!

From my through-hike of the Colorado Trail in the summer of 2016.

Colorado Trail Slides

Just a sampling of random pictures from the trip.

From my through-hike of the Colorado Trail in the summer of 2016.

Changes

Follow along as my beard grows and my weight drops 15 pounds in 28 days.

From my through-hike of the Colorado Trail in the summer of 2016.

My Colorado Trail Stats

Some statistics from the hike.

  • Age: I turned 56 on-trail, same day as reaching the CT high point
  • Height: 6'1"
  • Weight at start: 190
  • Weight at end: 175 (maybe I should write a "Thru-Hike Diet" book!)
  • My home's elevation: ~700'
  • Training: Running 6-9 miles 3x/week, some longer on weekends (up to 20 miles), lots of hill work
  • Base pack weight: 11.3 lbs—pack, shelter, sleeping, cookwear, etc.
  • Total pack weight: 25 lbs—average, this is with the "consumables"
  • Start date: 6/25/2016
  • End date: 7/22/2016
  • Days to complete: 28
  • On-trail days: 26, so two zero days
  • Nights in town: 8 (counting zero days), Breck, Frisco, BV, Salida (2x), LC (2x), Silverton
  • Resupplies: Frisco, Twin Lakes (parcel delivery—too much food!), Salida, LC, Silverton
  • Longest mileage: 26.2, 1st day!
  • Shortest mileage: 7.6
  • Average mileage: 18.4, counts only on-trail days, a bit off because my GPS watch had issues on two days—throw out the outliers and figure just under 20
  • Longest day on-trail: 11.8 hours
  • Shortest day on-trail: 3 hours, doesn't count zero days, obviously
  • Average day on-trail: 8.5 hours
  • Average pace: 2.2 MPH, very steady, +/- 0.3 MPH
  • Average daily climb: ~3,160'
  • Most rain and hail: San Juans south of Molas Pass, but Holy Cross Wilderness gets honorable mention
  • Most wind: Collegiate West segments 3 and 4—I literally cursed the wind one day!
  • Best wildlife: Collegiate West
  • Most unexpected beauty: "Cattle country" in the Cochetopa Hills
  • Worst beetle kill: Upper Cochetopa Creek
  • Biggest disappointment: Arriving at the San Luis Peak saddle too late in the afternoon to summit
  • Easiest hitchhike: To/from Cottonwood Pass to BV
  • Hardest hitchhike: Monarch Pass to Salida (ended up calling a shuttle both ways), Silverton to Molas—I could write a whole post complaining about why these were hard, but will not, because it will sound like sniping/whining
  • Long-term friendships made: Two, and have continued to adventure with both since
  • Wonderful people met: Too many to count, really—and I am one cynical SOB, so when I say "really," I mean it!
  • Unneeded anxieties: Too many to count, really—creek crossings, dry sections, bears, hitchhiking, food amounts, gear, etc., etc., etc.

Colorado Trail Weather

I wanted to give something back to the Colorado Trail after through-hiking it in 2016, so I wrote a page to let you find the current weather anywhere along the route.

Mt. of the Holy Cross

Mt. of the Holy Cross (14,005') makes my 10th 14er of 2015!

Another wonderful climb through aspens, although the 1,000' uphill section on the way out was not as fun as the rest. As a pre-reward I had the summit to myself for about 25 minutes. I remember spending an hour by a creek resting in the afternoon, something I almost never do, and being really relaxed and content.

Round Trip
12 miles
Starting Elevation
10,320'
Maximum Elevation
14,005'

Video from the summit of Mt. of the Holy Cross. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Challenger Point

I summit Challenger Point (14,081') on a very challenging day.

Cloudy and cool, but that was welcome for the longest hike of the trip (12.5 miles round trip). It was very steep and slippery, a hard one. Had summit to myself for about 20-30 minutes. Didn't do Kit Carson, so will have to go back for that. Partly because of snow in the ramp, but mostly because this was where my retina blew a vein.

Round Trip
12.5 miles
Starting Elevation
8,850'
Maximum Elevation
14,081'

Three videos—first of a "fun" stretch of the trail, then from the summit and finally above the waterfall emptying into Willow Lake. If the fullscreen icons aren't available, you can view them here, here and here.

Click on any picture below to see the slides full-sized.

Humboldt Peak

Humboldt Peak (14,064') on yet another beautiful day.

I had the summit to myself for almost an hour. No trip report, just video and pictures.

Round Trip
11 miles
Starting Elevation
9,950'
Maximum Elevation
14,064'

Video from the summit of Humboldt Peak. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Missouri Mountain

I climb Missouri Mountain (14,067') on a perfect fall day.

A beautiful, calm day with only about six other people on the mountain. No trip report, just video and pics.

Round Trip
10.5 miles
Starting Elevation
9,650'
Maximum Elevation
14,067'

Video from the summit of Missouri Mountain. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Shavano and Tabeguache

My second time up Shavano (14,229', and third, really, coming back over it on the return trip) and my first on Tabeguache (14,155').

I look at the videos now and think, "Man, that's a lot of cloud!," but it wasn't a stormy day, luckily. This was a good year for 14ers.

Round Trip
11 miles
Starting Elevation
9,750'
Maximum Elevation
14,229'

Two videos, the first from the summit of Tabeguache, the second on the summit of Shavano on the way back. If the fullscreen icon isn't available on either of them, you can view them here and here.

Click on any picture below to see the slides full-sized.

Mt. Massive

Climbed Mt. Massive (14,421') using the southwest slopes route.

It was steep but I did it in great time, reaching the summit in under three hours, and felt good about it. However, the descent ended up killing my knees. Good thing it was the last peak I had planned for the trip.

Round Trip
8.8 miles
Time
6:00
Starting Elevation
~9,980'
Maximum Elevation
14,421'

Video from the summit of Mt. Massive. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Mt. Harvard

Climbed Mt. Harvard (14,420') from the standard route along North Cottonwood Creek and Horn Fork Basin in the Collegiate Peaks Wilderness Area northwest of Buena Vista, Colorado.

There was still quite a bit of snow near the summit which made for a few interesting detours. Got to see a goat on the summit, probably from the same herd as the one I saw on nearby Mt. Columbia the year before.

I remember being saddened by a young man who turned back within a few hundred yards of the summit because of the snow and (he thought) the impending weather. I passed his camp on the way out, and he looked bummed. But, each person has to do and learn these things by experience, and this was one of his. Maybe next time he'll take the chance and power on through. On the other hand, I didn't get a lot of summit shots, because the weather was turning.

Round Trip
13.6 miles
Time
7:30
Starting Elevation
~9,730'
Maximum Elevation
14,420'

Two videos, one of the ubiquitous mountain goats in the area, and the other from the summit of Mt. Harvard. If the fullscreen icon isn't available on either of them, you can view them here and here.

Click on any picture below to see the slides full-sized.

Iowa Peak

I climbed Iowa Peak (13,831') from a high camp at 12,000' in the Missouri Basin of the Pine Creek Valley in the Collegiate Peaks Wilderness Area northwest of Buena Vista, Colorado.

I started out wanting to climb Missouri Mountain (14,067'), but had to turn back due to post holing through wet, soft snow at around 13,200' below the ridge between Missouri and Iowa.

I then descended to a shelf and traversed south and climbed Iowa Peak from the southeast. While it wasn't my original goal, it was a beautiful day, lots of flowers were blooming in the tundra, and I got a lot of good pictures. I also got to scope out the Apostles to the west, which are on my list.

Round Trip
6 miles
Time
5:00
Starting Elevation
12,000'
Maximum Elevation
13,831'

Video from the summit of Iowa Peak. If the fullscreen icon isn't available , you can view it here.

Click on any picture below to see the slides full-sized.

Mt. Belford and Mt. Oxford

Climbed Mt. Belford (14,203') for my second time along with Mt. Oxford (14,160').

I started from a high camp at 12,000' in the Missouri Basin of the Pine Creek Valley in the Collegiate Peaks Wilderness Area northwest of Buena Vista, Colorado. Ascended to Mt. Belford by Elkhead Pass, and then crossed over to Mt. Oxford via the connecting ridge, and returned the same way.

Round-Trip
9 miles
Time
6:27
Starting Elevation
~12,000'
Maximum Elevation
14,203'

Two videos from the summits of Belford and Oxford. If the fullscreen icon isn't available on either of them, you can view them here and here.

Pine Creek and Missouri Basin

Backpacked up the Pine Creek valley to Missouri Basin in the Collegiate Peaks Wilderness Area northwest of Buena Vista, Colorado.

Camped at 12,000' for three nights and hiked out on June 30. During my stay I climbed Mt. Belford and Mt. Oxford and also Iowa Peak.

Distance
11 miles
Time
5:38
Starting Elevation
~9,635'
Maximum Elevation
~12,000'

Video of Missouri Basin. If the fullscreen icon isn't available , you can view it here.

Click on any picture below to see the slides full-sized.

Mt. Silverheels

I successfully climb Mt. Silverheels (13,822') after a failed attempt a week earlier.

I had tried the previous weekend without enough acclimation and failed halfway up the north gully. This time it was a success via the same route on a beautiful fall day. I do remember meeting a couple on top who climbed it from the west slopes, but saw no one else that day. No trip journal entry.

Round Trip
9 miles
Starting Elevation
11,550'
Maximum Elevation
13,822'

Two videos from the summit. If the fullscreen icon isn't available on either of them, you can view them here and here.

Click on any picture below to see the slides full-sized.

Mt. Hope

I finally summit Mt. Hope (13,933') on my third attempt over the years.

Came up from the Clear Creek side in Sheep Gulch, cut across the drainage and went up via the "bowl" to the ridge, went over a false summit and finally made it. Third time's the charm! Then descended to Hope Pass and back down to trailhead. No trip journal.

Round Trip
8 miles
Starting Elevation
9,850'
Maximum Elevation
13,933'

A video from the summit. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Mt. Columbia

I summit Mt. Columbia (14,073') on my second attempt in three days.

No trip journal on this one, unfortunately. I had tried a few days before and had my ass kicked by the steep scree on the west slopes route (what a grind), but was determined to summit and made it on the second try. Got to see one of the mountain goats that are always mentioned on trip reports. Good climb, had the summit to myself!

Round Trip
11.5 miles
Starting Elevation
9,900'
Maximum Elevation
14,073'

A video from the summit. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

Buffalo Peaks Traverse

My coworker John and I do a traverse over the summits of both West (13,326') and East (13,300') Buffalo Peaks and the ridge between.

Round Trip
~11 miles
Starting Elevation
10,600'
Maximum Elevation
13,326'

Videos from the summits and the ridge between. If the fullscreen icon isn't available on any of them, you can view them here, here and here.

Click on any picture below to see the slides full-sized.

Mt. Belford

My coworker John and I summit Mt. Belford (14,197') on a beautiful, crisp September Day.

Round Trip
8 miles
Starting Elevation
9,650'
Maximum Elevation
14,197'

A video from the summit. If the fullscreen icon isn't available, you can view it here.

Click on any picture below to see the slides full-sized.

La Plata Peak

I finally climb La Plata (14,336') one of the best looking peaks in Colorado, after seeing it from Mt. Elbert 15 years earlier.

A climb on snowy slopes. No trip journal for this, but I distinctly remember taking no traction along, wishing I had and falling hard, twice on the descent.

Round Trip
9.25 miles
Starting Elevation
10,000'
Maximum Elevation
14,336'

A video from the summit and another on the descent. If the fullscreen icon isn't available on either, you can view them here and here.

Click on any picture below to see the slides full-sized.

Mt. Princeton

I climb Mt. Princeton (14,197') the long way (from the lower trailhead).

Round-Trip
16 miles
Starting Elevation
8,900'
Maximum Elevation
14,197'

A video from the summit. If the fullscreen icon isn't available, you can view it here.

Mt. Antero

I climb Mt. Antero (14,269') the long way, all the way from County Road 162.

It was a long but beautiful walk up the jeep road after Les dropped me off at the Baldwin Gulch junction. I remember getting a hitch for part of the way back down, having to ride in the back of a pickup because the guy, girl and their dog were in the front. I was still very happy for it.

Round-Trip
~12 miles (picked up at the upper 4WD TH)
Starting Elevation
9,400'
Maximum Elevation
14,269'

Click on any picture below to see the slides full-sized.

Mt. Shavano

I summit Mt. Shavano (14,229') on my birthday.

The following is extracted from my trip journal.

Arrived at the Mt. Shavano trailhead at 8:15am and was off by 8:30. My goal was both Shavano and Tabeguache (but that didn't happen). About half the trail was through a thick forest of spruce, fir and aspen that gave way to stubbier alpine fur and finally krummholz and timberline. The forest smelled very "piney," it was nice. It was long and steadily uphill, as with all the Sawatch, Shavano's front face is E/SE exposed and the trail climbed up across the right side of the "Angel" to reach a grassy saddle at 13K'. The tundra was in bloom and all those tiny yellow, white and blue blooms were putting out so much scent it smelled like honey—a phenomenon Mike and I experienced on Mt. Elbert on my birthday 11 years ago today!

After the saddle it is a steep, rocky but well-cairned route up to the false summit ("The summit you see is not the true summit"). Then up some scrambly rock. I summited at 12:05, so 3:35 to the top. Ate some fruit, drank and looked around, then descended because there were clouds forming and it was visibly raining on Mt. Harvard to the north. It spitted on me once during descent but not enough to make me wet. I was down by 2:56.

Round-Trip
9 miles
Time
6:41
Starting Elevation
9,750'
Maximum Elevation
14,229'

Click on any picture below to see the slides full-sized.

Handies Peak

I climb Handies Peak (14,048'), barely beating the weather.

The following is from my trail journal.

Around 2:00pm the weather got nice and Mike and I decided to go for Handies (from our campsite in American Basin), which was insane because it had already rained 2x. But the blue sky was killing us so we went for it instead of being campbound, with the determination we'd turn around if the clouds built back up. We set off on the trail at 2:50. The trail seemed a lot longer to both of us, but especially to me, since I had climbed two 14ers yesterday with about an eight mile round trip, and then we had down-hiked with full backpacks four miles this morning.

We made it to about 13,000' (just above Sloan Lake) when Mike's vertigo kicked in again and he turned back. I kept slogging on, hoping the weather would turn me back, but each time I stopped to rest the sun would break free again. The last section was a slog, a total "Stairmaster" and pretty unrelenting, including a section on the summit where the trail had no switchbacks. I summited, took some pics, ate and drank, signed the summit register and then headed down, despite the great views, after ten minutes because I did not want to be caught on the ridgeline in a thunderstorm. Came down carefully since I was the only person on the peak or trail (a rare bit of solitude on a 14er, everyone else having gotten down by 1:00 or 2:00), and I did not want to hurt myself and have to overnight it.

I finally made it down by 6:00—three hours and ten minutes! That was a great time for a roundtrip, even if it was a "patimur bene" climb.

Funny story—when I got back to the trailhead a forest ranger was there and gently chided me, "You know, you should be off (the summit) by noon." I assured him I knew and had been watching the weather, ready to turn back at any moment, and he just smiled. He had said his script, and knew it did no good, probably like the 200 other times he has said it!

Round-Trip
5.5 miles
Time
3:10
Starting Elevation
11,600'
Maximum Elevation
14,048'

Click on any picture below to see the slides full-sized.

Redcloud and Sunshine Peaks

I climb Redcloud (14,034') and Sunshine (14,001') Peaks together.

The following is extracted from my trail journal.

Sitting in the tent listening to the rain—it's 6:00pm and it's rained off and on all afternoon. We got up at 5:45am or so after an evening of off and on rain. We ate breakfast and were on the trail by 6:35am. We hiked to the saddle and started up Redcloud and Mike got vertigo real bad and had to descend after 300' or so. I continued on and summited Redcloud at about 8:10. Ate and drank some water and then began the long slog over to Sunshine. Reached there at about 9:20. Ate again and checked out the views.

Great views all around—Uncompahgre, Matterhorn, Wetterhorn, Coxcomb and Redcliff. Sneffels. Handies. Grenadier Range with a great view of the Wham Ridge straight on. The Needles. San Luis Peak. I think I even saw Spanish Peaks—but maybe they were something else (they were the right size and shape and a long way off in the right direction).

The weather was great but white puffy clouds were starting to form so I left at 9:45 and did the scree descent off (which was a real grind going up). Then the long uphill back to Redcloud. Made it back to its summit at 10:50. Ate a bit and then headed down because the clouds were starting to seriously coalesce. I got to the valley and it started to sleet. I made it back to the campsite at 12,000' at about noon and shortly after it started to really rain and kept it up for an hour with lots of lightning. I felt sorry and worried for the people still on it, who kept coming down totally sodden for the next few hours, including a family who cut through our tent site in a deluge. We shouted out that they could shelter with us but they were actually short-cutting through our site to get to their tent a few hundred feet below us.

Round-Trip
~6 miles
Time
5:30
Starting Elevation
~12,000'
Maximum Elevation
14,034'

Click on any picture below to see the slides full-sized.

Uncompahgre Peak Attempt

Mike and I attempt Uncompahgre Peak (14,309') but get turned back due to intermittent sleet.

Trip journal excerpt follows.

Missed journaling yesterday, so today will have to play catch up. We tried Uncompahgre Peak from Henson Creek Road, walking up the four mile jeep road (and yes, it is that, the Colt would not have made it a quarter mile on the Nellie Creek jeep road). We started at approximately 8:30am on Wednesday, September 22, 2004, and made it to the end of the jeep road by 10:20. Then we hiked about 2.5 miles to the pass that leads to the summit slope of Uncompahgre on one side, and the spectacular ridge of the Wetterhorn and Matterhorn on the other! We were at that point about 13,000' up and decided to turn around, more for the total mileage for the day (which ended up being 13+ miles! Oof!) than the sleet coming down around us and the peak being obscured once we were within the last mile or so. It is big country up here! It is easy to put together "day" trips of 10-15 miles without even trying. Anyway, we trudged back out the 6.5 miles and rewarded ourselves by staying in another cabin (with a tub!) in Lake City last night.

Round-Trip
~13.5 miles
Starting Elevation
9,350'
Maximum Elevation
~13,000'

Click on any picture below to see the slides full-sized.

Redcloud Peak

A solo summit of Redcloud Peak (14,034') with a bit of snow involved.

The following is extracted from my trip journal.

Sunday, Sep. 19, 2004

"Welcome to the round part of the world."
—Mike, typically to himself after doing something non-optimal

Backpacked up through light intermittent rain. Decided to set up camp at "Y" junction heading up to Redcloud. We camped on a flat spot out of the wind by the creek. It had really started to rain and blow a little which hastened our decision! We set up the Hurricane Hole from the inside to stay out of the rain. This is the 2nd to 3rd time I've done this—a bit of a struggle but you stay dry(er).

Then we have sat in the tent all afternoon because it has rained all afternoon. Sigh. Relaxed and played a lot of cribbage and ate a lot of food. It is now after 5:00PM and we may end up cooking in the vestibule.

New snow line on all the peaks down to about 12,500' to 13,000'. Temperature is about 40°. I won first set of cribbage 2-1, Mike won second 2-0.

Monday, Sep. 20, 2004

Blew and rained on and off all night. Is now. Sigh. Thermometer sez it's 35° in tent. Not bad.

"It looks like it's going to stop/clear up (ha ha)."
—Mike and me both yesterday quite a lot, tongue in cheek

Made it solo up Redcloud! Yay! At about 7:30AM it was still overcast and had only quit raining within the half hour. I said we should make up our minds—go for Redcloud if the weather (unexpectedly) turned for the better, or bail if it looked like it was going to be another tent-bound day like yesterday. Then the blue sky patches showed up and started battling against the clouds. For a long time we both thought the clouds would win, and then suddenly it was 50/50 and we decided to go for Redcloud. We packed day packs and were on trail at 9:20AM with broken sky. As we hiked up the valley toward the saddle it became mostly blue sky with some big ugly chunks of storm clouds that would periodically obscure the sun and cause everything to go gray and shadows.

The walk from camp at 12,000' to the saddle was straightforward, even if the final ascent to the saddle was up a steep grade, there were good switchbacks on the trail and it wasn't onerous. The snowline started just above the saddle, which is at about 13,100'. It was just enough snow to help stick to the talus and gravel without it being so much as to be slick or a hazard on its own. Shortly after starting the switchbacks up through the snow toward the false summit, Mike got an attack of dizziness and had to descend. He said later it has been happening to him above timberline for some time now.

I continued on up the slope toward the false summit, then slogged up the snow the last 200'-300' to the actual summit. This actually took less time than I thought it would, especially since becoming subjected to gale force winds once past the false summit. It was windy enough to make you think of blowing off (feet moving, getting "pushed" off balance, etc.) without there being much actual danger of that. I was warm enough, just in intense wind!

I summited at 11:06AM, approximately one to one and a half miles by trail, approximately 2,000' elevation gain. Took pictures of myself, Uncompahgre and Wetterhorn (and Matterhorn), Sneffels, Handies and Sunshine, which was just a mile away and an easy ridge walk to get it, but I didn't trust the weather, and at the time didn't know how Mike was doing back at camp, and I really didn't want to spend another one-plus hours in that wind, so I turned and came down. Back at camp at 12:06PM. Weather turned bad at 1:45PM.

"I think some people are right."
—Mike, first day

Jim wins two sets of cribbage at 2-1 each!!!

Tuesday, Sep. 21, 2004

30° at 6:26AM.

Going to be "interesting" today. It snowed all night and is still snowing now at 6:30AM. Accumulations of about 1.5" of dry "pellet" snow (editor's note: John sez it's called "graupel"). I don't think getting down will be a problem, but driving out on the shelf road may be!!

5:32PM, in Wagon Wheel Cabins #4. Got out to car by 9:20AM. Shelf road wasn't too bad, snow hadn't stuck to it yet so it was just wet and muddy and rough. We ate breakfast at the Tic Toc Cafe, then drove up to Capitol City on the Engineer Pass road. We stopped at the trail heads for both Uncompahgre and Wetterhorn. Since it was snowing at both places we decided to go back to Lake City, rent a cabin, dry out the gear, and head out tomorrow morning. We may try Uncompahgre as a day trip tomorrow. Might still be snowing at that elevation, so could be an adventure!

It sure was nice in Lake City this afternoon (50°-60°) as it was snowing up above. I bought shell pants and shell gloves ($20 and $12) to replace the ones I thought about bringing and then decided against them. Grrr...Mike and I both agree these cabins are nicer than the Town Square cabins.

Round-Trip
~3 miles
Time
2:46
Starting Elevation
~12,000'
Maximum Elevation
14,034'

Click on any picture below to see the slides full-sized.

Pfiffner Traverse Attempt

Mike and I and then I solo attempt the Pfiffner Traverse, a high-alpine thru-hike, in the Indian Peaks Wilderness Area.

The Pfiffner Traverse is the name for a loosely defined route along or near the Continental Divide in the Indian Peaks. This route is described in Roach's guide book. It is not an undertaking to be taken on lightly, given the fact that the entire traverse is "against the grain" of the range, requiring either high altitude (12,000') traverses off trail or constant ascents and descents of various trails, often requiring elevation gains and losses of thousands of feet and up to 10 miles of trail travel out of the way. Needless to say such a fruitless, unknown grind such as this sounded just up my alley! When Mike and I started discussing our first attempt in four years at a long-term (7+ day) backpacking trip this year, the Pfiffner Traverse was the first thing that leapt to my mind. The following is the trip diary I wrote while on the trip.

Pfiffner Traverse Attempt—July 19 to July 26, 2003

Sunday, July 20, 2003

Sitting in tent at 4:20am writing this.

Started yesterday (Saturday) at 7:00am at the parking area at the Hessie trailhead (9,000') It took Mike and me 2:20 to gain 2,250' and six miles to King Lake (11,431'). We did good [sic] until the last mile where it steepens, which really hit me hard. I could tell I had just come from sea level two days before! (I flew back from the UK to Missouri Thursday, then after 4.5 hours of sleep drove for 11 hours to Colorado, then spent the night at John and Sally's in Nederland.)

After setting up camp on a cool but windy ledge looking down the hanging valley and the whole drainage with a waterfall in the valley below us, we ate and then hit Rollins Pass (11,676') above the lake then hiked north along the Divide until we were at a high point just over 12,000' looking over King and Bob Lakes. Great views to the west of Winter Park, etc., great views east down the valley and ultimately out over the plains. We then came down and I down climbed from the pass to a permanent snowfield above the lake and checked that out (very soft in the very warm afternoon).

Hung out the rest of the afternoon until the first of three rainstorms made us hang out in the tent until a break let us cook dinner (not having appetite problems on this relaxed trip. In fact, wishing I had kept more of the five pounds of food I took from my pack at John and Sally's.

Today I want to get an early (5:00am to 6:00am) start to climb the 40°-45° snow slope we saw from on top yesterday. It starts at a tarn above King Lake to the northwest and climbs about 600' to the Divide unbroken. It is wide and convex so I am not worried about rockfall and there is no cornice on top. There are also escapes to the bergschrund almost everywhere. Want to try the crampons on my leather boots and see how that goes. Also want to do it in the morning before the snow gets too soft. It has been hot in Denver (100°) and I think it got to about 80° here yesterday, so the snow gets real soft and slippery.

Monday, July 21, 2003

6:00am, in tent. 45° in tent.

Saw two mountain goats come up over snow—weren't afraid of us at all.

Yesterday was a bitch and because of it our itinerary has now changed. It started well enough. We were up early and walked over to do the snow climb, watching the sun come up as a fiery red ball rising above a ridge to the east at 5:40am. Mike decided not to do the climb, so I strapped on my crampons and went up—the snow was good, very firm. At about halfway up I went for a finger of stone that came down between two of the snow fields going up. The run out below me was not great and I got nervous. Should've finished on the snow but didn't, so made it a mixed alpine climb, about 200' on snow and 200' on rock at the same angle (45°). I then hiked back and was at camp by 6:30 or so.

We then broke camp and left at 8:00. It was easy up to the pass then up a steep hillside. From there we ambled along, dropping our packs to go up Skyscraper Peak (12,383'). We hit Devils Thumb Pass (11,747') and that's where the fun began. Instead of traversing the slope to the left (west) of the main peak, we climbed the peak straight up with our packs on. This was my route choice and it was a mistake because we went from tired to tapped.

We got to the col above Storm Gulch and realized we didn't have the strength to do the remaining traverse around Jasper and Neva. What was worse was the weather had turned (much earlier than the day before, when lightning started at 3:00pm and rain at 4:00) and we needed to get off the Divide. We came back south over a ridge and dropped to 12,000' just below the ridge line and set up camp. Exposed (to lightning) but not real exposed, we were on the only flat spot not on a ridge for miles. So we set up the Hole (from the inside because it had started to rain—some cursing but it worked) and rode out the rain storm. Once it cleared we determined we were sitting just above Devils Thumb Pass. After talking it out Mike wants to descend the trail from the pass down to the west which means about a two day itinerary change. We will probably skip Lost Tribe Lake (sigh) and head "straight" for Crater Lake. Two days of trail hiking down and up again, but whatever. I have to be flexible.

It was beautiful at this campsite after the rain cleared and we just hung around looking down at the pass and down to Fraser in the distance. We had the nice sound of running water, as the melt from the snowfields above us passes about 20' from the tent. And it did not rain again last night—a real plus given our somewhat lightning rod of a position (but we could not have gone farther yesterday without being even more exposed to the storm for quite some time).

Monday, July 21, 2003 (continued)

Well, in an unexpected turn of events, I am writing this on the back porch at the Stoddards' house, basking in the sun. As of going to sleep last night the plan had been to descend the Corona Trail, head down to the junction with the Cascade Creek Trail, and head for Crater Lake, taking two days to do it and getting us back on schedule. That was the plan.

At 5:00am I woke up and at 6:00 Mike informed me he had been up at 1:00 and was now sick, which he was, with active vomiting (multiple times to which I was unfortunate witness) and diarrhea. So then we had to decide which way to go, because at Devils Thumb Pass below us we would be committed one way or another. After putting it to Mike as "Can you stay out another night in a tent?", he said he thought he needed to be out [of the wilderness] today. That meant dropping back to the east side of the Divide and trying to get out in one day.

We left at 8:00 and were at King Lake at 11:40. I had us take a long break there because we were not even close to being halfway done as measured by trail miles. We then hiked the six miles out and were at the trailhead at 2:20pm. A nice couple (thankfully!) gave us a ride to John and Sally's. Oof! 10+ miles in 6+ hours.

Tuesday, July 22, 2003

Saw bunches of mountain goats on drive to Monarch Lake.

Writing this from perfect campsite at Crater Lake (10,343') with Lone Eagle Peak (11,946') literally right out my tent door across the lake. The whole cirque is incredible. Will go up and poke around base of Lone Eagle Peak. Also looking at Cherokee (12,130') to my west.

Hit trail at Monarch Lake trailhead at 8:40an. Made it to [Crater] lake at 12:40pm, 7.3 miles—not bad! Stream crossings were problematic—progressively more so until the last one, below Crater Lake, I forded instead of crossing the single teetering log over 4' deep rushing water. No thanks!

Forced myself to rest this afternoon. There are numerous real waterfalls draining into Crater Lake. I can hear them as I write this. Many have plumes that leave the cliff walls in the wind.

Everything here is way steep.

"The map is not the terrain."—me

"A flash, a bang, and the sudden smell of bacon."—me

Weather was glorious today—70° in tent at 7:02pm.

Wednesday, July 23, 2003

10:00am and I am back in camp—whipped, defeated, turn[ed] aside at every path. I was on trail this morning at 7:00. Perfect day—blue sky, no clouds (yet). I go down to the creek in between Crater Lake and Mirror Lake and the only way across I can find is on a large smooth deadfall crossing the creek upwards from my side at a 15° angle over deep water. My worry was getting back down across it on my way back. So I decided not to explore Lone Eagle Peak.

Then I tried my hand at Cherokee behind me to the west. Roach's description belies the true nature of the slope. I could never find landscape that matched his description for more than 200 yards and then it just got cliffy and steep. So either I was way off course, which is quite possible, of course, or Roach is mad. I'm sitting on a rock on the edge of Crater Lake looking up at that slope, and while it is not technically impossible by any sense, it sure seems like a very steep bushwhack to me. I know, whinge, whinge, whinge.

So then I just went along the lake shore to the south almost to the first waterfall, a good third of the way around. Back to camp, a few chores, and now it's hang out time. Quite disappointed with how I felt today—"lake lassitude" (ha!) But an enforced rest day on my vacation may be just what I need. A day of contemplation. A day of enforced doing of nothing. Can I stand it? Will I survive?)

The weather is just amazing. I am sitting in the sun in perfect comfort. A nice breeze is blowing. There are no (0) clouds as of 10:16. Even the trout are feeding right at my feet. I just looked into the water and saw a trout swim by (really!) Birds, squirrels and insects are chirping, plus the occasional plop! or splash! of the trout, but the sound of the waterfalls, especially the one coming down the cliffs from the Hopi(?) Glacier across the lake from me.

So, what has kept me from doing what I wanted to do this morning (stream crossing), and what "made" me ford the last crossing yesterday instead of taking the "bridge" (one log, tilted, deep stream) is a fear of crossing running water (duh). This has troubled me for at least 10 years—I can remember a particularly heinous stream crossing higher up on the Pawnee Pass Trail (still in Cascade Creek valley, though from my first trip through here 10 years ago). It would be great to conquer this, because it hinders what I want to do and ultimately what I can do (or will do). To have faith enough in my own sense of balance is part of it, and of course I've never felt that I had a good sense of balance.

I am somewhat more cautious this trip now that I am solo. Even with Crater Lake being "crowded" (I've counted six other people here in the last day) the places I am (trying) to go are such if I hurt myself nobody could hear me nor would be coming that way again (this year).

So it is disturbing to see me remaining cautious, even while I want to break out of it. Sigh.

Thursday, July 24, 2003

5:00am, in tent. Raining. At Gourd Lake(10,800').

Left Crater Lake at 7:20am this morning. Could not cross the first log bridge! Tried marching right up to it and getting on, but something in my head just says "No". I think the biggest problem with it is the top is at an angle.

Anyway, I had my Tevas handy and so after extensive scouting to see if there was somewhere I could cross without using the log or getting wet fording (almost jumped one place—jump being the operative word—from rock to rock, with pack on) I put the sandals on and just forded it again (this time keeping my boots dry—duh). Was across at 8:00. Walked down, down, down to where the Buchanan Trail forks off—I think I did about 10 miles today—five down and five up! Stopped and enjoyed the many incarnations of Cascade Falls. Reached fork in path a little after 10:00. Then it was a mellow walk uphill (Buchanan Pass Trail has some uphill parts, but nothing like Cascade Creek!) until the Gourd Lake turnoff.

This was basically 16 switchbacks uphill over about three miles. It was heinous but predictable. Just a grind. Made Gourd Lake (finally!) about 1:40pm. Over six hours on trail! Have not done much of anything since setting up my camp on a promontory on the east side of the lake looking right up at Cooper Peak (12,296'). Four guys are camping just past me to the north and that's it.

The real problem will be climbing the slopes to the north and west of Gourd Lake tomorrow to get access to Cooper Peak! Looks to be hard work coupled with a route finding problem. Nothing impossible, just hard and hopefully I find a way up to Cooper!

Wildflowers have been beautiful this trip. This campsite has columbine (my favorite) and Indian paintbrush. Had the honey smell above timberline on the last two days with Mike. Have walked through more flowering meadows than I can count. Perfect weather for them and right time, too (my birthday plus or minus a week seems to be good wildflower times in Colorado).

Friday, July 25, 2003

11:06am in camp at Gourd Lake. Beautiful weather as usual.

I was up and "on trail" (very quickly off trail) at 6:00am. The secret to gaining the saddle above Gourd Lake is to go counterclockwise along the lake, first at the shoreline, then on the rocks right above it until you cross above the waterfall that feeds into the lake on the northwest side. After that you cross a little beaver meadow then "follow the grass", first along the creek, then breaking away to the southwest, finally angling up northwest until you hit the far left hand side of the saddle (as seen from Gourd Lake). From there it's down a gully with some easily recognizable snow fields (good for finding it on the way back!)

I never did descend all the way to the lakes as I saw no need. Instead I traversed around the cirque at about the height of the saddle I had come over (plus or minus 100') until I was somewhat under the saddle between Marten (12,041') and Cooper Peaks. From there it was a very steep "grass" and scree/talus climb with most of the time ultimately being spent on talus. Even reaching the saddle ridge was no break, and in fact on the Cooper side the climbing got worse for a while before breaking out into a talus/tundra mix. The peak to Cooper is actually not visible from Gourd Lake—that is a false summit. The summit is on the northeast side of the peak. Made it there at 8:00. Two hours, not bad! After filling in the summit register (Ken Nolan last October, Ken Nolan and friend 7/4/2003, then me) I descended to the false summit that looked down over Island and Gourd Lakes. The views all around were amazing, with the peaks around Lone Eagle cirque clearly visible to the south.

From there I descended to the saddle reaching it at 9:00. I then decided to try Martens, and made it to the base of the summit blocks (about 75'-100' high) and try as I might couldn't see a route up that I wanted to do solo on a peak that probably gets one party a year (if that, and this year it was me). So I was "close enough" for me and descended back to the saddle, and then a long return trip back to the lake, all with no major route finding problems. Back at camp at 10:30.

So Coopers was the one thing I really wanted to try and I did it, and I did it solo, and I did it with no trail—cool. The trip may have had its disappointments, but as I sit in the shade of the seventh perfect Colorado day on the shore of a lake in which I watched two cutthroat trout swim by me just minutes ago (water so clear you could see their "cut throat"), I can't complain. If it hasn't turned out as planned it was still a good hard workout in the wilderness and even with most of it solo I was going strong. Need to conquer a few fears (stream crossing) but did work on one this trip (route finding) and climbed a peak that gets 2-4 people a year, tops.

Columbine everywhere—at one point I was using them for route finding, as in "many bad choices, so take the route with the lucky flower." Corny, but as good as anything.

Some trip stats:

1) Averages for trip: 6.7 miles/day, 1,456' elevation gain/day

2) Weather: 45°-80° during the days, averages between 55° and 70°, daily rain for an hour between 1:00 and 6:00pm.

"Harder than it looks, especially with 50 pounds on your back."—me

"The map is not the terrain."—me

4:11om—raining, in tent. Ate. Tired. Thinking about tomorrow. Big flash and bang about six seconds after just now! And there are still two dudes on the far end of the lake fishing! Not me—waving a wet rod with some metal in it above my head while standing on a wet rock and connected to the water by the wet filament. Fun! Not!

Food was gaggable. Three [protein] bars during day, an MRE tonight. Still have bars and gorp, am getting to where I detest both! But I just have to march out tomorrow. If all goes according to plan, should be at Monarch Lake before noon, to John and Sally's before 3:00pm regardless of which way I go (Berthoud or Trail Ridge). BIG thunderstorm going over now.

Saturday, July 26, 2003

Left camp at 6:40am, was at Monarch Lake at 9:40—woof! Took me 1:07 to get from Gourd Lake to the junction with Buchanan Trail—2.7 miles. The rest was just a trudge—8.2 miles in three hours with two 10 minute breaks. Not bad. Then drove back through RMNP over Trail Ridge and was back at Nederland at 1:00pm. A good trip!

Click on any picture below to see the slides full-sized.

Mt. Lady Washington

John, Sally and I climb Mt. Lady Washington (13,326') and enjoy some great views.

Following is from my trip report at the time.

We started at the Longs Peak trailhead at 9,410' at about 7:00am (not quite an alpine start!) It was a fairly rapid hike up the 4.5 miles to Mills Moraine. Above treeline the snow was patchy, being windblown and packed where there was still snow cover (pretty standard for Longs Peak this time of year). We stopped and had a quick "brunch" not too far from where the trail splits between the route to Chasm Lake and the Boulder Field. At this point Mt. Lady Washington was in full view in front of us. It didn't look very high or hard, but then John reminded us that (a) our view was very foreshortened, looking straight at it, and (b) the elevation gain from where we were standing to the summit (less than a mile) was equal to the elevation gain we had just hiked up in 4.5 miles.

At this point Sally decided to descend back to the car—her feet were giving her trouble. John and I wanted to summit, so we set off up the broad slope of talus towards the top. It was not technically hard at all, just a boulder and talus mix with snow in patches between. The biggest issue climbing this type of slope is not spraining an ankle by slipping off a rock into a hole. And since all the boulders are balanced against each other and can move at a moment's notice, that can be challenge enough! Anyway, we slogged up the hill, with John pulling far out into the lead. I was happy to be heading uphill at all, given my lack of acclimation—it had been almost a year since I had been over 13,000'.

After an hour I finally reached the summit (13,281'), finding John comfortably esconced behind a rock out of the wind. He had already taken a bunch of pictures, because the views from the top were quite fantastic. We were staring across the cirque created by Chasm Lake right at "the Diamond" cliff face on Longs. We could see all the standard features on Longs peak—the Loft, the Notch, the Diamond, Broadway, the Keyhole. In the far distance to the west were the Flat Tops, and to the north across RMNP the Mummy Range was beautiful. To the east were the Twin Sisters, and then the plains, clearly visible over 20 miles away, spreading out forever to the horizon. To the south was Mt. Meeker (13,911' and a future goal of mine).

We then started down, heading more and more to the left (north) as we descended. John was trying to find a quicker way down than what we had come up, but ultimately it was all about the same. I was getting pretty wobbly legged from the effort at altitude (like I said, I wasn't very acclimated), and when we had to cross a couple of moderately steep snowfields asked for one of John's poles to use as a brake if I started to slide. After negotiating those we hit the trail about a 1/2 mile north of where we had left it, and quickly hiked the 4.5 miles back to the trailhead and car, where Sally was waiting. We arrived back around 2:00. So it took us approximately seven hours to hike 11 miles round trip, with an elevation gain of almost 3,900'. Not great, but with me being out of practice not bad, either.

Round-Trip
~11 miles
Time
7 hours
Starting Elevation
9,400'
Maximum Elevation
13,326'

Click on any picture below to see the slides full-sized.

Mt. Lincoln Attempt

A winter solo attempt on Mt. Lincoln gets close, but not quite.

Following is from a trip report.

On January 6, 2001, Mike and I returned to Mt. Lincoln to attempt a winter ascent from the north side, starting at Montgomery Reservoir (10,950'). We car camped in my van overnight on the 5th (nice memory: awakening to a beautiful day and turning the van radio on to get the weather and hearing U2's "Beatiful Day" on the radio). We got an early start around 7:00am on the morning of the 6th, hiking around the west end of the reservoir and then up the slope towards the ice falls (there is a popular ice climbing area on the north side of Mt. Lincoln). As we approached the ice falls Mike began having problems, mostly with the snow depth and steepness of the slope. I was doing OK because I'm taller and was able to thrash my way up, putting on crampons (which Mike didn't have) at the side of the falls. At that point Mike decided to descend, which was probably wise, since there was no good run-out point if he slipped and fell, and he was really in some waist deep snow, and even if he made it out of that, there was some ice to negotiate before we would break above it.

I then continued on, making it past the side of the ice falls (only had to be on the ice for a short bit, and the crampons worked great). Above the falls I then took off the crampons and continued up the Lincoln Ampitheatre, a former glacial basin rising west towards the summit. I finally made it out of the ampitheatre by climbing a talus slope at its end to the right, and then could see the summit quite clearly about 800' above me. The weather was perfect, and everything was poised for a summit attempt except my boots. I was wearing my plastic mountaineering boots, which aren't meant for a lot of hiking (more for vertical climbing) and they were killing me at this point, especially my shins, where it felt they were grinding the skin off.

So I decided to descend, but then made a stupid mistake. I didn't want to go back down the way I had come up, because I thought the severe angle would just kill my shins even more (and I wasn't too hip about down-climbing by the falls sans rope, crampons or no). So I walked along the ridge above the ampitheatre, aiming to descend into the trees east of the falls and end up by the dam on Montgomery Reservoir. What an epic! It was way longer going down this way, and once I was in the trees the north-exposed slopes were deep in powdery snow. Without snow shoes the post holing through the snow in my plastic boots was murderous. It just became hour after hour of walking in pain, plodding on, knowing I had to get down, and worrying about Mike worrying about me the later it got. My shins felt as if they were hamburger, and I was starting to get tapped from the effort (as always, I didn't take enough calories to eat, either).

I finally made it to the dam around 2:00pm, only to see a sign restricting access to it. I thought "whatever" and walked across it anyway—it would be worth a ticket to avoid another mile or more walk around the west end of the reservoir. As I came off the dam Mike was driving by in my van (he had been driving up and down the road trying to see if I had come out somewhere other than I went up, which obviously I had), so he picked me up and we drove back to Breckenridge for some food and to heal me legs. It had taken me only about two hours to reach my high point, and then five hours of painful drudgery to get down. What fun!

Round Trip Time
7:00
Starting Elevation
10,950'
Maximum Elevation
~13,400'

Click on any picture below to see the slides full-sized.

Pettingel and Citadel Peaks

I climb Pettingel and Citadel Peaks on a great weekend, with an "interesting" descent from Citadel.

Mike and I have been up Herman Gulch so many times I've lost track. We've day hiked it in the summer, snow shoed it in the winter, and done both winter and summer camping trips to Herman Lake. It's convenient to get to, being just an hour if you drive fast up I-70 from Denver, with the trailhead at the last exit before Eisenhower Tunnel. You can still hear the highway for the first half mile of trail, but then once you've reached the hanging valley and begun the long walk towards Herman Lake it gets quiet and feels like it could be miles from anywhere. Of course this is belied in the winter when we've heard them shelling the nearby hills with howitzers to trigger and clear avalanches before they threaten either the tunnel or Berthoud or Loveland passes, all of which are relatively close. It is a strange feeling to be camped in one valley and hear shells landing in the next valley over!

The following is extracted from a trip report for the weekend of July 21-23, 2000, when I summited both Pettingell and Citadel Peaks.

Mike and I left town at 1:00pm on Fri. and headed up to Herman Gulch. We hit the trailhead (10,300'—last exit before the Eisenhower Tunnel on I-70) a little before 2:00. We then pounded out the three plus miles to Herman Lake (12,000') in a little over an hour and a half, and had camp set up in a sheltered bit of krummholz 100 yards south of the lake by 4:00. Mike's feet were hurting from his new mountaineering boots, so he hung around in camp while I said, "I'm going to go up on that shelf over behind the lake." I quickly made the 12,300' shelf west of the lake, and then looked up at Pettingell Peak (13,553') rising northeast above it, one of my goals for the weekend.

My mind then went into this weird mode of playfulness I get into some times—"I will just see how far I can go by 5:00" (it was about 4:15 at the time—in the back of my mind was summiting, but in that mode of thinking, I never admit it to myself). I started up the steep scree slopes, which were quite loose, most of the rock lying right at the angle of repose, and sliding out as I scrambled up. By 5:00, I had made the 13,300' col between Pettingell and Point 13418 to the south. Since Pettingell's summit was only another 200' feet in gain, I quickly summited it, reaching the top at 5:10. What a great feeling, to pull off something a day early, on a lark.

I then went a little ways east along the summit ridge, and then descended another scree slope, even steeper than the one I went up, but with the benefit of deep loose scree on a 45 degree angle slope, I was able to "rock glissade" quickly down 600', then worked my way through some minor cliff bands down to the back side of the lake, and then back around to the campsite.

There were two or three other tents up in the area Friday night, and while we were cooking dinner, our closet neighbor came over to use our stove—his had broken after successfully cooking his girlfriend's dinner, but before he could get his done. We talked with him for a while—nice guy named Michael. They were out for 10 days from Virginia, and were going to do a snow couloir up Citadel Pk (13,294'), a rugged looking peak with an impressive summit block to the southwest of the lake that dominates the valley. My plan for Saturday was to climb it, because Mike and I had been up on its side quite a ways on snow shoes a few winters ago, before snow conditions turned us back, but I didn't like the looks of that couloir at all—going up through cliffs, it was at least a 45° degree slope most of the way, and since it was east-facing, and given the crumbly look of the surrounding rock, looked like a good place for rockfall as well. They had the appropriate gear (ice axes, crampons), but we did not. So we decided to go up to the pass to the south of the peak, and then work up from the south ridge.

In the morning, we got a decent start off at 6:00am, about five minutes behind Michael and his girlfriend. We traversed around the valley head towards the bottom of the pass. On the way, we passed an area that had the most columbine blooming in one place I have ever seen. This has actually been a good summer for wildflowers (which is strange, considering how dry it's been), and all sorts were blooming in profusion in the high reaches of the valley. After crossing the upper reaches of the creek, we were at the game trail leading up the last 200' to the 12,400' pass. Mike told me his feet were really bothering him, and if I saw him turn back (he is usually slower and somewhat behind me on these things anyway—bad knees), that I should just keep going, and this is what ended up transpiring—he ended up only making about another 200' from the pass before returning to camp. My master plan was to try and do a full ridge traverse around the head of the valley, but that depended on finding a way completely over the rough ridges of Citadel Peak.

I started ascending the south ridge of Citadel, and when I reached the foot of the main summit block, was confronted by three steep gullies going through 100-150' of cliffs. I tried the rightmost (E) gully first, but reached a place within that was overhanging—I am sure John and Sally could have made short work of it but it was a little too much for me, considering the exposure, so I descended. The middle gully didn't look appetizing at all, so then I tried the leftmost (western) gully. It went OK, mostly a series of ramps going up at about 45° degree angles, but about halfway up, there was an iffy part where I had to decide to really commit to it—the rock was somewhat rotten, the holds a little tenuous (for me), and I knew once I had made it past that part, I would not be able to downclimb back down it. I made it through OK, but with a few places where I did not linger because the holds were not in a shape to do any more but kinda crumble, move, and fall away as I passed over them. I then was moving over rocky but OK ground, with excellent views of the Williams Fork Mountains directly below me to the west, with the Gore Range rising rocky and majestic beyond them. Holy Cross was clearly visible in the distance as well.

I was now on the south block of Citadel. I downclimbed a small gap in the cliff to the col separating it from the higher north block (this was fairly short, but hairy for me, especially since it required me to actually downclimb facing into the cliff—I am still not very good at that sort of thing, where I can't see far and can only see to the next foothold). This col is the top of the snow couloir Michael and his girlfriend were going to try. I noted that I could escape off the west side here, if I needed to, but it would be down a heinous scree gully, and I would end up having to lose 1,000' in elevation, and then traverse over and re-climb that same 1,000' to regain the pass and pass back over into Herman Gulch. But since I was still feeling OK (a little nervous—after coming back and reading the guide book, it notes there is some "tricky scrambling" at the top of Citadel, which really was more full hands and feet climbing, IMHO), I decided to keep going on my original plan.

I made it up the other side of the col, and quickly reached the main summit of Citadel at approximately 7:15AM. I stopped for a food and water break, and then kept moving along the rocky ridge, encountering cliff bands constantly, but always being able to work around to one side or another, and find some small shelf to get by on. Of course, the exposure and the fairly poor condition of the rock (which made these shelves, some only a foot or so wide, consist of lots of loose rock and dirt) were a little nerve-wracking to my amateur mind. But I always try to remember John's little dictum of "Don't decide to turn back, make the mountain make you turn back," and so I kept going, because there hadn't been anything too bad yet, although there were places (the gully ascent, the descent to the col), that had definitely had my adrenaline going.

But I finally reached a point, about 1/4 mi. along the ridge heading north, where I reached a real cliff—I would estimate it at 100-150'. I tried both sides. To the east was a small and very precarious looking ledge that seemed to terminate in thin air before getting past the cliff band. I didn't like the looks of it at all. I then went around to the west, and descended a ways along a series of rubbly ledges, until I was faced with the choice of descending at least 500' down yet another scree gully, with no clear hope that I'd be able to work my way back up to any place to regain the ridge farther on, since the ridge was curving to the right (northeast), and I couldn't see clearly beyond the rib forming the far side of the gully. I didn't want to count on being able to regain the ridge, since the north side of the Divide at this point is the rockier, steeper side. I finally had to admit I was beaten. If John were along, he could have found a route and coaxed me through it, I'm sure, but with the rock being in the condition it was, the exposure being high, and being by myself, I decided "He who runs away lives to climb another day."

I headed back south along the ridge line, and then started heading along a series of ledges through the east cliffs towards the snow couloir. From the top, the couloir didn't look so bad, so I thought I'd try and climb down the side of it, instead of heading down the west side losing all that elevation, and regaining it back to the pass and crossing back over to the east side there. Big mistake. After a few touch and go places where I almost slid and fell on the loose rock I was descending (and feeling like the mountain goat I saw above me to the north was laughing at my amateurish efforts), I finally made it to the couloir about 200' below the col, 600' from the bottom. Right when I hit it, Michael and his girlfriend were passing by. We had a nice chat, with me bravely hiding my concern about my descent choice. I had the presence of mind to ask if there were any people below us, because I knew I could be letting rocks loose in my descent down the rubbly side of the couloir, but there were not. I wasn't as worried about them being above me, since they were sticking to the snow, although there was one good sized rock that came by me on my way down, but whether it was released by them, or just the warming sun, I don't know. The snow slopes at the bottom were covered with little trails leading from above, each ending in a rock, so rockfall was common here, as I had thought it would be.

After they had passed, I then started down. The snow itself was in no condition for me to be on it in just boots—soft on top for an inch or two, but quickly hardening underneath, and STEEP, with no good safe run out at the bottom hundreds of feet below. If I started sliding on it, I would be seriously hurt or dead by the time I reached the rocky bottom. So I stayed to the left side of it, edging along the cliffs, sometimes passing above the snow on a ledge, sometimes squeezing through the crack between the ice and the cliffs, sometimes "crabwalking" down, one foot on a protrusion on the rock, the other on a step I'd kicked in the snow, or on the edge of the ice. There were multiple places where I was brought up short by lack of good options, but knew I had to get down, and I knew I did not want to get hurt, so I would calm down, consider which option sucked the least, and get through it somehow.

I finally made it to a rock outcropping in the middle of the ice, where, when seen from the bottom, the snow looked like it made a "Y" around it—I could not keep going down the left side, since I did not like the looks of the cliffs at all, and the snow steepened in the same place. There was a little place to cross over to the right side, but it involved traversing over about 15' of really steep snow to gain some rock that then became a steep talus slope heading all the way down to the bottom. At this point shifting, rolling, ankle-grabbing, steep talus looked like a warm comfortable bed at home to me in comparison, so I knew I had to make it across that narrow branch of snow.

I took a sharp rock in my hand, imitating what I had seen John do a few weeks ago (and also knowing it would be futile to stop me if I slipped—most likely it would simply be something I'd let go of in my slide, only to deliver the crowning blow to my head whenever my slide would stop), and started to slowly, slowly kick steps across the snow slope. I would estimate it was at least a 45° degree slope where I was crossing, steepening right below me. I had no room for error. I took my time, and that 15' probably only took two minutes to cross, but it seemed like 15. I was completely there in a meditative sense—totally focused. I finally stepped onto the wet rock on the other side, and quickly scrambled up onto the talus slope. I would normally have been elated, but this time I knew what I had accomplished at a deeper level, and was simply grateful, and somewhat shaky.

I then began to quickly descend the talus slope. With the right boots on, and in the right, "mindful" state of mind (which I maintained —I did not want to crown safely descending the couloir with breaking a leg or ankle in the last few hundred feet of descent because of lack of focus), it was short work to reach the headwaters of the creek, and then begin the traverse along the south slopes of the ridge. I was back to camp by 10:00. Not a bad four hours of work!

So, with two 13ers on the Continental Divide under my belt in less than 14 hours, and with living through the second one, I had enough of a sense of accomplishment for my mind and ego for one weekend, and since Mike's feet were bleeding, blistered toast (but only for going uphill, not for descents), we decided to break camp a day early and head out. I ate first, because I was completely bonked after my descent, and then we headed out at 11:00, reaching the trailhead by noon.

Pettingel Peak

One-Way Time
1:10
Starting Elevation
~12,000'
Maximum Elevation
13,553'

Citadel Peak

Round Trip Time
4:00
Starting Elevation
~12,000'
Maximum Elevation
13,294'

Click on any picture below to see the slides full-sized.

Mt. Parnassus

One of the many times I've been on Mt. Parnassus (13,574').

The Watrous Gulch trail shares a trailhead with the Herman Gulch trail, and hence is easy to get to from I-70, about an hour from Denver. Therefore Mike and I have been up it quite a few times, both together and each solo. We've climbed Mt. Parnassus, a 13er that makes the east border of Watrous Gulch. We also climbed Woods Mountain in the early summer of 1999, which terminates the valley on the north end.

During one of my solo hikes I climbed Mt. Parnassus in fairly record time on July 18, 2000. Mike and I have both done the same route independently (it seemed obvious to both of us), using the more pedestrian route most people take for our descents. Here is the trip report I wrote after that climb.

I needed to get out of the house today and clear my head over some things, so I drove up into the mountains and did a 13er.

I arrived at the Herman Gulch/Watrous Gulch trailhead (10,300') at 12:30pm—this is the last exit before the Eisenhower Tunnel on I-70. I took the Watrous Gulch branch which angles northeast with the goal of summiting Mt. Parnassus (13,547'). After walking along the trail for about 1.5 miles, I decided to head straight up the side of Mt. Parnassus, as opposed to going the typical way, farther on up the trail and then to a 12,500' saddle between it and Woods Mountain (12,940'—Mike and I summited it last summer). I followed a creek drainage first (sliding down the bank into it at one point and really bruising my right palm), and then started an angling traverse up the slopes, until I made a shoulder at about 12,500' at about 2.5 miles, one hour after leaving the trailhead. From there, I went on up to the top with little mishap. I summited at 2:15, making that 3 miles and almost 3,300' of elevation gain in one hour and 45 minutes. Not bad. Not quite the 6MPH John and I pulled off in the first hour on Sat., but then, there was much more elevation gain and slope angle today (I'd estimate the route I took, after leaving the trail, averaged 40° overall).

The views from the top were excellent—Pettingel Peak (13,553'—a goal of mine, since Mike and I have been to over 13,200' on it, and then turned back because of snow conditions) clearly visible on the Divide up Herman Gulch drainage immediately to the west. The Flat Tops were barely visible to the northwest, then the Gore range in the western distance, then the Sawatch range (very clear view of Mt. Holy Cross) and Ten Mile/Mosquito ranges. I had very good views of Torreys and Grizzly Peak> right across the Clear Creek drainage (and I-70) to the south, an excellent view of Bierstadt and Evans and the Sawtooth Ridge between them to the southeast, and good views of the Front Range all the way up past Longs Peak, and Middle Park and the Never Summer Range to the north. There was some cloud buildup, but nothing dangerous—in fact, it is more cloudy here, now, then it was on the peak up there at 2:30.

I descended by running to the saddle (as well as one can run in mountaineering boots), and then came back by the normal trail, breaking into a jog once in a while, just because it felt good. Returned back to the car at 3:30, resulting in a six mile round trip in three hours total time (counting breaks and a 20 minute sojourn on the summit). Other than my wounded paw, I feel great, and my head is clearer. Amazing what a little real perspective can do for your internal perspective. No pictures this time—I went fast and light, reveling in my new ultralight knapsack John and Sally gave me for my birthday.

Round Trip
~6 miles
Time
3:00
Starting Elevation
10,300'
Maximum Elevation
13,574'

Click on any picture below to see the slides full-sized. Some are from an earlier trip up Woods Mountain.

Devil's Thumb Pass

A very fast jaunt to beautiful views on Devil's Thumb Pass (11,747').

Devils Thumb Lake and pass (so named due to a rock spire by the lake) are one of many places in the Indian Peaks Wilderness Area that I have gone to multiple times. Its beauty and proximity to Boulder make for an easy choice when you can't think of anything else to do. I have no real trip reports, but one of the hikes I made to the pass with John stands out because it pretty much set a record for me for distance traveled and elevation gained. On July 15, 2000 (my 40th birthday!) we did the six miles between the Hessie trailhead at 9,000' and the pass at 11,747' in an hour. Six miles of decently steep uphill (2,700' elevation gain) hiking in an hour is an accomplishment! When we were talking about it at the pass, the conversation was along the lines of "That was some pace you set there, John." "Me? I was just trying to keep up with you!" So it must have just been one of those little male competition things happening subconsciously on both sides!

One-Way
~6 miles
Time
1:00
Starting Elevation
~9,000'
Maximum Elevation
11,747'

Click on any picture below to see the slides full-sized.

Squaretop Mountain

Two (of my three) climbs up Squaretop Mountain (13,794'), these both within a week.

I have summited Squaretop at least three times (once solo, once with Mike, once with John and Sally) and taken others up to piddle around on its lower slopes a few more times. Quite conveniently located by Guanella Pass, it can easily be reached from Denver in an hour or so. The following is extracted from the trip report I wrote after summiting with Mike on June 25, 2000, but the photos are with John and Sally the following weekend, July 2, 2000.

We left the house this morning at 6:00am, and arrived at the trailhead at the summit of Guanella Pass (11,669') at approximately 7:35. The parking lot was already crowded with people heading east from the pass to climb Mt. Bierstadt. The sky was originally overcast, but the clouds did not look threatening, and halfway through the trip they cleared off (although some rain just missed us, falling to the east of us), and we returned before the afternoon thunderstorm clouds were very dense.

Mike and I went west from the pass, with our goal being Squaretop Mountain (13,794'). First, we reached the ridge running roughly west towards Point 12739, and reached that with no difficulty. We then walked down and across a small saddle connecting that point with the northeast ridge of Squaretop Mountain. This was certainly less hard than the scree slope on Mt. Sherman yesterday. We climbed approximately 400' of the 600' NE ridge following the ridge line, until reaching a slightly steeper section, then traversed to the south across a gap in the snow field that paralleled the ridge its entire length. From there, it was a fairly simple climb to the summit ridge, which is long and moderately flat, gently rising to the real summit about half a mile from the ridge, and then gently descending another quarter mile or so. We reached the summit at a little before 9:30, having gained 2,000' vertical feet in three miles. This long flat summit ridge gives the mountain its name, because when viewed from South Park, it looks square on top. From the pass, it looks like a pointed peak, but in reality, the summit ridge runs for a good ¾ of a mile before dropping off rather steeply on the west side. We then returned the same route, reaching the car shortly before 11:00.

There was little talus or scree on the slopes, so this was rather an easy climb. It was worth it, however, because the views from the top were spectacular, with us benefiting from a break in the cloud cover right as we were reaching the summit ridge. We could see the Mosquito/Ten Mile Range to the west (which is where we were yesterday on Mt. Sherman and Mt. Sheridan), the Gore Range to the northwest, Grays and Torreys fairly close at hand (four miles) to our northwest, the Front Range and Mt. Bierstadt to our east, Pikes Peak to the southeast, and South Park directly south of us. We also found a new place to camp in the valley directly to the west of Squaretop, at Shelf Lake, a small lake at 12,000' completely ringed by mountains, with the drainage accessible from a rather dramatic gap in the rocks to the south via Geneva Creek Rd. Additionally, while neither of us felt quite so spry as yesterday's attack, we both felt good (no soreness or stiffness), and were quite happy with the overall trek.

We only met two other people, and that was below Pt. 12,739 on our return. It is amazing—there must have been well over 100 people attempting Mt. Bierstadt directly to the east because it is a 14er, while we had a perfectly beautiful (and more difficult) high 13er to ourselves. Mike and I are convinced the high 13ers are where to concentrate our energies, because they are often more difficult, and always much less crowded than the 14ers.

So, all in all, another good day, and with two high 13ers and a 14er under our belt, an excellent weekend.

Round-Trip
6.5 miles
Time
3:25
Starting Elevation
11,669'
Maximum Elevation
13,794'

Click on any picture below to see the slides full-sized.

Mt. Sherman and Mt. Sheridan

Mike and I "kick it" on Mt. Sherman (14,036') and Mt. Sheridan (13,748').

An easy 14er we climbed on June 24, 2000, made better by both Mike and me feeling especially fit that day. The following is a trip report written the same day. Unfortunately no pictures from this outing.

Mike and I drove off to do Mt. Sherman, a 14,036' peak located directly east of Leadville, and southwest of Fairplay, leaving at 5:00am(oof!). We arrived at the trailhead and were off shortly after 7:00, with extremely clear, beautiful weather. The starting elevation was just a little shy of 12,000', near where the road grew really rough (the road was gated approximately 200 yards past where we parked). The area around Mt. Sherman saw extensive mining in the past, so the first part of the journey was simply a walk up some old mining roads past mining buildings in various degrees of decay, including a mineshaft and headframe with railcar tracks between them intact—a real rarity. When we reached the Hilltop Mine area at 12,800', we decided not to take the "trade route", which goes up an easy slope to a saddle at 13,000', since the resulting path looked too easy and also longer. Instead, we took an "alternate route" up a very steep scree slope (calculations with topo map and ruler indicate 55° average—we spent a lot of it taking one step forward and half a step sliding backward). This was much harder, obviously, but also allowed us to very quickly gain 800' in elevation in about half an hour while bypassing at least a mile of the normal route.

Upon reaching the ridge at between 13,600' and 13,800', it then became a very simple ridge walk to the summit ½ mile away, with the last 400 yards being relatively flat near the summit. We reached the summit cairn at 8:30. This means we did 2,000' of elevation gain in about two miles in an hour and a half (1,300+' of elevation gain an hour is not too bad for two old farts like us—not at that starting and ending elevation). The views from the top were terrific, due to the fine weather. We could see the Sawatch Range to the west of us, across the Arkansas Valley, from the Mt. of the Holy Cross well down into the Collegiate Peaks by Buena Vista. We saw the Gore Range to the north, most of the Front Range including Bierstadt and Evans, and Pikes Peak across South Park to the southeast. Most of the mountains are already pretty clear of snow, but Mt. Massive straight west of us had an abnormal amount of snow pack still on it—it really stood out from its neighbors.

After admiring the views for 15 minutes and chatting with two other men who had summited just before us, we decided we were feeling good enough to try the neighboring Mt. Sheridan (a talus cone at 13,748'). So we descended a mile to the saddle, and then worked our way up the slope for 750' of talus and scree, summiting Sheridan at a little after 10:00. We both still felt great, one of those days when everything just clicks, the muscles feel good, the aerobic system is working efficiently—a wonderful feeling. After hanging out for a bit, we descended back to the saddle, and returned via the normal route down to the Hilltop Mine, and then walked back down to the car, reaching it at about 11:00. I would estimate the entire day's mileage at a little under 4 miles. So in four hours we had done 2,750' of elevation gain, and the entire trip time included two breaks for food and water and two stops at the summits. By this time the normal route up Mt. Sherman was fairly busy, which was disturbing, because the afternoon thunderstorm clouds were building early and already looking pretty angry in places around the summit, and most people seemed to be moving really slowly, especially considering the ease of the trade route. I am glad we were off the peaks when we were—those people are braver (or stupider) than we were!

Mt. Sherman is rated as one of the easiest 14ers (if not the easiest), and now that we've done it, I would agree. The guidebook says to give it up to 6 hours roundtrip, but we summited in a quarter of that time, and if we had simply returned straight to the car, probably would have done the route in 2.5 hours. Of course, taking the harder route up the scree slope because we wanted the exercise helped shorten the time and route mileage immensely—we only saw one other person take that route the whole time we were there. All in all, a great outing. Tomorrow we plan on doing Squaretop Mountain, a 13,794' peak about 1.5 miles west of Guanella Pass. Hopefully the mountain gods will smile upon our endeavors two days in a row!

Round-Trip
~4 miles
Time
4:00
Starting Elevation
~12,000'
Maximum Elevation
14,036'

Quandary Peak

Mike and I tried Quandary Peak (14,265') on May 27, 2000, with me summiting but Mike having to bail because of bad knees.

The following is from the trip report I wrote the same day. Unfortunately I went "lightweight" that day and took no camera, so no pictures.

Well, the weekend hasn't turned out like planned so far. We went up to the base of Quandary Peak (14,265'—one of the easy 14ers, although less so when covered with snow—read on) southwest of Breckenridge and car camped last night. It snowed about an inch or so overnight. We then hit the trailhead for Quandary at 6:20am with a day that started mostly clear and rapidly became very clear. We broke out of the trees in under a mile, and then it was just a two mile ridge walk to the summit. "Just" in this case, however, was on packed, icy and blown (and blowing! It was windy this morning) snow, which was very hard when we started up it. With the incline on some of the upper slopes, a little care was in order to not start sliding in a way that couldn't be stopped.

At about 13,000' I noticed Mike had stopped back behind me on the ridge. This isn't that unusual (to go up somewhat spread out), so I just kept going. Then I noticed he wasn't coming up any farther. At first I figured the slope with the fresh snow on top of the old hard pack was perhaps keeping him down below. He didn't appear to be waving or trying to attract my attention, and I didn't want to lose the 250-300' elevation gain I had made above him by that point. So I kept going and summited at 9:00, and after spending about 15 minutes up there admiring the views (especially of the Sawatch Range to the west and southwest, and the Gore Range to the north—both spectacular) I headed back down. I met a man on the way up that told me that Mike had hurt his knee and was headed back down, but going slowly so I should be able to catch him.

Coming down between 9:15 and 10:00, the snow had already softened so much from the sun that what was somewhat anxious going in places on the way up due to hard snow and slope angle was reduced to plunge stepping and post holing on the way down—not scary at all—just work.

I caught up with Mike at treeline, and we went the rest of the way down together. He was hobbling some and in pain, but mobile. It turns out he had been stepping across a boulder field and had not realized where he was stepping was actually a hole because it had new snow in it and blown across it, and his foot went into the hole, his body leaned one way, his knee the other, and pop! We made it back to the car by 11:00, and were eating in Breckenridge by 11:30, and were home around 2:00. He seems to be OK now, all things considered, but will probably be sore for some days.

Official trail guide mileage and elevation gain: 6 mi. round trip, 3,365' elevation gain. Round-trip time, 4.67 hours. Given that the guidebook says this route should take 6.5 hours in the *summer*, I don't feel bad doing it in about 25% less time, given the snow, and the descent with a slow partner.

Round-Trip
6 miles
Time
4:40
Starting Elevation
10,850'
Maximum Elevation
13,265'

Grizzly Peak

It takes two attempts, but we finally grab Grizzly Peak (13,427').

We had to make a couple of attempts at Grizzly before we finally summited. The first attempt was in early April, 2000, with Mike, John and Sally, and the weather was so bad we had to turn around after getting about halfway there. Visibility was so low due to white out conditions that we couldn't even see where we were going, or if we were going to walk off (or fall through) a cornice. The first few pictures below are of this first attempt.

Mike and I then returned on April 16, 2000 and tried it again. The following is extracted from the trip report I wrote that day. While not technically during the "winter," I still classify these as winter climbs for obvious reasons.

Mike and I started at 8:00am today from the parking lot at Loveland Pass (11,990'). We then ascended east, following the Continental Divide, with the goal to be to reach Torreys Peak (14,267'). We went east to Point 12915, then descended south to a saddle at 12,714', ascended to Point 13117 (which is how far we got in a snow storm with John and Sally two weeks ago), down to a saddle at 12,756', up to a small point at 12,936', down to a col at ~12,740', and then to the top of Grizzly Peak at 13,427', At this point, I was totally tapped (more on that in a minute), and even though Torrey's was the next peak after another saddle, we decided to return, since we were both feeling a little wobbly, and I had noticed, scouting on the ridge to the east of Grizzly Peak before the decision, that I was slipping and losing my balance a little too much (indicative of being tired, especially since we were sheltered from the wind at that point).

Weather was excellent (visibility easily 50 miles, with only scattered clouds), except very windy. Using a chart I have for estimating wind speeds, I would say it averaged 20-30MPH overall, with a few gusts to 40MPH, and one gust burst that came pretty damned close to 50MPH, since it almost pushed me over, if it hadn't been for my ice ax being implanted downwind at the time. The saddles/cols were the worst places for the wind. While you guys in the flatlands of Denver/Boulder were experiencing a nice warm day, we were in full-on shells, goggles, balaclavas, etc., until the last half hour or so of the trip, when it was warmer and the wind was starting to die down a little. Trail conditions were windblown, with bare tundra and hard packed snow mixed about 50/50. I estimate approximately 6 trail miles traveled overall, using the "string following the route on the map" method (Roach's Colorado Fourteeners guidebook says the roundtrip distance to Torrey's on this route is 10 miles, which I think is very high, and the Colorado Mountain Club Guide to the Colorado Mountains [Ormes], says a round trip of five miles to Grizzly, which I think is a little conservative). We achieved a total elevation gain for the day of 2,953'. Total outing time was 6 hours, 20 minutes. We saw five other people en route consisting of a party of three and a party of two, both of which we passed on our way back from Grizzly Peak (both parties ascended Grizzly, and presumably went on to Torrey's).

Grizzly really took a lot out of me. I think part of it was not being able to stop in many sheltered places to refuel due to the wind, so my reserves were shot. But a large contributing factor was the slope conditions on the north side of Grizzly Peak itself. The rock there is pretty rotten, mixed with loose dirt, and was covered with a thin layer of wet ice, and then a little snow (read as "walking on ball bearings"). Sliding back 1-4' was a fairly constant occurrence, given the 45-50° slope (by using the topo map, I calculated the overall grade from the 12,740' saddle to the Grizzly's summit to be just over 45°, with a steeper section right before the summit).

Round-Trip
~6 miles
Time
6:20
Starting Elevation
11,990'
Maximum Elevation
13,427'

Click on any picture below to see the slides full-sized.

Sunshine Peak Attempt

Made it to 13,400' or so on Sunshine Peak (14,001'), then had to turn back because of snow conditions.

The following is extracted from the trip journal notebook I wrote while on an unscripted solo tour through the mountains in February and March of 2000. In which our hero hears a distinctive sound.

I started at the trailhead at 7:20am. I ended up going right up through the two layers of broken cliffs directly across from Mill Creek campground. I quickly figured out I was not going to come down the same way, because there were places where, when I stopped and looked down, the exposure was pretty great. In fact, looking at the map, it is 3,000' in one mile, and there sure were places that felt like 60° to me.

I finally broke out of the trees about 10:45. Then it was a long slog through snow on open slopes. I pretty quickly figured out I wasn't going to summit today—the final ridge line was heavily corniced. But I went up the sloping shoulder, and then halfway up the pyramid shaped south-southeast slope of the summit block. I finally turned around somewhere between 13,200' and 13,400'. Three factors helped clinch it. First were the summit cornices. Second was the fact that the new snow from earlier this week had consolidated into a crust which, while making for good walking wasn't necessarily adhered to the snow layers below it. When I was below tree line it was no big deal, but it was disconcerting to see hairline cracks paralleling my movement about 6' upslope from me (in other words the crust was fracturing in big plates). The final straw was getting to hear the infamous "whoomf" as a small plate settled underneath me. At that point it was time to get the hell out of Dodge.

About 11:45 I came down by the little gully shown opposite and slightly downstream from the Mill Creek campsite. A little less steep, but not much, so I had to go slow, be careful and even in a few places resort to "vegatative holds". I finally made it back to the car at 2:10. Almost seven hours solid of breaking trail, plus route finding both ways through the cliffs. Pretty good!

Round-Trip
12 miles
Time
6:50
Starting Elevation
9,500'
Maximum Elevation
~13,400'

Click on any picture below to see the slides full-sized.

Yankee Boy Basin

In which our hero learns a valuable lesson in winter mountaineering.

The following is extracted from the trip journal notebook I wrote while on an unscripted solo tour through the mountains in February and March of 2000.

I did a 12 mile snow shoe trek today! Woof! I went up the road towards Imogene and Yankee Boy Basin with the intention of trying Imogene Pass. I parked where the road was blocked at the bridge about 1.5 miles down road from the switchbacks. I hiked to the switchbacks (the road was clear) and then put on my snow shoes. I then walked up past Camp Bird, making my first mistake, which was I should have crossed the valley floor at Camp Bird for Imogene Pass, just in terms of mileage. Instead, I kept on the road to Yankee Boy Basin. Soon after Camp Bird I passed the last ice climbing area, and then the snow shoe and ski tracks stopped, although the jeep road I was on kept going. So I just walked on, and the untracked snow was pretty crusty and stiff and held my weight. It had started snowing shortly after starting out, so visibility just kept getting worse. When I started it hadn't been snowing, so I could see quite a ways. By the time I passed the townsite of Sneffels, it was down to 100-200 yards and blowing.

I kept trucking on, my goal to reach Blue Lakes Pass. Shortly (300-400 yards?) after the last Ruby Walter mine signs, starting to work up by the last knob (going the right way, not following the creek on the left), I had an incident that convinced me to turn around. I figure I was halfway up the slope of switchbacks shown on the map (although by this time and place the trail was completely invisible under the snow). The conditions were pretty close to whiteout, 100 yards or so, and the lighting was very "flat", with no distinction in topography—everything just looked flat and white, even with goggles on. I had already stumbled down little slopes or almost stumbled over hummocks sticking up that I couldn't see in the light and with the blowing snow. Then all of a sudden I was falling and sliding down a hard snow slope, and one of my poles slid even further past me. Luckily the slope wasn't long or too steep, and the crampons on my snow shoes helped me stop and regain my footing. But it shook me—I had stepped right off a 8'-10' cornice into space with no indication of terrain change to warn me before I fell! The little windswept gully I had fallen into was capped with cornices on three sides (only the side leading down was open).

I retrieved my pole and quickly determined to exit the gully I had "chanced upon" and return home. It was blowing pretty hard, but since the San Juan valleys are so tall and narrow, it was hard to get lost. However, the other factor that made me turn around was that I could no longer see the slopes above me. I figure I was at 12,400' or so, and Mt. Sneffels was right there, looming above me, and I couldn't see it at all. No ridge lines or details beyond 100 yards were discernable. In such intense avalanche country not being able to see upslope is not a good thing, so it was time to get the hell out of Dodge. I rested and ate, then trudged down pretty much non-stop. I was soaked from the wet, warm snow and whipped when I reached the car. Overall I did 12 miles (two hiking, 10 snow shoeing) with a 3,600' elevation gain in a round trip time of 5.5 hours.

Round-Trip
12 miles
Time
5:30
Maximum Elevation
~12,400'

Click on any picture below to see the slides full-sized.

Lizard Head Approach

A fun day playing in some really deep snow.

The following is extracted from the trip journal notebook I wrote while on an unscripted solo tour through the mountains in February and March of 2000.

This day was what makes snow shoeing, winter camping and this vacation all about. What a perfect, perfect day!

I got to Lizard Head Pass about 8:30am. Uneventful other than the overnight snow which made it slick in places. I parked at the Cross Mountain trailhead right by the "Lizard Head 13,113'" sign. Lizard Head was playing hide and seek with me in the clouds, and wouldn't give me a good view before I got into the thick trees. I also couldn't get clear views of El Diente, Mt. Wilson or Sheep Mountain across the valley, all clearly visible yesterday when I drove over the pass to Dolores.

I went up the Cross Mountain trail (once I found it). It had ski tracks for quite a ways, but they seemed old (at least last weekend) and were covered with 6"-9" of powder, making them barely discernible. I followed them until they stopped (or faded) then plowed on making new trail. I estimate my total mileage to the meadow where I set up camp was about 2.5 miles, with a starting elevation of approximately 10,000', campsite elevation approximately 11,800'. I picked a campsite at about 11:30 and had camp set up by noon. After relaxing and eating, I then broke trail another mile and 500' to 700' in elevation until I was as close to the base of Lizard Head as I dared go (the slopes beyond that were steep and iffy for avalance, as far as I was concerned). I took a lot of pictures of Lizard Head, Mt. Wilson, El Diente, Sheep Mountain and even Wilson Peak (I think—it could have been Gladstone Peak).

The weather this afternoon was perfect (45° in the tent) with just enough clouds for contrast to that deep, deep high elevation blue (sky). The firs and spruce under their coats of snow were so deep green they looked black. Feeling fit, I then stamped another trail west from camp towards the 14ers, but after a mile and no views, I turned back. The campsite is well sheltered, but has great views of the 14ers, Lizard Head, Black Face, etc.

Click on any picture below to see the slides full-sized.

Mt. Ouray

A winter solo climb of Mt. Ouray (13,971').

The following is extracted from the trip journal notebook I wrote while on an unscripted solo tour through the mountains in February and March of 2000. Photos follow.

Sunday, February 27, 2000

3:15PM—In tent, if you can believe it! This day was a humbling experience. By my estimation I made less than two miles and only a little over 1,500' in 4.5 hours. Of course it was straight uphill, bushwhacking and route finding all the way through knee deep snow of various treacherous consistencies including powder, crusted (two flavors—strong enough to hold me up, and not strong enough, with no visible evidence of the difference). I am now camped on a small ledge hacked out of the snow on the east ridge of Mt. Ouray at about 11,200' by my best estimation. I almost gave up a few times before I got here. The leg is OK—it is just energy sucking to stamp new trail through snow straight uphill with 50 pounds on your back.

My goal, if the weather looks good, is to try and summit tomorrow. See if it is better with no pack. Also, once I clear the trees, there is little or no snow on top. In fact, in the valleys and peaks around me, there are vast tracts of exposed land with no snow. If I had been smart, I would have pounded the Colt up the road a little farther and tried a southern-exposed ascent up the creek drainage. It would probably have little or no snow. But my big worry is getting the Colt out if it snows. So if the weather looks bad, I will bolt back down to Grays Creek tomorrow and boogie on (but to where? to where?).

Thermometer says 35° in the tent. It is calm and clear right now. The stove is acting up and that is worrisome. I moved the canister while heating water and suddenly there were flames everywhere. I couldn't tell if they were coming from the stove or the hose. I turned off the canister and luckily when I relit it, it didn't flare up again. Don't touch the can while cooking! Reading material is "Sense and Sensibility". We will see how Ms. Austen fares in a sleeping bag! Nice and relaxed, although my feet are getting cold. Time to get into the bag!

Monday, February 28, 2000

1:50PM—45° in tent (it only got to the 20s in the tent last night—I was still cold —I think it is because of caloric deficit). Started for the summit shortly after 8:00AM this morning. Kept angling south as I pounded uphill through knee deep powder. Finally got high enough and southern exposed enough it was mostly crunchy in the aspens and open places, so that's how I got above timberline (woof!). Then the real climb started. It was steep going in places (nothing like rock climbing exposure, but 45° slopes). It was very windy above timberline, especially on the south side of the ridge (for whatever reasons, the predominant wind pattern on the side of the mountain seems to be SSW). I summited shortly after 11:00AM, so three hours wasn't bad to do almost 3,000' elevation gain. Took panoramas and a picture of myself and left (windy, cold). Made it back to camp before 1:00PM.

Round-Trip
~7 miles
Time
3:00
Starting Elevation
~10,500'
Maximum Elevation
13,971'

Click on any picture below to see the slides full-sized.

No Name Creek

Mike and I have a very wet time in some beautiful wilderness.

No Name Creek is located in the heart of the Weminuche ("Wem-uh-NOOSH") Wilderness Area in southwestern Colorado. At over 500,000 acres, it is the largest federally designated wilderness area in the state. With the ability to get days out from a trailhead with no way to return but via the same multi-day route (or other multi-day routes) backpacking there can be quite the epic. The following is extracted from the trip report I wrote for a trip there during a very wet monsoon season in 1999.

What: Attempt at a series of drainage traverses over high passes through relatively un-traveled wilderness.

Where: Needles Range, Weminuche Wilderness Area, San Juan Mountains, southwestern Colorado

When: August 21, 1999 to August 25, 1999

Who: Mike and me (John and Sally, in absentia)

Introduction

This trip was full of interesting lessons learned the hard way. Almost nothing about it went as planned, and yet it cannot be counted as a failure.

The original plan for the trip had been in the works for almost a year. In its final shape, we would start at the same place, the Needleton stop of the Durango-to-Silverton narrow gauge railway. My friends John and Sally Stoddard would go in on Wednesday, August 18, and establish camp at the "Y" intersection of two tributary drainages in the upper portion of No Name Creek basin. Mike and I would then follow on Saturday, August 21, and meet them in the late afternoon at their campsite. From there we would traverse through the Tenmile Creek basin to Vestal Basin, where we would spend some time bagging peaks in the Grenadier Range. From there we would descend to the Elk Park stop on Sunday, August 29, and pick up the train on its way back to Durango.

So much for the plan...

Day Zero—Friday, August 20

Mike and I left Denver at 12:30pm on Friday, August 20, and drove to Durango via I-25 and Highway 160. It took six and a quarter hours via this pleasant route (at least the 160 portion of it is nice), which is probably the quickest. We stayed at the Spanish Trails motel in Durango, which wasn't bad at all. We wandered around downtown Durango, which is cool, and then ate Mexican food at a restaurant owned by the same family as the one we ate at in Silverton on our scouting expedition over a month ago.

Day One—Saturday, August 21

We made the train quite handily the next morning due to my rather hyperactive insistence we be at the train station incredibly early. We had found a motel near the train station that would let us park the Colt for $3/day. The train ride up was cool, but not as visually striking as I had hoped. Part of that had to do with being on the wrong side of the car for the uphill portion of the trip (if we had ridden to Silverton and returned that same day, our side of the car would have had the good views on the way back). The train left Durango at 8:15am, and we were dropped off with at least 20 other backpackers and climbers (all of them headed to New York and Chicago Basins) in Needleton at 10:45. Needleton (8,212', approx. 37°38'N, 107°41'W) is basically a pedestrian bridge across the Animas River (which would be virtually impossible to get across without some sort of bridge or boat), and some private cabins. We were on trail heading north along the Animas at about 11:15.

After a false start up what I think would have ended up being the Ruby Creek trail, we soon hit the cliffs across from Watertank Hill, just as described in the guide book. The trail is very steep going up and over the cliffs, but not overly difficult. At the crest of the trail, we met two female forest rangers that took our names and destinations, and when we told them where we were going, one said, "Good luck!" This echoed the sentiment in town from the motel manager of "Be prepared to be wet." However, we were armed not only with copies of the relevant pages out of the guide books, but also a downloaded trip report from the Web by a couple who had done a similar traverse a year ago where it didn't rain on them once, so how bad could it be?

We then reached Ruby Creek, and after some consideration forded it at the fairly shallow, sandy spot right where the trail hits it. It was about knee deep at its deepest here. Again, all was going exactly to plan at this point. We then proceeded to No Name Creek, and this is when things began to go awry. The thing is, No Name Creek is fast, deep, and where the trail hits it, is basically wedged between the Animas and series of cascades as it finishes its steep tumble out of its drainage. There is approximately a 50-yard wide area where any attempt at fording is possible. After some scouting around, we decided to cross where there was a dam of fallen trees wedged among some rocks. The first half of the crossing was across sand with a depth no greater than our knees. The next part was through of pool that looked to be about crotch deep and was directly above where the water rushed through a gap in the dam.

I went across first, using a long stick to help balance and facing upstream. The water indeed was deep, approximately to my lower waist, and it was moving fairly quickly. I had to fight to maintain my balance, and with some struggle made it to the other side. Mike followed, and through a variety of factors (the most weighted of which was that the water came up to his lower abdomen), ended up falling, under a 56 pound pack load, into a full immersion baptism. I helped him up and out, and through that process we both ended up soaking wet.

Now, mistake one had just been made—Mike falling in the stream (while it cannot be said any slip or fall is a mistake, we were still at fault for not scouting for a better stream crossing, for Mike not knowing the correct way to cross streams, etc.) We proceeded to swiftly make mistakes two and three, with very bad results. The second mistake we made was to not stop, wring out, rest, and recuperate after the stressful (and scary!) experience at the creek. We wanted to make good time, and felt we were lagging a bit, so we just immediately started out again. The third mistake was that we couldn't find the trail up the drainage, and rather than spending five more minutes scouting for it, we proceeded to bushwhack straight up the creek drainage and up the ever-steepening valley side as we had to rise to keep above the cataracts the stream was falling through. This has to be the hardest physical effort I have ever accomplished. We basically went straight uphill for at least a half a mile on a 45-55° angle slope with 56 pound pack loads. Needless to say, this exhausted both of us rather quickly. In a surge of true desperation, we hurled ourselves further up the hill and finally found the true trail.

Mistake number four was that we still didn't stop, rest, eat, and recuperate. Instead, we swigged some water and charged up the trail. Being on the trail was better, but it wasn't much better. It is not a maintained trail, and probably sees less than 100 people a year. So it has no switchbacks in it, but instead takes direct paths up the incline (and the first two miles were solid, steep incline). There were lots of deadfalls blocking the path, and in many places the path had become a stream as well, since it represented a straight way down hill for water to travel. We bashed along this for a while, and then after a brief respite while I stopped and vomited (I think from previous iodine tainting in Mike's water bottle), did it some more. At one point I fell forward and caught myself with my arms with a large rock situated between them about an inch from my sternum—breaking ribs would not have been fun! During this whole time it rained on us, sometimes heavily. We were both completely wetted out from head to toe, cold and miserable.

By approximately 5:00pm, we were totally exhausted. We had not passed anywhere where we could camp (the valley had been too narrow and steep), so when we finally did stumble across a camping site, we decided to stop for the night rather than go on, since we did not know how much further it was (and it was a good thing we stopped, too, as it would have still been approximately two more miles, with hard willow bashing) to reach the meadows where we thought John and Sally would be. We set up the tent and immediately changed into dry clothes. We hung up the clothes inside the tent and crashed for the night, after briefly talking about whether this was even a feasible expedition at this point. Morale was very low at this point—the lowest of the trip.

I would estimate we traveled six miles this day, when we were supposed to travel eight. Of course, that eight-mile estimate had not counted the creek dunking or the off-trail bushwhacking straight up hill for a half mile.

Day Two—Sunday, August 22

In the morning the clothes we had worn the day before were still sopping wet (of course), so we put on our change of clothes and decided to try and day hike to where we thought John and Sally were and see if we could find them and discuss our alternatives. After about a half-mile out we turned around, however, because we were willow bashing and making our last set of dry clothes as wet as those we left in camp. We returned to camp and spread all our clothes out to dry in the morning sun, and by early afternoon everything was dry except one pair of boots each (we had each brought a pair of boots and a pair of scrambling shoes/boots). It was morale boosting to have dry clothes (including reserves) again.

We then discussed our options in the tent during the daily afternoon rainstorm. I pushed for continuing on, trying to meet up with John and Sally either in this valley, or by following them over the passes to Vestal Lake and meeting them there. Mike agreed, and so we came up with a plan where we would travel during the clear mornings and set up camp before the afternoon rainstorms that came every day between 1:00 and 3:00pm. We would travel in our "wet boots" and lounge around camp in our dry ones. If needed, we would take an extra day to dry out in between the two travel days. We were counting on two days travel time to reach Vestal Lake, given that everything was taking longer than we thought due to the relatively off-trail nature of the area. Even with two 12,900' passes to go over six miles in two days seemed reasonable.

We spent the rest of the time enjoying the campsite (10,400', approx. 37°39'N, 107°38'W). We had a waterfall directly across the valley from us that I would estimate was falling at least 400-600'. We had great views of the Index to our south (the waterfall was coming down its side), Animas Mountain to the southeast, the Heisspitz to our northeast, and the upper portion of Knife Point east-southeast of us. I wandered over to a talus slope to the north of camp and relaxed hanging out on the rocks, and climbed up the slope until I could also see the West Needle range to our west.

Day Three—Monday, August 23

We hit the trail at 7:40am. We made it through the willows immediately east of our camp more easily this time, due to the scouting we had done the morning before, although almost immediately my boots were filled with water and stayed that way (in fact, I spent almost the entire walking part of the trip walking in water up to my ankles inside my boots—so much for supposedly waterproof La Sportiva M-Hikes). We then had to head up another incline until we finally hit the upper drainage of the valley below the Y. We stopped by an old cabin where there was some sign of someone having camped recently (we thought perhaps John and Sally, but that turned out to be not the case) including a pair of fairly new looking tennis shoes hanging as if to dry from the rafters inside the cabin. The views of Knife Point, Sunlight Peak and Monitor Peak from this willow meadow are truly spectacular.

We then looked around, but could see no one camped in the meadow or its edges. John had mentioned camping at a lake at the upper end of the southeastern branch of the Y (11,754'), but we could see no evidence of a ledge big enough to hold the lake from where we were standing, and didn't want to go off on a four mile round trip with 2,000' in elevation gain to see if we could find them, since it would be in the wrong direction for our ultimate travel and we were convinced it would be fruitless. So we decided to head up the northeastern Y branch, which would be the ultimate direction of travel for the party. Our thinking was we were going to try and camp by an alpine lake at 12,552' at the foot of Peak Five and Peak Six, which was right below the 12,900' pass we would then attempt to traverse (both guide books and the trip report from the Web mentioned this lake as a beautiful camp site). If we were ahead of John and Sally, they would pass by us on their way over. If we were behind them, we would catch up with them eventually. I must admit that another aspect of our thinking at this point was the very high possibility that they had bailed because of weather. In fact, almost immediately upon beginning the ascent up the steep climber's trail that ran up the northeastern drainage of No Name basin, we met a climbing party of four descending (our only encounters with humans, and theirs, too), and they said it had rained on them continuously every day for four days except Sunday. Since this coincided with John and Sally's time in the valley, we added even more weight to the theory they may have bailed.

We continued up the trail for about a mile and a half. It was very steep. We then came to an open willow meadow, and crossed the stream to the south and continued up. This turned out to be a mistake, since it appears the trail we took was to the base of Jagged Mountain. We were both tired but not exhausted at this point, and considering the clouds were building up for the daily afternoon rainstorm, we set up camp (11,800', approx. 37°38'N, 107°35'30"W). We could almost immediately see the trail we should have taken on the far side of the valley from our campsite. We would have to do some willow bashing to reach it. It climbed up a very steep slope to a ledge where we assumed the 12,500' lake was located. At this point, we were approximately south-southeast of Peak Four, due south of Peak Five, south-southwest of Peak Six, west of Leviathan, with Jagged and Gray Needle just to the east-southeast, in clockwise order around our campsite.

The afternoon rainstorm was very intense this day, lasting from approximately 1:30 to 6:00pm, with some heavy hail, but the Walrus tent withstood everything OK. During the last few hours of the day we had dinner and I wandered upslope to see if I could spy the pass (really just a saddle) we would have to ascend the next day. I am not sure if I saw the actual pass or something just to the east of it (I believe I saw the 13,000' ridge running between Peak Six and point 13,564' instead), but it looked like a typical talus slope. At this point, we dove into the copies of the climbing guidebooks we had, along with the Web trip report by a couple who had done the same traverse the year before (although they had eight days with no rain, which would have made a huge difference). We poured over every adjective with rabbinical intensity, and finally came to the conclusion that climbing guidebooks (which we were using) rate things such as what we were attempting to do in a much different way than backpacking guidebooks do. What may be an "easy" 12,900' saddle for a climber would be a bitch for a backpacker with 56 pounds on his back. This was especially true since we were now no longer expecting to see John and Sally (I had expected them to hike by us this day), and without John's route-finding capabilities, our way up the talus and then down to Balsam Lake (the couple's trip report had mentioned the down-climb to Balsam Lake had been difficult to find) would be problematic. Added to this was the fact we couldn't quite even figure the route to the saddle from where we were standing, but just knew it was going to be very steep regardless of which way we took.

At this point, Mike voted to bail, retreat to our first campsite tomorrow, and then hike to Needleton the following day. I did not want to give up (and wouldn't have if I had been soloing), but couldn't argue, since it was clear Mike was worried about his capabilities in making the pass and getting over it and down uninjured. In any sort of mountain activity, the team must rate itself at the honestly stated capabilities of the least able member. Therefore the decision was made to descend the next day.

Day Four—Tuesday, August 24

We hiked back to campsite one with no mishaps other than me falling at least twice (full feet out from under me slips on wet slopes coming down the climber's trail from the upper basin—in both cases I fell back on my pack). We set up camp by 11:00am and hung out the rest of the day (in the tent for the three hours during the daily rain and hail storm). Watched the sunset lighting on the peaks, and then watched the full moon rise.

Day Five—Wednesday, August 25

On trail by 7:15am. During packing we discovered one of the plastic hubs that holds my tent poles in place had cracked—it wouldn't have been a total loss if it had broken all the way through, but it was good the tent was not going to be subjected to any more heavy weather (and very lucky that the rain and hail was never accompanied by wind on this trip—in fact, the No Name basin was remarkably wind free while we were there—what is even more amazing is as wet and windless as it was, it was also incredibly bug free).

We found out why we had missed the trail after fording No Name Creek the first time—it cut way to the north and then looped around to a more easterly course as it rises from the Animas River, while we had looked almost immediately in an upstream direction. The Noname Creek fording went much better this time, thanks to taking the extra time to scout and finding a place about 10 yards upstream from the pool that had been obscured by willows on the south bank the first time we were looking for a fording place. We couldn't see the bottom where we forded, but I was able to tell by the stream pattern it wasn't very deep, and it ended up coming up to my knees and Mike's lower thighs. We each used two thick poles, heavy ends down, and that helped a lot. It was a pretty exuberant moment when Mike made it across (I led all the creek crossings, and spotted Mike for the last third of his fording here), because we had both been rather spooked by the original dunking, and with the Animas raging just downstream, we had little room for error.

We then crossed Ruby Creek with no problems, and made it over the cliffs just fine (other than my back acting up from shouldering my pack wrong after the No Name fording—but I cinched up the waist belt tight and made it back OK). We were back at Needleton without mishap by 10:50am. The rain actually held off until 3:00pm, when the first downhill train arrived and picked us up, along with the five other people that were waiting. Within just a few miles, however, the terrain changed enough that it was clear and dry the rest of the trip back to Durango. We made it to Durango around 6:00, and were back in Denver by 1:15am on Thursday morning.

Aftermath

It turns out that John and Sally bailed a day before we did (Tuesday), after climbing into the Ruby Creek drainage by mistake. They spent three full days in pouring rain (which matched the report of the four climbers we met), and then transited over to the Chicago Creek basin and hiked out from there after doing two of the three 14ers in the upper Chicago Creek basin. They spent their time in Ruby Creek in the tent in the rain surrounded by a herd of 25 mountain goats (an amusing story in itself). Mike and I saw a lot of elk sign, but never saw any mammals bigger than a marmot, so they were lucky (even if the experience was rather surreal). I was glad to hear that Mike and I hadn't bailed so early as to be classified as wimps, and that John and Sally were safe and sound.

Click on any picture below to see the slides full-sized.

Mts. Democrat, Lincoln and Bross

Climbed Mounts Democrat (14,148'), Lincoln (14,286') and Bross (14,172') (plus Cameron [14,238'], of course) with Mike and his son Drew.

Note: Much of what is mentioned below is not possible or advisable now. Mt. Bross is private property and apparently has become off-limits, and the scree run is seen as environmentally damaging.

A classic group of 14ers typically climbed as an easy set, the Mt. Lincoln group is notable for a couple of things. First, not only can you can drive to the trailhead at Kite Lake at 12,000' in a passenger car, but if you have a 4WD vehicle, you can drive to the top of Mt. Bross! This is due to the fact there was extensive mining all over this part of the range. There are also mining ruins on Mt. Democrat at 14,000'. I cannot imagine doing that kind of hard work at that elevation—walking at that height is hard enough!

We camped overnight at Kite Lake, which was fun because I freaked Drew out that night by shining a laser pointer from my tent onto the walls of theirs while they were inside talking. "Dad! WHAT'S THAT?!?" Mike had a good laugh over it, and I am sure Drew will forgive me some day for embarrassing him.

We began the circuit by climbing Mt. Democrat (14,148') from the lake. From there we then went over Mt. Cameron (14,238'). Many people don't consider Cameron an "official 14er" because the elevation dropped and regained to summit it from the other peaks isn't high enough to satisfy the purists. Whatever. After that, Mike and Drew held back because Drew had some sports injuries that were bothering him. I summited Lincoln (14,286'), where I was distressed to find that among the typical crowd of 14er peak baggers on the summit that day (myself included) there was a dude who had mountain biked up a mining road and then was exultantly calling his friends from a cell phone on the summit.

I then dropped to the saddle between Lincoln and Bross, met back up with Mike and Drew, and we summited Mt. Bross (14,172') together, returning to Kite Lake via a very fun "scree run" down a gully.

Round-Trip
~7 miles
Starting Elevation
12,000'
Maximum Elevation
14,286'

Click on any picture below to see the slides full-sized.

Mexican Mountain

John, Sally and I made a trip to the San Rafael Swell in Utah and climb Mexican Mountain (6,393').

It was a great trip, and I had a blast. Among the things we did was climb Mexican Mountain (part of a wilderness study area). While it is only 6,393' high, it was still a workout! We car camped overnight, and then drove to where the rugged "road" ended near the mountain. From there we walked around to the north side of the mountain and crossed the San Rafael River (about thigh deep) at Mexican Bend (4,500') to begin the actual climb.

We then climbed the north slopes up a talus cone until we reached a very short stretch of actual rock climbing (5.0 at most!). Of course John scaled it without even blinking, then they coached me up over it and on we went, wrapping around to the east side of the mountain between the main bulk and a cool tower to the east. From there it was up through some very smooth, wonderful sandstone (but then, in Utah, what isn't?) I remember being on one slope that was about 40° and just rolled away for a long way down, and thinking "If I slipped, I wouldn't stop", but the sandstone has such excellent traction that slipping would be out of the question.

We kept kept circling around the summit while continuing our climb, scrambling higher and around to the south side. We finally broke out onto a platform between a minor summit on the south side and the main summit cone on the north. The views were amazing out over the desert. Quite different than the trees and snow of Colorado, but beautiful and breathtaking nonetheless. We rested for a while and then began the descent, with John doing his usual rocket-propelled descent, leaving Sally and me, mere mortals, to wend our way down on our own. While descending the talus cone, I got quite sick—once again, dehydration and heat getting to me (note: take more than two liters for desert excursions—even "day hikes"). After a rest (waving to John off in the distance), we continued down, finally crossing the river and getting back to their SUV (and more water!) As soon as I rehydrated I was fine and ready for more. A good day.

Round-Trip
~4 miles
Time
~5:00
Starting Elevation
~4,500'
Maximum Elevation
6,393'

Click on any picture below to see the slides full-sized.

Goblin Valley

Part of my trip with John and Sally to the San Rafael Swell in Utah included a jaunt to Goblin Valley State Park.

It is full of "goblins" or "hoodoos," rock formations caused by the erosion of the soft sandstone in the area. Not as majestic as Bryce or Zion National Parks to the southwest, certainly not a "climbing" story, it is still a fun place worth showing, with the rock formations being very accessible. We spent a few hours scrambling around here, exploring lots of nooks and crannies. It is basically a giant playground.

There were good views of the Henry Mountains to the southwest. I've wanted to go back and climb those—they are so very remote and isolated! I was even corresponding with a professor at one point who does yearly scientific studies in that range, but decided I didn't want to spend my vacation catching and tagging bats at night. Yikes!

Click on any picture below to see the slides full-sized.

Arches

A canyon, an arch, and a frog.

After climbing Mexican Mountain John, Sally and I drove south of I-70 into the southern part of the San Rafael Swell, scrambling in the rock formations in Goblin Valley State Park, seeing some ancient Indian petroglyphs and basically just checking out some of Utah's remote regions. Then we went down to Moab, and camped by the Colorado River at the Big Bend campground. This is located right across the road from Lighthouse Tower, an impressive spire John had climbed in the past.

The following morning John and Sally went rock climbing on Wall Street, dropping me off for a day hike across the Colorado River from Arches National Park up the Negro Bill Canyon. My first goal was Morning Glory Arch, about 2.5 miles up the canyon from the trailhead (4,000'). It was a quick, easy hike there, and I took a few pictures and then decided to get away from the pedestrians and hike further up the canyon, hoping to get off trail (of course!)

The hike was pleasant, but hot. On the way up the canyon I passed by a little slot canyon choked with willows. I marked the place in my mind and went on, eventually reaching some large rock formations and just scrambling around on the rocks for a few hours about five miles up the canyon. Then I came back down and checked out the slot canyon. There was a "trail" of sorts, but nothing that got any real traffic. Which was surprising because it was quite pleasant, with a little stream trickling through it. And anywhere in Utah with water and some protection from the all day sun means plants and trees, which meant there was some shade, too.

When I reached the end of the canyon, there was a little water pool being fed by a trickle falling from a ledge above it. The sound of the tinkling water and the coolness of the shaded pool compared to the desert around me made it the perfect resting spot. Especially since no one else was there. Well, almost no one. There was a big frog in the pool, with just his (or her!) two eyes above the water, checking me out. We watched each other and the surrounding area for about 45 minutes, and I am telling you, I envied that frog's life, and felt special just getting to share its space for that time. Sound silly? It wasn't—this is truly one of my favorite memories of anything I've done outdoors, anywhere. No goals, no big hike to get somewhere, just hanging out in a beautiful place with my new friend, the frog. It was peaceful, quiet and pretty—and if you can't take the time to notice that when you're outdoors, why are you there?

I finally decided to leave the pool and the frog in peace, and went back the way I came, merging onto the main trail and heading down, where I met John and Sally coming up looking for me. We then went and lunched in Moab, and started the drive back home to Colorado.

Round Trip
~7 miles
Time
~5:00
Starting Elevation
~4,000'
Maximum Elevation
~4,800'

Click on any picture below to see the slides full-sized.

Flat Tops

Mike, Jim and I spend some quality time in real wilderness in the Flat Tops.

Following is a trip report I wrote shortly afterward.

We arrived in the Flat Tops area Fri. night around 7:30PM. Since it had taken us longer to get there than we had planned (compounded by Jim's late flight arrival, Jim and I getting lost finding Mike's place of work, and the fact that Highway 131 to Yampa had more curves and was slower than we thought). So, since it was getting dark, we paid $3 and stayed in one of the Forest Service campgrounds for the night near Stillwater Res.

Sat. morning we were on the trail at Stillwater Res. by 8:30. We then climbed out of the valley and up trail 1119, past Little Causeway Lake to the eastern terminus of the Devil's Causeway ridge, and then passed down the other side, ending up setting up camp a 100 yards from the northern shore of Causeway Lake. Estimated trail miles at around six miles (evenly distributed on both sides of the pass) and elevation change as 1,200' up and 1,200' down. As with all the valleys in the Flat Tops area, we were at 10,000+' (approx. 10,200' at the lake), in a glacially flattened valley, surrounded on three sides by basalt cliffs rising to 11,500-12,000' (the cliffs to the west of us were part of the "Chinese Wall," a particularly baroque formation). Predominant trees are Englemann Spruce. There are a LOT of deadfall and dead standing trees in the Flat Tops, from a spruce beetle infestation in the late 40s and early 50s. An amazing number of dead trees are still standing after 50 years, interspersed with 40-50 year old living spruce). Saturday night we heard coyotes and elk bugling (it is bow hunting season there right now, so we saw a few hunters -over the weekend).

Sun. morning we hiked back up to the pass, and then ascended the steep hill leading to the ridge to the west, and crossed the Devil's Causeway (thereby allowing my friend Mike to overcome his fear of drop-offs when presented on both sides at once—something he hadn't told me about until we confronted the Causeway, but that he then conquered—it is great to be witness to someone overcoming a fear). It was as advertised—the Causeway itself is probably no longer than 1/4 mile, but the tricky section is only about 75' long. There, it goes down to 3-4' wide, with sheer drop-offs on both sides. The drops on both sides appeared to me to be about 200', followed by 600' of really steep scree slopes. You wouldn't want to fall, it would hurt. The views from here were amazing—you could look into two valleys at once, and in fact, at the thinnest points, could hold both drop-offs in your peripheral vision.

We then walked out onto the Flat Top to the west, and after about a mile and a half turned around and came back, returning over the Causeway. The tops of the Flat Tops are actually not quite flat, and rise in places to peaks in the low 12,000' range. The tops are pretty much entirely above timberline, except for some scattered krummholtz in various sheltered places. Estimated trail mileage on Sun. was about six miles, with approx. an 1,800' elevation gain from the valley floor. One other interesting point—on the Flat Top east of us were (domestic) sheep grazing at approximately 11,800', with a shepherd with two horses, a dog, and a tent with stove camped over there as well. It was strange seeing a flock of sheep above timberline. According to the guidebook and Forest Service handouts, grazing is still permitted by permit in areas where it has historically occurred.

When we got back to camp, we ate, and then around 7:00PM JimP went into a stand of timber about 150-200 yards away we were using as our latrine area, and when he came out, I went to do my business. When I got back to camp, I realized the TP roll had fallen out of my pocket, so I went back looking for it. Not too far from where I thought I would have dropped it, I looked over my shoulder into a thicket of spruce trees, and saw a prone adult cougar looking back over its shoulder staring at me. The estimated distance between us (no exaggeration here, I am concentrating on being as accurate as possible) was 20-25'. I maintained enough presence of mind to not turn away from it, to NOT maintain eye contact, and to back away from it. When I got over a ridge, the adrenaline took over and I have to admit I ran back to camp, but I don't think it was following me.

Needless to say, I was excited. I told Jim and Mike about it, and then went to a neighboring campsite to warn them not to go to far off in the trees to do their business. The adrenaline slowly left, with no traces other than the occasional shiver. A funny footnote—the guidebook I have for the Flat Tops has a section about animals and what to do with encounters. The first sentence he says for cougars is to feel lucky if you see one, because he has been going there 30 years and has only seen their tracks. I personally feel REAL lucky. I think (a) the cougars and bears in the area are not real human habituated (even on Labor Day weekend, even with bow hunting season going, the area wasn't real busy), (b) it may have just eaten, as the sun was behind the western ridge and it was kinda that blue-sky-overhead twilight you get in mountain valleys when the sun is still up but hidden and that is one of their hunting times, or (c) it doesn't like albino biped hairless elk for food.

Sun. night heard an owl, but had no more wildlife encounters that day. Went to bed with a brief rain storm around 9:30. When the cloud cover went away, the moon was so full that night (in fact, all three nights) that it cast long shadows, and actually woke me up around 4:00AM thinking the sun was coming up. As an experiment, I could successfully read the print on the cover of a book I had brought *inside* the tent from the moonlight alone (another night I went out in the middle of the night, and was quite able to walk around without stumbling just with the moonlight as illumination).

Mon. morning we hiked out, starting at 7:00AM. We saw a herd of five to six elk at treeline in the distance—for all the elk the area is supposed to have (somewhere in the 20,000+ area, if I remember correctly), they were rather absent because of the hunting, I am sure. We made it back to the car in record time (3.5 hours) via a reverse of the Sat. route (helped by Mike and I taking most of Jim's pack load—for a flat lander with no time for acclimatization, he did amazingly well, but carrying even 33-34 lbs. on Sat. had been understandably trying for him, having arrived from approx. 600' elevation less than 24 hours before, and with us spending the whole weekend above 10,000'). We were to the car by 10:30AM. The ride back was smooth sailing until just above Silver Plume west of Georgetown, then it was stop and go until Idaho Springs (doing its job to remind me, as a Coloradoan, that it is just stupid to go in the mountains on Memorial or Labor Day weekends—now I won't forget for another decade). We were back in the city at 2:30PM.

Click on any picture below to see the slides full-sized.

Meridian Peak

A nice solo weekender into the Eagle's Nest Wilderness, culminating on Meridian Peak (12,432').

I did a solo weekend trip up behind Mt. Powell in July, 1998. Starting at Lower Cataract Lake, I backpacked up the Surprise Trail to Surprise Lake. From there I took the Upper Cataract Trail by Upper Cataract Lake at the base of Eagles Nest (13,091'), following the trail from the lake on around past Mirror Lake and on up into the cirque, camping in a meadow at just a little under 11,000' at the base of Mt. Powell (13,534') and Eagles Nest. One of my memories of this trip was that it was the buggiest place I've ever been! The mosquitos in the meadow were very intense—so much so that I spent most of my time either moving from place to place in a vain attempt to get away from them, or huddling in the tent for respite until I could no longer stand being cooped up in the middle of such a gorgeous place and would go back outside, just to then wander around waving the mosquitos away from my face again. And this was with being generously slathered down with insect repellant! The valley was very wet and I was probably the biggest mammal around, so they divebombed me continuously.

On Sunday I then hiked from the meadow up to a pass at 12,000' just to the west, and then to the top of Meridian Peak. From there I could see Vail to the south, and had good views of various ranges to the west, north and east, with beautiful views of Eagles Nest, Mt. Powell and the rest of the cirque. After that I came down, broke camp and hiked out without incident, other than getting briefly lost around Upper Cataract Lake due to the multitude of unmarked trails around it and a little lake nearby. Some route finder I am—I get lost on trail, but not off!

I want to go back and climb Mt. Powell! It's a great looking peak in a beautiful, rugged range.

Click on any picture below to see the slides full-sized.

Gladstone Ridge

Mike and I camp at Ptarmigan Lake and climb Gladstone Ridge (13,209').

This was a great overnighter with a fantastic payoff. Following from my trail journal.

On July 16, 1998, Mike and I headed up Cottonwood Pass road from Buena Vista. We parked at the Ptarmigan trailhead (10,600') and backpacked up to the lake, setting up camp just at the edge of treeline below the lake. We then hiked up to the lake (12,100'). From there we went around the east shore through a cloud of midges, and then ascended the west ridge of Big Grassy, taking a long ridge walk over Points 12962 and 13038, stopping on Gladstone Ridge at Point 13209. I remember hanging out for a long time there—the weather was good, and we were contemplating an attempt on Mt. Princeton the next day, which was clearly visible just to the east of us. We could look around at all the other Collegiate Peaks, including Mt. Yale (14,196'—the first 14er Mike and I summited together) just across Cottonwood Creek valley from us. We could see 14ers everywhere, plus the Arkansas River valley to the east, and Taylor Park over the Continental Divide just to the west of us. The only thing marring the day was the sound of some motocross bikes violating the federally designated wilderness boundaries. Sigh. We then descended back to camp, and the next day went for our ill-fated attempt on Mt. Princeton. A good overnighter.

Starting Elevation
10,680'
Maximum Elevation
13,209'

Click on any picture below to see the slides full-sized.

Mt. Elbert

Mike and I climbed Mt. Elbert (14,433'), the highest peak in Colorado, on my 38th birthday.

The following is excerpted from my trail journal.

It was the best birthday, ever! We had returned back to the Arkansas River valley after having to abort our backpacking trip through the Collegiate Peaks due to the shoulder strap on Mike's pack breaking. After camping overnight at Twin Peaks campground off Independence Pass road, we got started up the Black Cloud trail around 8:00AM on the morning of the 15th, a beautiful day. We were taking the non-standard route up the south side of the mountain in the hopes to do something different than the standard "pedestrian" route up the east side, and to avoid as many people as possible.

The trail started at 9,690' and went up a beatiful creek drainage, passing by an old mining cabin at one point. It was a steep trail. According to Dawson's Guide to Colorado's Fourteeners, there is 4,743' of elevation gain in the four miles from trailhead to summit, yielding an average grade of 22%. As Dawson calls it, "a grunt" (and rates even the summer climb as advanced, and supposed to take 10 hours round trip). But we were both feeling very fit, and took it fast, breaking above timberline in less than an hour. From there the trail went over a series of false summits (each a build up of hope followed by disappointment at seeing yet another, higher summit beyond). We finally summited at 11:00AM, which was a very good pace!

The views from the summit were beautiful. The Arkansas River valley was below us to the east, with Mt. Sherman (14,036') in the Mosquito Range beyond. To the north, Mt. Massive (14,421') rose impressively. It really is massive, the summit comprising the largest single area above 14,000' in the conterminous United States. To the west and south of us was the Sawatch Range, including my beloved Collegiates stretching away to the south. Of those, La Plata Peak (14,336') was the most striking, with numerous snow-filled couloirs on its north face capturing our imagination. We both want to go and do a late spring snow climb up one of those! The other thing I remember is that the little flowers in the tundra were in full bloom, and the air was so thick with the pollen from these tiny little blossoms that it smelled like honey. Incredible.

The only thing marring the summit was the crowd. 14ers are typically crowded with people, everyone checking off yet another peak bagged, and as the highest mountain in Colorado (and second highest in the conterminous U.S.) Mt. Elbert gets a lot of people. This time it was made worse by a church youth group, which had dragged a large wooden cross penitential-style up the mountain, set it up at the summit, and then gathered around it singing hymns. I have no problem with worship or hymn singing in the appropriate setting, but on top of a mountain most people are looking for solitude and quiet. If they can't appreciate the direct evidence of God's handiwork in silent reverence, why even bother making the trip? An even worse crime was they then ate, throwing candy wrappers and other trash away on the summit. So much for respecting creation! Grrr...

We then hiked down the way we came, reaching the trailhead by 1:30PM. So much for Dawson's 10 hour round trip estimate! Mike and I were both clicking that day, and it had just felt great to be out and about, fit, and doing what we were doing. Besides on the summit, we had not met more than six people on the trail we took (all of them on the way down), so that part of the plan was successful, too. We then decided to change our itinerary, and instead of camping that night we drove to Buena Vista and had a soak in a sauna and dinner at a Mexican restaurant, planning our backpacking trip for the next day. A great birthday!.

Round-Trip
11 miles
Time
5:30
Starting Elevation
9,700'
Maximum Elevation
14,433'

Click on any picture below to see the slides full-sized.

Kingston Peak

Mike and I enjoy an alpine ramble and see some cool bristlecone pines.

"Sometime in the 1990s" (that's as best as I can date it), Mike and I drove up the Fall River Road off of I-70 to the St. Mary's Glacier trailhead (9,800'). From there we hiked to the glacier at about 10,600', which is really not a glacier in Alaskan or Cascade Range terms, or even in Wyoming terms. It is simply a large permanent snow field filling a basin with about a 70' sloping face on the lower end. We hiked up the face of the glacier and along the snow field, exiting onto a slope on the north side around 11,000. From there we climbed uphill off trail through the bristelcone pines. These ancient, twisted trees are among the oldest things alive, scratching out an existence near timberline. We came across the most bizarre sight among them—a line of them stretching over 100' that really appeared as if someone had planted them. They were just in a row, their gnarled branches each reaching from side to side to touch their neighbors as if in some bizarre topiary.

Breaking out of timberline around 11,400', we continued northwest up the slope of Kingston Peak. We really did not have an itinerary that day, but once we saw how close it was, and that it was just a gentle walk along the ridge to the summit, we decided that would be our goal. We reached the summit easily, and had great views of (well-named) James Peak (13,294') and Mt. Bancroft (13,250') on the Continental Divide to our west, the Indian Peaks stretching out to the north of us, and all of the Front Range sweeping from north to south to our east.

The only disappointment was looking down into the saddle between us and James Peak and seeing a jeep road with SUVs on it, but it is hard to get away from that in the areas where mining left many roads, trails and railroad grades, such as near Idaho Springs where we were, and in many places in the gorgeous San Juan mountains in southwestern Colorado. I guess since the history of exploration and mining in Colorado turned me onto history, geology and a love of mountains in general when I was growing up there in the 1960s and 1970s, I shouldn't complain now that my sense of esthetics have changed!

We then hiked the three miles back out the way we came, and left. A nice day hike.

Round-Trip
~6 miles
Starting Elevation
9,800'
Maximum Elevation
12,147'

Click on any picture below to see the slides full-sized.

Mt. Yale

Mt. Yale (14,196') was the first 14er Mike and I summited together.

The following is from my trail journal.

We drove up to Buena Vista on a Friday night in the summer of 1997, and then on up Cottonwood Pass road until we reached the Denny Creek (not to be confused with Denny Gulch) trailhead at 9,900'. We then parked the car and backpacked up the trail a mile or so, camping in a nice open area near 10,800'.

On Saturday morning we were up and off for the summit. It wasn't that far, perhaps two to two and a half miles, but with a 3,400' elevation gain in that distance, it was a workout. Mike was going fairly slow, because he had just fought off his second bout with cancer, and after the chemo only weighed something ridiculous like 135 pounds (on a 5'11" frame!). Once we had summited he told me the thing that kept him going was a pretty girl on the trail just ahead of him—he followed her best "asset" all the way up! Ha!

Since this was summer in Colorado, it started to rain while we were on the summit, and being too stupid to get off (we were too inexperienced to be lightning leery yet), we just sat up there for a bit with some other stupid people and got wet. Then it was a soggy hike back down to camp. We were very tired, and Mike slept for a while that afternoon. We then cooked dinner and were crawling exhausted into our sleeping bags for the evening when Mike discovered that thanks to his discount tent, his sleeping bag had gotten wet in the latest rainstorm. So the decision was made to bail out, and we packed up camp and hiked down the trail in the rain with only one flashlight between us, going very fast and getting back to the car in about 45 minutes (without a twisted ankle!). That was fun!

Round-Trip
9.5 miles
Starting Elevation
9,900'
Maximum Elevation
14,196'

Click on any picture below to see the slides full-sized.

Mt. Bierstadt

You have to love Bierstadt (14,060') a mountain whose name, translated from the German, is "Beer City."

I climbed this mountain in October, 1996. It was my third 14er (Grays and Torreys being my first two). I didn't write a trip report because it wasn't worth one and I wasn't writing them then. I followed the basic pedestrian route, starting at Guanella Pass, hiking through the swampy beaver meadows between the pass and the base of Bierstadt, almost getting a boot sucked off in the mud there. From there it was a straightforward slog up 2,300' of tundra and talus slope to the top. Typical 14er crowd scene on top, of course, but the weather and views were terrific.

In the photo of me on the summit, you can tell it was early days for me—I'm wearing jeans and still in my 80s-style moussed hair.

Round-Trip
7 miles
Starting Elevation
11,669'
Maximum Elevation
14,060'

Click on any picture below to see the slides full-sized.

Pawnee Pass

A coworker and I go from Brainard Lake in Indian Peaks over Pawnee Pass (12,550') and down to Lake Granby.

The following is from my trip report.

In 1993 I took the first overnight backpacking trip I had made since Boy Scouts in the 1970s. I had been toying with the idea for a while, and asked my parents if they would buy me a backpack for my birthday that year. With that, a used sleeping bag and a tarp for a tent, I was set! But where? Chuck and I were looking at some topo maps of the Indian Peaks Wilderness Area when we noticed that Ward (on the east side of the Divide) and Monarch Lake (on the west) were only about 12-15 air miles apart, even though they are over 100 miles apart by road. So why not a trip over Pawnee Pass to connect the two?

With that itinerary in mind, we were dropped off at Brainard Lake (10,300') early one Saturday. From there we hiked up the Pawnee Pass trail, passing by Long Lake and Lake Isabelle before starting the steep climb up the pass. I remember getting sort of sick at this point from the exertion (a common problem of mine before I figured out I wasn't getting enough hydration!)

After a long struggle uphill under the unaccustomed weight of a full backpack, we finally reached the pass (12,550') about mid-morning. The pass is nestled between Pawnee Peak (12,943') to the north and Shoshone Peak (12,957') to the south. Then we started a steep downhill section, switchbacking constantly through a scree field. It was steep enough that it was actually as hard work going down, to keep braking oneself, as it had been going up. The trail at this point drops about 1,000' in less than a quarter mile. When we could notice, Pawnee Lake was below us, nestled among rugged peaks on all sides. After making it down to the more gradual slopes by the lake, it started to rain. This was before I had a bunch of sophisticated gear, so I simply donned a poncho and we huddled under some trees and waited it out, munching on food and talking. Then we continued down the drainage.

Not long after the lake we came to a stream crossing that sort of freaked me out. It was on a single wet, smooth log that was about 10' above the crashing rapids of Cascade Creek. I had no poles or walking stick to balance myself with, and ended up going over it very slowly, scared the whole way. If I had fallen with a full pack on my back, it wouldn't have been pretty! But I made it, and that was a real accomplishment to me. We then continued the hike downstream. Cascade Creek is aptly named. The drainage drops so fast from the Divide to Monarch Lake that about every quarter to half mile we would pass a waterfall. In fact, one of the things we were on the lookout for was Cascade Falls, supposedly the waterfall used in the Coors beer commercials. But the waterfalls were so common, and all of them so pretty, that the running joke for the whole weekend became, "I think this, this, must be Cascade Falls!"

We camped on a hillock overlooking a stream meandering through beaver meadows, with perfect views of the Divide and the pass we had come through. Chuck broke out a fishing rod and went fishing for trout while I just hung out and enjoyed myself. It was a beautiful place, and a great reward for a hard day—we had covered about 10 trail miles to this point.

Sunday morning we broke camp and headed on down, passing at least three more "Cascade Falls" (including what I believe to be the real one). We finally made it to Monarch Lake, and walked down to the ranger cabin there, where we had a good talk with a man holding the perfect job on earth. He was an older ranger who sat on a porch swing in front of the cabin, with chipmunks literally running back and forth over his feet, Monarch Lake before him and the Continental Divide rising behind it, and all he had to do was answer questions on where was the nearest outhouse, how far this or that trail led, etc. I suspect it was a reward for a lot of long years doing less glamorous work in the Forestry Service, and I bet there's a waiting list a mile long for getting that job, but I would like to be on that list!

We then walked a long way down along the south shore of Lake Granby, until we reached the spillway by Sunset Point (8,280'), where our ride would pick us up (completing about 20 miles, total, for the trip). It was still too early for them to arrive, so Chuck fished in the lake and I watched the sailboats. Odd seeing sailboats after being above timberline! It was hot, and I remember getting rather "cooked" in the sun. Our ride finally came and then it was all over but the long trip back home. For the first backpacking trip I had been on in almost two decades it turned out quite well, and I was hooked.

Distance
~20 miles
Starting Elevation
10,500'
Maximum Elevation
12,550'

Click on any picture below to see the slides full-sized.

Longs Peak Attempt

Two aborted attempts at Longs Peak (14,255') the first summer I was back in Colorado.

Longs Peak is the northernmost 14er in Colorado, and has a dominant position on the skyline as seen from Denver, adding a nice terminus to the Indian Peaks. Almost immediately upon moving back to Colorado in 1991 I wanted to climb it. I tried twice in July, 1992. The first time was in early July with a coworker, Naren. Starting at the Longs Peak trailhead at 9,400', our plan was to take the standard Keyhole route. So we hiked to Mills Moraine and then wrapped north and west around the base of Mt. Lady Washington (13,281'). After six miles and crossing the Boulder Field, we made it to the Keyhole (13,120'), and passed through to the west side of Longs.

On the west side the trail is across a talus and boulder strewn slope. Nothing particularly dangerous, but there are a few places where scrambling moves must be made. Looking to our west we could see there were a few little clouds that had formed, but nothing serious. We then made it to the Trough, a large couloir running about 500' both above and below where the trail intersects it. In late summer this can be a talus walk, but when we got there in early July it was still full of snow. So much so we couldn't easily climb the rocks on the side past a certain point, and with no crampons nor ice axes, didn't feel like spending a lot of time on the snow itself, since there would have been no way to stop sliding if one of us had slipped, and the run out far below was onto some very unpleasant looking talus. About this time we also noticed the tiny, puffy little clouds to our west had coalesced into a nice big cumulonimbus cloud which was much closer. That was two votes against continuing, so we turned around, retraced our route, and returned to the car, the last part of the hike being in driving rain (so it had been a good idea to get off!) The round trip for the day was about 14+ miles and 4,000' elevation gain.

The second trip was a few weeks later, when I tried again around my birthday (July 15). This time I made it to the Boulder Field and then it got very cold and windy, and when it started to rain I decided once again to turn around. Being above timberline in a thunderstorm is not a good idea, unless the idea of becoming a lightning rod appeals to you. On the way down on Mills Moraine I met a ranger going up and we chatted for a bit. There was a clap of thunder off near the summit and he winced. Turns out he'd been hit by lightning twice. The second time he was alone above timberline and went blind for over 20 minutes! Fun! Personally, I would have thought after the first time it was time to ask for a job handing out brochures and maps at the gates to RMNP, but here he was, going up to check on people in the Boulder Field and beyond, exposing himself to the possibility of a third strike. Third time's the charm?

Round-Trip
~14 miles
Starting Elevation
9,400'
Maximum Elevation
~13,300'

Click on any picture below to see the slides full-sized.

Fun and Sundry

Mostly things I've written to entertain myself.

A Bridge to Nowhere

A little story about management, goals and quality assurance.

I have recently finished reading a new set of kōans for programmers. I have long loved reading kōans in general. I like their paradoxical stories, even if I don't necessarily achieve enlightenment while reading them.

Given the nature of my personality, today I thought of the idea of writing "anti-kōans." Just like what Despair.com has done with (de-)motivational posters, I wondered, "How could you come up with kōans that bring home a lesson, a real, valuable lesson, but about something that is not necessarily positive or enlightening?" Below is my first example, something I call a "grōan" (pun intended). I am thinking of writing a series of them called "The Hateless Hate" (based on The Gateless Gate—get it?)

A bridge to nowhere

Once the prince came to Jiǎogēn, the humble monk tasked with making sure all foot, rider and wagon traffic moved on the kingdom's roads as quickly and directly as possible. The prince declared his vision for a new bridge, which would become the main bridge by which the many merchants, pilgrims and others in the kingdom would cross the dangerous, raging river to reach the imperial city, replacing the sturdy, if old and rather ugly stone bridge that was used now. The dream of the new bridge that the prince described to the monk was indeed impressive. It was to be built entirely of spider silk, renowned for its strength and versatility, and would be the envy of all rival kingdoms near and far.

"Surely it will take many years to construct such a worthy edifice, especially considering the need to use materials unfamiliar to any of the kingdom's craftspeople, requiring them to learn new skills," thought the monk. Caution would obviously be warranted, since if the bridge failed it would send whoever was on it—merchants, visiting dignitaries, perhaps the king himself—plummeting to their deaths in the rapids below. Therefore, Jiǎogēn asked how much time would be available to create such an impressive structure.

"Three months," answered the prince.

"Three months?" replied the monk, unsure that he had heard correctly. "Surely you mean three seasons? Or perhaps even three years?"

"Three months. It must be ready in time for the opening day of the large summer fair in the city. It will be the showcase of our power to all around."

"But in just three months time, we might just possibly be able to gather enough spider silk to build a simple rope bridge," protested the monk.

"The treasury has been instructed to allow you to purchase whatever you need. You will have your silk."

"And none of our engineers are familiar with working with spider silk," continued Jiǎogēn.

"Here are some scrolls describing how monks in other kingdoms have been able to build simple ladders using such silk," replied the prince. "A ladder is just like a bridge—a bridge between different heights instead of different sides! Such examples must be similar enough to be useful to you. And I have great confidence in your ability to take these descriptions of such puny attempts and expand them far beyond simple toys and build a bridge impressive enough to make our kingdom famous far and wide!"

"But even if we can purchase all the silk we need, and even if I can draft every worker in the countryside, and even if I can decipher these arcane scrolls and extract any useful lessons from them, three months gives us barely enough time to build such an edifice. There won't be time to make sure it can withstand the massive amount of people, animals, carts, chariots and wagons that will be crossing it to enter the city for the opening of the festival!", cried the monk. "How can we possibly open the new bridge if it hasn't been given a fair trial? Who will test it?"

"The travelers are aware of their role," calmly answered the prince, as he strode from the room.

Upon hearing this, Jiǎogēn became benighted.

The Case Against Meat

Why I do not eat meat or fish.

Note: This is not a polemic, nor is it a request for comments. I am not interested in your reasons for eating meat. I am not interested in your arguments about why I should eat meat. It is likely that if you are reading this it is because you asked for my reasons, and this is my answer. But that wasn't an invitation to "a conversation" in which you then try to talk me out of it.

Reason 1—My Health

I have always struggled with my cholesterol, and my numbers at my physical in 2016 weren't good. My doctor was talking statins if they don't improve, so I would rather try to make them improve without medication. After being just a vegetarian (not vegan) again for about a month, I had my numbers checked and they were much better. Total cholesterol is still high, but the "ratio" of HDL/Total was great (3.6, with 3.5 or below considered "excellent").

Reason 2—The Environment

I won't go into depth here, but just list the usual suspects. CAFOs are obviously the top one, and it's a big one for me. The water usage and runoff from livestock (or "protein," grrr) raisers worldwide is huge as well, especially as water is going to get more scarce. Just the general amount of fuel and resources needed and pollution produced in general by animal husbandry are also on my mind.

The depletion of fishing stocks in the oceans has led me to believe there is no environmentally sustainable way to continue to consume fish at the levels we do, which is unfortunate because I will miss sushi (although veggie sushi is pretty damned good).

And that doesn't even count things like antibiotics in feed, feeding fish and other animals to livestock, etc.

Reason 3—Spiritual Honesty

Sometime in the past five years, sitting there contentedly communing with my dog Merv, I've known I am sitting there with another consciousness, a "being." Others may argue about whether animals have souls or not, but I know from being with my dog that they feel happiness, excitement, pain, sorrow and other emotions. And if a dog like mine, with his small brain, can feel those things, then probably a cow can, too. Or even a chicken.

At some point, it is easier to not try to draw the line of "This brain is small enough to eat—it's OK" versus "This brain is too sophisticated, we can't eat it." In a similar manner, I once had a boss whose five-year old daughter sounded out "Dolphin safe" on a tuna can, and asked what that meant. When her mom explained that the tuna was caught in a way that kept dolphins from being killed, she asked, "But Mom, what about the tuna?," and became a vegetarian on the spot.

Combine that with my own realization that I would never eat meat again if I had to butcher the animals to do it. I don't even like cutting up a fish any more. There is just too much of a feeling of, "This was a living, breathing being with God's life implanted in them," and then when I look up and see my dog I wonder, "How can I judge the difference?"

Some would say, "You could just 'go organic,'" but in the end the animal is still dead. It was raised specifically to be killed and consumed.

"Our beef comes from happy cows"—Whole Foods sign in Boulder
"They aren't happy any more."—me

We're not talking, "But if you were starving, you could." Because I am not starving, and likely never will be. So it isn't a matter of survival—I don't need to eat meat to survive.

Finally, some may argue animals are placed under our dominion to be "sacrificed" to us, but I'm just not that important, thanks.

Reason 4—Simpler Life

I want to continue to simplify and downsize, and not eating meat will help with that. Less food in the fridge. Less types of cookware needed to produce a dinner. A lot less money! I loves me a good ribeye, but don't feel like taking out a second mortgage to have one these days. But if I am then "settling" on "just" sirloin, why not settle on saving the cow's life entirely, and have a grilled portobello instead?

Also, I honestly enjoy a lot of meatless meals. So if I don't need to eat meat in any given meal, then why eat it—just because of convention? "Sorry, cow—you had to die because I have to have some kind of meat on the plate to satisfy society, and your species was in the rotation for tonight." That doesn't cut it with me. Basically, we eat meat because of tradition. But hey, we used to own other people because of tradition, too, so tradition isn't enough of an argument.

Reason 5—Other Humans

After I first wrote this, my friend Aaron pointed out that another reason is that the meat processing industry is not worker-friendly and there are lots of injuries, repetitive stress disorders and the like, so while those workers are there volunarily, I still don't feel comfortable supporting something that hasn't changed much since The Jungle was written. Especially not when you hear about how the meat is "processed" in those places, anyway.

Summary

I am certainly not doing this to make life easier. In this part of the country eating out as a vegetarian is boring—pasta prima vera, salads (but not Caesar, Cobb or anything like that), bean burritos, a few uninspired Chinese dishes...and you're done. Or drive to the Indian restaurant in Columbia, 30 miles away.

I will probably still eat meat from time to time. Mmm, Mom's home cooking. But I am going to try and be much more mindful of it. I am going to be aware it is not just "meat" or "protein" (nice euphemism), but a dead animal, an ex-being—and consume it with that thought. Being aware that there are health, environmental, spiritual and lifestyle aspects to eating another being are all part of it.

But if it is cooked by someone else and served to me—thinking specifically of eating at my parents, for example (and not how to "game the system" by simply having someone else do it for me), then I will eat it. Similar to how some (not all) Buddhist monks will eat whatever is put into their begging bowl, even if it is meat, because to do otherwise would be to waste the food, which is worse, since then the animal was killed for effectively no reason.

But I don't want to personally increase the demand for meat.

Notes

See this:

A Plea for the Animals: The Moral, Philosophical, and Evolutionary Imperative to Treat All Beings with Compassion

Also see this.

Christian Buzzword Bingo

Something I wrote while studying to be a pastor (yeah, really).

Concerts I've Seen

Mostly for my own reference, here is a list of concerts I've been to over the years.

The following is a list of all the concerts that I've seen so far.

  • Elvin Bishop—in 1977 opening for E.L.O. (below). I wasn't a fan, especially not of Fooled Around and Fell in Love, although I remember I Strut My Stuff from the concert favorably, and have since heard and liked him on Prairie Home Companion.
  • E.L.O.—on January 19, 1977 in Denver's McNichols arena. What can I say? I was into "progressive/art rock" in the 1970s. I got better.
  • Ramsey Lewis—ca. 1977-8 in Ft. Collins with my folks. I grew up hearing a lot of music in the house; my parents actually have a pretty wide spectrum of tastes in music. Ramsey Lewis was on the "hi-fi console" "playlist" a lot. We got to see him live as a family and it was good.
  • John Sebastian—opened for Fleetwood Mac (below). Don't honestly remember him, which is too bad.
  • Firefall—opened for Fleetwood Mac. They're from Boulder. I grew up in Boulder and came of age at their peak, but at the time I thought they sucked. I still think so, actually. Bring out Fleetwood Mac!
  • Bob Seger—I was reminded by a thread on Facebook that the Fleetwood Mac concert also had Bob Seger as an opener. You can determine my feelings about Bob Seger then and now by the fact that I had forgotten that I'd seen him live.
  • Fleetwood Mac—at CU's Folsom Field, May 1, 1977, during Rumours tour. They were great. It started to rain and given the exodus from general admission on the field, I actually ended right up at the stage while they continued to play (they were under cover—we were not).
  • Leon Redbone—got to see the great crooner of songs of times past at the University of Missouri's Jesse Hall ca. 1982 or so.
  • Dave Brubeck—my earliest musical memory ever (five? younger?) is the still-awesome Time Out album, which my parents listened to, a lot. Got to see Brubeck with them at MU's Jesse Hall ca. 1982-3.
  • Canadian Brass—saw them with my folks at M.U.'s Jesse Hall sometime in the early-to-mid 1980s.
  • 3—got dragged to this undead reincarnation of E.L.P. around 1988 in KC by my then sister-in-law. It was dreadful.
  • John McCutcheon—saw him sing and play the hammer dulcimer at the KC Unitarian Church in the late 1980's/early 1990's.
  • The Millions (x2)—this band you've never heard of was out of Nebraska and was popular in the club scene in KC at the turn of the '90s. Saw them open for Pylon (below) and then saw them in an illegal show (they'd call it a rave now) in an abandoned warehouse in the industrial bottoms of KC—until the cops came and closed the thing down.
  • Pylon—saw them in a club in KC around 1990. R.E.M. had this to say about them for their cover of Pylon's "Crazy" on Dead Letter Office —"I remember hearing their version on the radio the day that Chronic Town came out and being suddenly depressed by how much better it was than our record."
  • Neil Young—one of my long-time favorite artists. Saw him at Memorial Hall in Kansas City, KS, on January 12, 1989, with my Dad (another forever fan) and friend Gabe. He did an acoustic set and then came on with "the Restless" (Frank Sampedro, Ben Keith, Rick Rosas, Chad Cromwell) and rocked the house.
  • Robyn Hitchcock and the Egyptians—opened for R.E.M. (below). This was the So You Think You're In Love era.
  • R.E.M.—at Kemper Arena in KC on March 4, 1989 during the Green tour. Went with my friend Gabe and my dad.
  • Feelies—absolutely one of my favorite bands. I was introduced to them by my friend Gabe in anticipation of the Lou Reed concert (below). I am a fan for life.
  • Lou Reed—at Memorial Hall, Kansas City, KS, April 10, 1991 for the New York tour. Great show. My ears rang for days.
  • Kathy Mattea—opened for Clint Black (below) Much better than Mr. Black.
  • Clint Black—got dragged to this show at the Missouri State Fair in Sedalia in 1990. I do not like mainstream country (roots country—Hank Williams, Johnny Cash, yes. Alternatwang, yes. Commercial country, no.) It sucked. What really pissed me off was for an encore he and his band did a great blues number and I remembered thinking, "You could have played like that all along?
  • Joey Skidmore—my friend Calvin's stepbrother, Joey taught me to drink Stingers. Creator of the song Buttsteak. Saw him in a club in KC for the Welcome to Humansville album release party.
  • Emmy Lou Harris—saw her at a free outdoor concert at Crown Center sometime in 1990-91.
  • Chris Isaak (x2)—what a great performer! Puts on a great show, has a great voice. Saw him first in Boulder in the early 1990s at the Fox on the Hill in Boulder. Then at Sybase's 10th anniversary Christmas party in 1995.
  • Clarence "Gatemouth" Brown—opened for Taj Mahal and Michelle Shocked (below) at the University of Colorado's Macky Auditorium sometime in the early 1990s. First time I'd ever heard of him (sorry), but he put on a good gig. Too bad I was distracting waiting for the next two acts.
  • Taj Mahal—I've liked Taj since I was a teenager, so getting to see him and Michelle Shocked in one evening (and even play together during an encore) was excellent.
  • Michelle Shocked—I've loved Michelle ever since I heard the Texas Campfire Tapes. Considering her opening acts and that Alison Brown was in her band at the time and the fact this was at the height of her albums (the tour was in support of Arkansas Traveler, if I recall correctly), all I can say is, great show! Too bad you weren't there.
  • Joe Sample—I had never heard of this jazz pianist until my friend Guido dragged my friend Gregg and me to his show at Yoshi's in Oakland in 1995. Excellent venue, excellent sushi, excellent seats, excellent friends, excellent music.
  • Brian Ferry—what a suave m—f—. Great voice, too. Saw him at Macky in Boulder on November 13, 1999. They did Avalon, that was enough.
  • Elton John—saw him with Billy Joel (below) on April 12, 2001 at Kansas City's Kemper Arena. Good show. They did a set with both bands on stage, then each did a solo set (and each covered one of the other's songs), and then they did a finale set with both bands on stage again. Fun. While I am not an ongoing fan, his greatest hits (first volume) was one of the first LPs I ever bought with my own money. The stuff up until he split from Bernie Taupin still stands on its own.
  • Billy Joel (x2)—my lovely wife has been a Billy Joel fan forever, and I have taken her to his concerts twice (and she has since seen him a third time). First at Kemper Arena in KC on April 12, 2001 for the Face to Face tour with Elton John (above). Then on December 6, 2007 we saw him at the Sprint Center in KC from the 11th row. I have to admit that while I am not the world's greatest Billy Joel fan, I do enjoy his concerts.
  • Alabama 3 (x2)—saw them in Norwich, England at a club called the Waterfront around 2003, then again at London's Astoria on December 14, 2004. All I can say about them is "Wow". Along with the Feelies, probably my favorite band in this list.
  • Anne McCue (x2)—Les and I love (love, love, love) Anne McCue. She's an awesome songwriter and a great guitarist. I got to see her at The Living Room in NYC on August 9, 2010, and she even signed a CD for Les, who was very jealous for not getting to go. Then Les saw her in Champaign, Illinois a few years back, and we both went to see her at the Columbia Public Library on August 24, 2017.
  • Sarah Jaffe—Sarah played at the Living Room before Anne McCue (she didn't "open" for Anne—the club doesn't work that way). I had never heard (of) her before, but am a fan after listening to her set. If you like singer-songwriters (and I do), then you'll like Sarah.
  • Erin Bode, Tony DeSare and Bucky Pizzarelli, and Andra Suchy, all at the Fabulous Fox in St. Louis for our first Prairie Home Companion show.
  • Interpol—opening act for U2 (below). Good from what we heard, although their "sound" got a bit repetitious by the end of the set. Maybe it was just me.
  • U2finally got to see them on July 17, 2011, during their 360° tour at Busch Stadium in St. Louis at Busch Stadium. Awesome show, even if it was freakin' HOT (90+ degrees in the shade, even after 9:00pm).
  • The Bluegrass Martins (x4-5)—they actually live around the corner and throw a free block party every year. Now that's being a good neighbor! Great music.
  • Liverpool Legends—a Beatles tribute band we saw at the Main Street Music Hall in Osage Beach on March 8, 2013. We took the three youngest as part of Gloria's birthday present (she's a big Beatles fan). They were much better than I expected, and it was a good time had by all.
  • Moon Hooch—opening act for They Might Be Giants (below). Think "house" music but with two saxes and drums. I went in not even caring who was opening for TMBG and walked out a huge fan of these guys.
  • They Might Be Giants—took the three youngest on March 14, 2013, to see them at the Blue Note in Columbia. A great show full of "nerd rock" songs and lyrics. The crowd was very familiar with their music and there was a lot of singing and dancing along. Good times.
  • Lyle Lovett—on May 13, 2014, at Jesse Auditorium at MU. Took my folks (long-time fans) to see him play with an acoustic band. Great show with great seats (front row balcony!)
  • Joe Newberry, Pokey LaFarge and Steve Wariner—on Prairie Home Companion at the Fabulous Fox Theatre in St. Louis on June 14, 2014.
  • Dave Rawlings Machine with Gillian Welch (x3)—first at the Sheldon in St. Louis on June 25, 2014. Quite possibly the best sounding concert I've ever attended. John Paul Jones from Led Zeppelin was their mandolin player! Then again on April 17, 2016 at the Blue Note in Columbia. Finally as "Gillian Welch and Dave Rawlings" at the Folly Theater in Kansas City on September 14, 2018.
  • Sheryl Crow—another bucket list for both Les and me. Saw her at the Missouri Theatre in Columbia on October 9, 2015.
  • Arlo Guthrie—saw him with Les and my folks in Columbia at the Missouri Theatre on February 24, 2016. Lots of fun.
  • Margaret Glaspy—good singer-songwriter, we saw her open for the Lumineers (below).
  • Andrew Bird—I've long loved his quirky music since the Squirrel Nut Zippers and Bowl of Fire in the 1990s. He opened for the Lumineers and played a few songs with them as well. Great musician!
  • Lumineers—Les and I went to see them at the Sprint Center in KC on January 24, 2017. Quite possibly the best concert I've ever been to.
  • B-52s—Erin and I went to see them at the Uptown Theater in Kansas City on October 22, 2017. Fred was a little cranky, but it was a fun show. My only real beef was it was too short (about 90 minutes exactly).
  • "Weird Al" Yankovic—Jon and I went to see him at Jesse Auditorium on the MU campus on June 8, 2018. This was him doing mostly original (but still highly derivative) songs and it was amazing! I can honestly say I was blown away and didn't expect the level of musicianship he and his band displayed, or how good of a singer he is! And of course it was a lot of fun.
  • Joan Jett—Les and I saw her open for Heart at the Starlight Theatre in Kansas City on October 8, 2019. She was fantastic, a great performer and crowd-pleaser.
  • Heart—This was a bucket list item for me, and I paid for the privilege so that we were not only 4th row center, right in front of Ann Wilson's mic, but also we did the VIP "meet and greet" package. Beautiful show, one of my all-time favs.

Felix the Flying Frog

A parable about schedules, cycle times and shaping new behaviors.

Editor's note—I would like to give credit for this but do not know the original author, since it was forwarded around the Internet years ago without attribution. If anyone knows who is the original author and can prove it, please let me know to give them their just credit for writing one of the true classics of all time.

Once upon a time, there lived a man named Clarence who had a pet frog named Felix. Clarence lived a modestly comfortable existence on what he earned working at Informix, but he always dreamed of being rich.

"Felix!" he exclaimed one day, "We're going to be rich! I'm going to teach you how to fly!"

Felix, of course, was terrified at the prospect: "I can't fly, you idiot...I'm a frog, not a canary!"

Clarence, disappointed at the initial reaction, told Felix: "That negative attitude of yours could be a real problem. I'm sending you to class."

So Felix went to a three day class and learned about problem solving, time management and effective communication...but nothing about flying.

On the first day of "flying lessons", Clarence could barely control his excitement (and Felix could barely control his bladder). Clarence explained that their apartment building had 15 floors, and each day Felix would jump out of a window starting with the first floor, eventually getting to the top floor.

After each jump, Felix would analyze how well he flew, isolate on the most effective flying techniques and implement the improved process for the next flight. By the time they reached the top floor, Felix would surely be able to fly.

Felix pleaded for his life, but it fell on deaf ears. "He just doesn't understand how important this is...." thought Clarence, "but I won't let nay-sayers get in my way."

So, with that, Clarence opened the window and threw Felix out (who landed with a thud).

Next day (poised for his second flying lesson) Felix again begged not to be thrown out of the window. With that, Clarence opened his pocket guide to Managing More Effectively and showed Felix the part about how one must always expect resistance when implementing new programs.

And with that, he threw Felix out the window. (THUD)

On the third day (at the third floor) Felix tried a different ploy: stalling, he asked for a delay in the "project" until better weather would make flying conditions more favorable.

But Clarence was ready for him: he produced a timeline and pointed to the third milestone and asked, "You don't want to slip the schedule, do you?"

From his training, Felix knew that not jumping today would mean that he would have to jump TWICE tomorrow...so he just said: "OK. Let's go." And out the window he went.

Now this is not to say that Felix wasn't trying his best. On the fifth day he flapped his feet madly in a vain attempt to fly. On the sixth day he tied a small red cape around his neck and tried to think "Superman" thoughts.

But try as he might, he couldn't fly.

By the seventh day, Felix (accepting his fate) no longer begged for mercy...he simply looked at Clarence and said: "You know you're killing me, don't you?" Clarence pointed out that Felix's performance so far had been less than exemplary, failing to meet any of the milestone goals he had set for him.

With that, Felix said quietly: "Shut up and open the window," and he leaped out, taking careful aim on the large jagged rock by the corner of the building. And Felix went to that great lily pad in the sky.

Clarence was extremely upset, as his project had failed to meet a single goal that he had set out to accomplish. Felix had not only failed to fly, he didn't even learn how to steer his flight as he fell like a sack of cement...nor did he improve his productivity when Clarence had told him to "Fall smarter, not harder."

The only thing left for Clarence to do was to analyze the process and try to determine where it had gone wrong. After much thought, Clarence smiled and said: "Next time...I'm getting a smarter frog!"

Here's a poster I created for this parable:

Floaters: The Story of an Eye

A little something I put together about my experience with a retinal tear.

Internet Rules

This list is meant to be a set of talking points for engaging with family and friends and reminding them of the implications of interacting on the internet with companies and each other via services such as Facebook, Twitter, and Gmail.

The point isn't to stifle all interaction, but instead to try to raise awareness of the consequences with an eye towards increasing "privacy prudence." It is easy to toss out "If you are not the customer, then you are the product," but what does that actually mean? It means:

  • Any information you give a company will be kept forever.
  • This includes via offline means like warranty cards, sweepstakes, subscriptions and the like.
  • Any information you give a company will be used to sell you things.
  • Any information you give a company will be used to deny your claims.
  • Any information you give a company will be sold to other companies.
  • You won't know all or any of the companies that bought your data.
  • Any information you give a company will end up in (the/a/many) government's hands.
  • Elected officials, political parties, religious organizations and charities that you give information to will act the same as any company with your data.
  • Any information you give a company will end up in criminal hands.
  • Credit monitoring, deleting accounts and class action lawsuits can't undo the damage done.
  • Just because a company says they deleted your data at your request doesn't mean they did.
  • Any information you give a company can and will be used against you in a court of law.
  • You can't know all the pieces of information you give to a company, because some will be silently collected by invisible means.
  • Every web page you visit is giving a company information about you.
  • Every email you receive is giving a company information about you, or trying to, via embedded images that tell whether you opened the email and unique web links (personalized URLs, or "PURLs") that track how effective the email was in getting you to engage with the company.
  • Any information you give a company will be aggregated with information you've given other companies and the government, yielding ever more insights into your life, health, mental state, family, relationships, business and leisure, as well as those for your family and friends.
  • Those other companies may change their relationship to you based on the data they bought—your insurance payment may go up because of your credit card purchase patterns or payment history.
  • Your search results and news headlines will be limited by algorithms that "know what you want."
  • Any information you give a company probably sells some family and friends down the river.
  • Your family and friends have sold you down the river.
  • No one sold their family and friends down the river on purpose—you were just exchanging emails (data), social posts (data), calendar invites (data) and links to interesting things (data) with your contacts (data).
  • "Anonymized data" usually isn't.
  • It is getting harder and harder to surf the internet anonymously, no matter how many browser plugins you install—look up "browser fingerprinting."
  • Any terms of service for using a site, software or service can be changed at whim, invalidating all past promises by a company.
  • Silently append "for now" to any statement made by any company in regards to privacy or data collection.
  • Even companies founded on the premise of preserving privacy "forever" should be heard as always saying, "for now."
  • Mergers and acquisitions trump terms of service, every time.
  • There is no such thing as a "good" company, there is only maximizing shareholder value.
  • Selling and using your data against you maximizes shareholder value.
  • Privacy can be given away, but it can't be bought back.
  • There is no way to control any of the above, other than to not play.
  • Not playing is data, too.

Contributions in the same spirit are welcome. Thanks to Aaron and Mark for their feedback.

Scenes from My Past Lives

Some scenes from my past life as a software consultant.

While they did not all happen in one place, and while some of it is a little exaggerated, I swear most of it is true! Or true enough.

Systemantics

Get your daily dose of systems theory humor.

Workouts

Various workouts from my sessions with a personal trainer.

Tech Stuff

Various bits of tech I've figured out and want to remember.

Ten Steps for Linux Survival

I wrote a book! If you'd like to check it out, click on one of the following:

Always Read Generated Code

This is one of my "A-ha" moments.

Consider how a lot of interfaces work—load an object from some remote system, make some property changes on the object, then save it back to the remote system. The pseudocode looks something like:

if (needToChangePropX == true)
{
    LogChange("PropX", obj.PropX, newPropXValue);
    obj.PropX = newPropXValue;
    objChanged = true; // To keep track if anything changed
}

if (needToChangePropY == true)
{
    LogChange("PropY", obj.PropY, newPropYValue);
    obj.PropY = newPropYValue;
    objChanged = true; // To keep track if anything changed
}

// And so on...

if (objChanged == true)
{
    obj.Save();
}

Besides just the general ugliness that has to come from checking all the values to determine if something applies or not, there are those three repetitive statements in the body of each if:

  1. Log something (because without logging debugging this thing is almost impossible, especially production problems).
  2. Change the actual thing you want to change.
  3. Mark that you have changed the list item.

That last piece is because you don't want to save the list item on every property change. The round-trips and version history would kill you.

Even if you extract out everything to a method, you're having to manually call that method for every property change.

The above works, but it sure is ugly (as interfacing with legacy systems often is).

But for interfaces that are based on service references or .edmx files in Entity Framework, there is a better way.

While researching something else, I actually was looking at the generated code in Reference.cs that gets created when doing a service reference...The first thing that caught my eye but wasn't immediately useful is that all the classes in the generated code are partials—hmmm. More on that at the end. But the second thing that caught my eye was this:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")]
public string PropX
{
    get
    {
        return this._PropX;
    }
    set
    {
        this.OnPropXChanging(value);
        this._PropX = value;
        this.OnPropXChanged();
        this.OnPropertyChanged("PropX");
    }
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")]
private string _PropX;
partial void OnPropXChanging(string value);
partial void OnPropXChanged();

Well look at that. Every property in that generated context class raises OnChange events! At first, I thought I could use the partials and just override those for each property. But that is a lot of work. But see that this.OnPropertyChanged("PropX") at the end of the setter? THAT is interesting! Let's go look at that:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")]
public event global::System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")]
protected virtual void OnPropertyChanged(string property)
{
    if ((this.PropertyChanged != null))
    {
        this.PropertyChanged(this,
                             new global::System.ComponentModel.PropertyChangedEventArgs(property));
    }
}

It checks to see if the public PropertyChanged property has an event handler in it, and if it does, it calls it, passing in both the list item object itself (the list item's current state after the change) and the property name that changed! Bingo!

So, in the loop where I am reading each item, I now just do this up front:

obj.PropertyChanged +=
(object sender, System.ComponentModel.PropertyChangedEventArgs e) =>
{
    var changedItem = (RemoteObjectType)sender;
    Log.Trace($"{e.PropertyName} changed to " +
               "{changedItem.GetType().GetProperty(e.PropertyName).GetValue(changedItem, null)}");
    objChanged = true;
};

Thanks to closures, the handler gets access to the objChanged flag. And using reflection I can log based on the property name passed in.

So now the code to check and set a property simply looks like this:

if (needToChangePropX == true)
{
    obj.PropX = newPropXValue;
}

But we still get logging and the flag set telling us the list item has changed.

How cool is that?

Code Challenge!

Here is a bit of fun I wrote for a class years ago.

Empty anonymous collections in C#

This week I had a need to create an empty list with groups of three items (name, customer number, external entity id) in one place in a method, and use it further down in the same method.

This is transient data used only in this single method. Since I am only using it in one place, creating a class or struct seemed like overkill. (And yes, it indicated a refactor was necessary, and I later did so, but stay with me—la la la can't hear you).

My first thought was to use a tuple:

var x = new List<Tuple<string, long, int>>();
...
x.Add(new Tuple<string, long, int>("Jones, David", 12345, 1));

Of course the problem with that is while it is strongly typed, the names when I consume it later are Item1, Item2 and Item3. Not to meaningful.

OK, then I can use dynamic, and give it meaningful names when I add an item to the list

var y = new List<dynamic>();
...
y.Add(new { name = "Jones, David", custno = 12345, entityid = 1 });

The problem with that is then I don't get strong typing, so if I mistype one of the member names when I am accessing it later, I won't know until run-time. Not good.

This then came to me. It works just dandy, and gives me an empty list of the appropriate type with both meaningful member names and strong typing:

var z = (from x in new List<int>() select new { name = "", custno = 0L, entityid = 0 }).ToList();
...
z.Add(new { name = "Jones, David", custno = 12345, entityid = 1 });

Because it is selecting from an empty list, it creates an empty list, but strongly typed exactly as I need it! Cool? Or horrifying?

Strongly-typed empty anonymous collection

Faking Web Service Calls

Every once in a while it is nice to be able to mock up something like a Web service without having to write code first.

Perhaps you just don't want to spend the time writing the service yet, no matter how trivial. Maybe you don't have the appropriate software installed or configured. Whatever. If your local Web server or your ISP is running on a *IX/BSD OS, then you can use native "UNIX" file systems to mock up Web service "GET" methods, including parameterized URLs.

Note: The following technique will not work for FAT/NTFS file systems due to the restrictions on special characters like "?" in file names.

Let's say your client code is going to want to build URLs of the type:

http://yoursite.com/objectname?querystring

For example:

http://yoursite.com/customers?Dick%20Tracy

You can simply create test files in any format you want (XML, JSON, etc.) and push them to the root of your host and name them accordingly. For example, you could create a file named customers?Dick%20Tracy, e.g.,

$ touch 'customers?Dick%20Tracy'
$ ls
customers?Dick%20Tracy

The single quotes are required.

Now you should be able to do something like the following (Objective-C code, map the example to your own programming language to make it work for you).

NSURL *url = [NSURL URLWithString:@"http://localhost:8000/customers%3fDick%20Tracy"];
NSDictionary *customer = [NSDictionary dictionaryWithContentsOfURL:url];

Works great! And because there are so few special character restrictions in file names on *IX file systems, you can name your files to represent multiple query string parameters. The above file just as easily could have been named:

customers?lastname=Tracy&firstname=Dick&middlename=

...allowing HTTP "GET" access via:

http://localhost:8000/customers?lastname=Tracy&firstname=Dick&middlename=

It is then easy enough to serve such "requests" using something like:

python -m SimpleHTTPServer 8000

Yeah, this is a hack, but it's saved me time by allowing me to quickly get something I can access using the HTTP protocol's GET method that ultimately mimics the URLs I will be building and sending to a real Web service later. A few minutes of file editing and I have a "Web service" mockup ready for testing from the client prototype, at least for GETs.

Cool.

Finding All Users in A/D Groups

I am a big believer in using the ADSI query provider for being able to conduct LDAP queries in SQL Server against Active Directory.

You set up an ADSI linked server in your SQL Server (I usually call mine, well, "ADSI") and then use Transact-SQL's OPENQUERY to pass off a query to A/D. You can filter the results in the LDAP query, but you can then also use all sorts of SQL chewy goodness against the result set, such as grouping, ordering, more filtering, etc. All good.

Today I had to solve a specific problem—finding all users in an A/D group, when that group may contain groups, and those groups may contain groups, and so on. What I want at the end is a list of all end users that are in the "root" group, "exploding" all of the child groups so that I get nothing but users at the end, not intervening child groups.

Consider the following example:

  • Apps
    • CRMApp
      • John Smith
      • Mary Jones
    • AccountingApp
      • John Smith
      • Chuck Miller

If I query against the group "Apps" I want to have the following returned:

  • John Smith
  • Mary Jones
  • Chuck Miller

I do not want either the CRMApp nor AccountingApp group names in the results.

The rest of this post will describe the LDAP syntax to use as well as a few tips I often use to filter out "real people" in LDAP query results from service accounts, elevated ids, contacts, and the like. Here is the sample query:

SELECT
    *
FROM OPENQUERY(ADSI,
    '<LDAP://DC=FOO,DC=COM>;
    (&(objectCategory=Person)(objectClass=user)(sn=*)(givenName=*)(title=*)(ipPhone=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberof:1.2.840.113556.1.4.1941:=cn=Apps,ou=Groups,dc=FOO,dc=COM));
    cn;subtree')

The OPENQUERY query syntax for LDAP via ADSI is as follows:

  • Base distinguished name—the starting point for the query in the directory, e.g., <LDAP://DC=FOO,DC=COM>.
  • Search filters—the LDAP equivalent to the SQL WHERE clause. A unique syntax that takes some getting used to, but there are lots of resources on the internet to learn it.
  • Attributes—the comma-delimited attributes (values) to return with the query results.
  • Scope—the scope of the search, which can be base (only search at the starting point), onelevel (go one level down in the directory hierarchy) or as in our case subtree (recurse through the entire directory from the starting point).

Note: Each of the above query parts are separated from the others by semicolons. You can place the independent parts on different lines as shown above, but you cannot split a given part into multiple lines. In other words, the search filter must be all on one line, as shown.

Let's pull the query apart piece by piece:

  1. The query starts at <LDAP://DC=FOO,DC=COM> and looks recursively down from there (because of the subtree at the end of the query). For performance or security purposes you could change the starting point of the query if you knew it was rooted somewhere deeper in your directory structure.
  2. It looks for for directory entries that:
    • Are a personobjectCategory=Person
    • Are a user (not a contact)—objectClass=user
    • Have a last name (surname, or sn)—sn=*
    • Have a first name (given name or givenName) - givenName=*
    • Have a job title (requires you to fill this in Active Directory, obviously)—title=*
    • Have a desk phone (in our case filled in by our VOIP software)—ipPhone=*
    • Are NOT disabled accounts (note this is basically a "magic number") – !(userAccountControl:1.2.840.113556.1.4.803:=2)
    • Belong to the group (I figure out the group's common name or "cn" first, if you prepend that with the memberof:1.2.840.113556.1.4.1941:= magic string that is what does the recursive lookup through all its member groups and users to find all its members) - memberof:1.2.840.113556.1.4.1941:=cn=Apps,ou=Groups,dc=FOO,dc=COM

At this time the sample query only returns common names (cn), but could return user ids and anything else for that matter just by adding the comma-delimited attributes to the list along with cn at the end of the query. Some common attributes I often include in my results are:

  • cn—common name, for users often equivalent to display name
  • department
  • displayName
  • givenName—first name
  • l—city ("locality")
  • mail—email address
  • manager—if you've filled out the "reports to" structure in A/D
  • postalCode—ZIP code or postal code
  • sAMAccountName—userid or account
  • sn—last name ("surname")
  • st—state
  • streetAddress
  • telephoneNumber
  • title

A few final notes:

  • ADSI needs A/D credentials—when setting up the linked server from SQL Server it has to have A/D credentials to connect to Active Directory, but they don't need to be "special"
  • ADSI can handle custom attributes—if you have added schema extensions to A/D, they can be queried with ADSI.
  • ADSI can't handle repeating attributes—some A/D attributes can hold multiple entries, but ADSI can't query or return these.

That's it. ADSI queries in general are a very common technique I use for various purposes, and this example was a real-world example that came up today. I hope you found it helpful.

For more of my thoughts on LDAP, see this post.

Fixing Dropped RDP Gateway Connections

These are the two things I had to do to get a Windows remote desktop (RDP) connection to consistently work from a Windows 8 or higher client to a Windows 2012 server via a Microsoft Remote Desktop Gateway (RDG).

Symptoms

  • You set up an RDP connection via a RDG. It works correctly the first time, but all subsequent attempts to login result in the remote desktop client prompting for your credentials but then returning to the RDP connection prompt again without connecting.

And/or:

  • You set up an RDP connection via RDG. It works correctly, but the connection drops and then automatically reconnects every 60 seconds or so.

If either of these are happening to you, read on.

First connection works, subsequent connections don't

The problem comes from how you answer the prompt the first time you successfully connect to the desktop. Depending on your RDG's policy, you may receive a "Logon Message" prompt similar to the following:

Be careful how you answer the two check boxes at the bottom. You must check the first one ("I understand and agree to the terms of this policy") to complete logging in. However, if you check the second one ("Do not ask again unless changes to policy occur") and your client machine is not under the same group policy as the server, i.e., you are connecting to your work's RDG via an RDP connection on your home machine, you will get symptom #1. So leave it unchecked, which means you will have to answer this prompt every time you login via the RDG, but so it goes.

If you have already checked the second check box and are getting symptom #1, the following may be helpful.

Since the following involves editing the registry, you take on all risk by doing this, and for this post I presume you know what you are doing. I am simply outlining what worked for me. Be careful and don't just blindly follow these instructions but use them as a starting point for your own problem determination and correction.

  1. I cleaned up all Remote Desktop entries in the registry dealing with the target RDP server (using its name to search on). These will appear under HKCU\Software\Microsoft\Terminal Server Client\Servers\<servername> (where <servername> is the problematic server). I simply deleted the key for the problem server (only).
  2. There were also entries under HKCU\Software\Microsoft\Terminal Server Gateway\<domain> (where <domain> is the internal A/D domain name of the server I was connecting to). Under that was a key called Messages. This had the message from the above logon prompt cached in it. I simply deleted the key for the specific domain (only).
  3. When I then tried to reconnect I was presented with the above logon message box again. Progress! On a hunch I then checked the first check box but left the second unchecked and from then on was able to reconnect successfully (albeit always having to answer the first check box in the logon message prompt).

This symptom only happened on my home box. On my work laptop it did not, even when the second check box was checked. My theory is that since the work laptop is under the same Active Directory group policy as the RDG server it all "just works," but since the home box is not and has no way of checking policy until it connects, it causes an issue. You would think Microsoft could do better than allowing you to shoot yourself in the foot like that.

Connection keeps disconnecting after 60 seconds

This one seems to be a specific "Windows 8 thing" if you search for it on the 'net (I don't know if it still affects Windows 10). This post has a lot of things to try in the long comment thread. However, the one that worked for me was changing the registry to disable UDP for RDP clients. Note that the original comment that proposes the registry change for this gets the value name wrong. Another post has the correct name in a comment correcting that comment (got that?). To be clear, the value name is fClientDisableUDP ( not tofClientDisableUDP).

Since the following involves editing the registry, you take on all risk by doing this, and for this post I presume you know what you are doing. I am simply outlining what worked for me. Be careful and don't just blindly follow these instructions but use them as a starting point for your own problem determination and correction.

  1. Navigate to HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client.
  2. Create a DWORD named fClientDisableUDP and assign it a value of 1.

That should be all there is to it. After making the above change I had a multi-monitor RDP session via the RDG work uninterrupted for hours.

I hope this post helps someone else who is searching for answers to these issues.

Fun with ISNUMERIC

This bit me, so I thought I would put up a post about it.

See, without looking at the answers below first, whether you can guess which of the following queries return 0 and which return 1 in SQL Server:

SELECT '.',   ISNUMERIC('.')
SELECT '+',   ISNUMERIC('+')
SELECT '-',   ISNUMERIC('-')
SELECT '*',   ISNUMERIC('\*')
SELECT '/',   ISNUMERIC('/')
SELECT 'E',   ISNUMERIC('E')
SELECT '0E0', ISNUMERIC('0E0')
SELECT '$',   ISNUMERIC('\$')

The answers are below (scroll down):















Results:

.    1
+    1
-    1
*    0
/    0
E    0
0E0  1
$    1

The SQL Server help for ISNUMERIC clearly states "ISNUMERIC returns 1 for some characters that are not numbers, such as plus (+), minus (-), and valid currency symbols such as the dollar sign ($)." I thought that means it would consider +1 or 0.1 as numeric. Never in a million years would I have guessed that it meant a plus (+) sign or a period (.) by itself is considered numeric.

You have been warned.

Grokking LDAP

This article constitutes those little bursts into a higher reality I've had while getting my head around LDAP (five minutes to learn, a lifetime to master!)

Introduction

As I worked on one of two personal LDAP projects I wanted to do, it occurred to me that after reaching a certain level of understanding of LDAP (it was the fourth LDAP project for me), I should share some epiphanies I've had about it over the years.

NOTE: This post is not an LDAP tutorial! Familiarity with LDAP at a conceptual level at least is assumed. Some of this may seem fairly esoteric if you don't understand LDAP at all. This essay is instead a series of notes based on clearing up misconceptions someone who has started to delve into LDAP may have. I struggled under the wrong concepts for quite a while before it started falling into place.

CAUTION: Some of what I say in here isn't "official LDAP speak". In other words, some of the concepts I am talking about are constructs I've made up in my own head that I've found to be useful when dealing with LDAP-based directories, and you won't find them anywhere else (that I've seen).

In addition, I have tried to use certain phrases in very specific ways throughout the article.

  • Object instance—a specific directory entry with a specific fully qualified distinguished name.
  • Object type—the definition of a given set of named attributes defined in a schema. The LDAP schema syntax uses objectclass, but I try to avoid that because of the overloading with object-oriented programming.

Author's note—an early reviewer of this piece objected to my renaming LDAP's objectclass to "object type" and felt the intended audience could make the distinction. He is probably right.

A Hierarchy That's Not a Hierarchy

Everyone approaches LDAP as a hierarchy. This is wrong. That statement may seem like heresy or blasphemy, given the 'obvious' hierarchical nature of an LDAP directory, but I stand by it. The name space of an LDAP directory is hierarchical, but that is all. And note this—the name space hierarchy is not typically used to navigate! Repeat this to yourself 4,096 times until you you get it! The name space hierarchy is not typically used to navigate!

Think about XML name spaces for a similar situation—they are URIs that uniquely name something without necessarily representing a valid URL to which you can navigate. In LDAP, the distingushedName (dn) (pseudo)attribute of an object, a node in the directory, is simply a name, even though it looks like it has more meaning or relationship to the object's contents than it does.

Consider the following distinguished name, in LDIF syntax:

dn: cn=James Lehmer,dc=dullroar,dc=com

If this were the fully qualified distinguished name (FQDN) for an inetOrgPerson object, then commonName (cn) would be an attribute of the object (required, in fact, by the person class, one of the parent class types for inetOrgPerson), and the contents of the cn attribute could be the target of a search. The leftmost part of the FQDN (cn=James Lehmer in our case) is the only component of a FQDN that has to be an attribute in the object with that FQDN.

Note that the domainComponent (dc) attribute which seems to be implied is available from our FQDN is not only not required but it is not even defined as an attribute for the object type inetOrgPerson at all, nor its parents organizationalPerson or person, nor the ultimate parent type top! This is often the case—that some "component" of a FQDN, such as the dc "attributes" in this case (dc=dullroar,dc=com), are not actually attributes of the object being named by the FQDN. Remember, the "N" at the end of FQDN stands for "Name", and it is only that. You cannot imply object content from it.

In some sense, it is better to think of the dn (pseudo)attribute as an opaque string, not having any inherent meaning (as Tim Berners-Lee reminds us we are supposed to think of URIs). Yes, the objects in the directory must be created in a name space hierarchy. But the hierarchy is a name space hierarchy only. You will access the objects via searches that often bypass any component of the FQDN name space entirely.

Remember, you can only search for entries based on their attributes. In the end, dn seems like just another attribute, although in most LDAP implementations you typically can't search on it (you can use it as the starting point of a search, however), which is why I call it a (pseudo)attribute in places. So, to find the above named entry, we would have to use a LDAP search like the following, perhaps setting the starting point for the search at dc=dullroar,dc=com:

(cn=James Lehmer)

NOTE: Some objects do have dc attributes. For those objects, you could perform a search such as the following.

(&(dc=dullroar)(dc=com))

But this search would not work for the inetOrgPerson object, since it nor any of its parent object types include that attribute, and you don't search "down" a hierarchy, you simply search for objects that themselves have specific attributes. What I mean by that is you don't navigate by first finding the node with dc=com and then the node under it with dc=dullroar, etc. Instead, you are looking directly for the node with cn=James Lehmer.

Often, you must alter the schema and add a new object that simply has the attributes that are the parts of the FQDN, so that you can store objects that you can search for using the FQDN, by actually searching on the attributes you stored that comprise the FQDN instead. For example, if we created our own object type myInetOrgPerson, simply added the dc component as an optional component, then filled it in when we entered new entries which would be of both inetOrgPerson and myInetOrgPerson types, then we could do a search as follows:

(&(cn=James Lehmer)(dc=dullroar)(dc=com))

To summarize in one sentence: Do not count on the presence of an attribute in an object just because the FQDN seems to imply that attribute's presence!

Everything You Know Is Wrong

Everything you know about relational, hierarchical and network database management systems is wrong. Wipe it from your head while dealing with LDAP.

A LDAP directory is a database, yes, but it doesn't work like anything you've ever seen before. Navigation, per se, is almost completely missing, other than specifying the starting point in the name space for searches. A directory is relatively slow to update, but almost mind-numbingly fast to search and retrieve from ("search" is the key word in LDAP). Testing in 2001 using Netscape's Directory Server showed random search and retrieve speeds of 8,000+ objects per second from a very middle-range single 800MHz/512MB server hosting a decent sized (600MB) directory over 100Mb switched Ethernet network to multiple multi-threaded clients.

Think Venn Diagrams

Don't think navigation or underlying organization. Think sets and set theory. Think Venn diagrams.

Once items have been added to a directory, barring update or deletion (which, remember, in the directory model is presumed to be much less common than search/retrieval), the primary mode of operation against the directory will be via searches and subsequent retrievals. For these searches, you are basically looking for some set of objects that contain some set of attributes that have (or do not have) the values you are looking for. An example would be helpful. You could have a search syntax as simple as the following.

(description=*)

If run from the base DN (the "root" of the directory name space) this could return a large number of objects of many different types, since lots of object syntaxes contain the description attribute, across object types covering organizations, people and devices. Of course, you would only see those objects that actually had this attribute filled in with a value.

NOTE: The LDAP search syntax defined in RFC 2254 is cryptic, with a sort of reverse reverse Polish notation (RRPN). I think it would be better served by a new language (as with everything, the answer is a new language!) that basically used the English syntax of set notation, such as "union", "intersection", "in"/"not in", etc., rather than the highly symbolic one-off syntax in use by LDAP directory servers now. But I digress.

Some would say searching in a directory is very similar to SELECT in a relational database management system (RDBMS). Those persons would be wrong because in an RDBMS there is an implicit navigation—you (the programmer or user) SELECT against a table or set of tables with a join. You have "navigated" to the data container you want by naming table(s) in the operation, and you have defined what data type you want the content to be by selecting only certain columns from those tables.

In LDAP it's all just in one big directory, and you search starting from a specific starting place in the name space (a starting dn, such as the base DN, or root), choosing to search against the current level only in the name space, the current level and next "down", or the current level and all child levels "downward" in the name space. There are no "tables" or other organizational units. There are simply the name space used to set a starting point for a search and whatever attributes the objects themselves contain.

If you ran the following from the root of the directory name space and said to search the entire directory from there downward, you would get all objects of all types in the entire directory that had anything whatsoever in the description attribute.

(description=*)

This is completely different from the "rectangular" view you'd see from something like the following SQL.

SELECT description FROM my_table

Here you would be presented with presumably uniform description data attached to some specific coherent application "object" (whatever was being described in my_table).

LDAP Schemas Are Easy

LDAP schemas are easy. Once you get the hang of them. In defining LDAP schema elements, you need to understand the following points.

ASN.1 Notation

The schema definition syntax uses ASN.1 notation, and as such, you need to have a unique identifier ("object identifier" or "OID") for everything you define. There is a private enterprise number (PEN) branch you can use to which you can append your organization's enterprise number to define a unique "name space" for your schema additions. You can get an enterprise number surprisingly easily from IANA—if your company doesn't have one, it is good to get if you think you are going to do any SNMP or LDAP development in the future, since both use ASN.1 syntax.

It is then up to you to manage all number assignments "under" your enterprise number. For example, given an enterprise number of 314159, you could divide attributes into category '1', object types into '2', and reserve '3' and above for the future. Then under your first two categories, you would hand out number assignments as you added new attributes or object types to the schema.

The prefix for all private enterprise numbers is:

iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)

So, given our example of an IANA assigned enterprise number of 314159, anything we created in the schema needing an object id would have a prefix of:

1.3.6.1.4.1.314159

Using the prefixing scheme we discussed above, a new attribute could be defined with an object identifier as follows:

1.3.6.1.4.1.314159.1.1

...and an object type called dossierPerson that included that attribute could be defined with an object identifier as follows:

1.3.6.1.4.1.314159.2.1

It is totally up to the organization defining the schema items to manage their own object numbering scheme! To avoid clashing within your own organization, figure some allocation schema and stick with it.

Adding New Attributes

In adding new object types, first you must define new attributes (if you need them). In defining attributes you define an attribute name (and aliases), an identifier (in ASN.1 syntax), a datatype (again, in ASN.1 syntax), whether the attribute is single or repeating, etc. Some examples follow:

attributetype ( 1.3.6.1.4.1.314159.1.1
    NAME 'birthday'
    DESC 'Birth date of person, expressed as a timestamp'
    EQUALITY generalizedTimeMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
    SINGLE-VALUE )
attributetype ( 1.3.6.1.4.1.314159.1.4
    NAME 'spouse'
    DESC 'Spouse of the person'
    EQUALITY caseIgnoreMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} )

Observe that the first attribute, birthday, is a single-value attribute—if a value exists for a given object with this attribute, there can be at most one (which makes sense, given the attribute). On the other hand, the spouse attribute will allow multiple entries (since in some countries polygamy is still allowed, and we want our directory application to be internationalized).

NOTE: It would not be a good idea to use this mechanism for holding ex-spouses, because attribute value order in an object is not guaranteed upon retrieval (so there would be no way to keep the spouse values in order from ex-wife v1.0 through ex-wife v2.0 to current production wife v3.0, for example). For that, it would be better to create new objects for each past or present spouse (containing perhaps marriage start and stop dates as attributes so you can order them), and then have an attribute in your object type that can contain one or more FQDN references to those entries.

Adding New Objects

In adding new object types, after defining any new attributes you may require, you then define the new object types themselves. Object types are basically a collection of attributes that an object is required to contain and attributes that an object may contain. Object types have a type of "inheritance", but it is not an inheritance of behavior or topography (layout in the directory). It is instead simply a union of all the attributes in all the object types that a directory element comprises.

For example, the object type top has only one attribute, a required one, objectClass. All other object types "descend" from top in that all object instances must have at least one objectClass attribute value. In fact, every class instance by definition will have multiple objectClass attribute values, since top only contains objectClass, so an object instance that was just a top object wouldn't be very interesting.

First, let's look at top. Observe the ABSTRACT keyword, denoting an object is never meant to be created and stored as an object of just type top:

objectclass ( 2.5.6.0 NAME 'top' ABSTRACT
    MUST objectClass )

Now, let's look at a "descendant" of top, which is person:

objectclass ( 2.5.6.6 NAME 'person' SUP top STRUCTURAL
    MUST ( sn $ cn )
    MAY ( userPassword $ telephoneNumber $ seeAlso $
        description ) )

If we had an object instance of type person, which is descended from top, we would have the following three required attributes that must exist for our object to even be stored in the directory.

  1. objectClass—from top.
  2. sn—from person, alias surname.
  3. cn—from person, alias commonName.

In addition, we know there would be at least two values for objectClass, containing the values top and person. Then we would also have the ability of optionally storing the following information in our object (defined in the person object type as optional attributes).

  • userPassword
  • telephoneNumber
  • seeAlso
  • description

So when thinking of an object instance, I try not to think of something as being "an object of type person", but instead, as an entry containing data for types top and person. Obviously, it is easy enough to talk of an entry of type person, but that often then obscures which object type a given attribute in an object is defined within. For example, we could say an object of type inetOrgPerson has attribute values for the objectClass attribute, but it would be more accurate to talk about the objectClass attribute coming from the top object type definition of the given object instance.

Why Add New Objects?

You typically define new objects to contain some attributes, pre-existing or that you are also newly defining, that aren't contained in any other object class in the schema. For example, countryName (c) and co (two types of country attributes—the former holds the country display name, the latter the two character country code), are defined as part of the basic schema deployed by default with OpenLDAP. However, they are not defined as being a part of any object type in the same basic schema. So, if you want to store the country someone lives in, you'd have to create a new object class that had c or co or both as (probably) optional attributes. Another reason to add a new object type is to allow values that appear as part of the FQDN of an object to be searched against.

The tasks for schema definition you must do in any LDAP project should include the following:

  • Look at the schemas already available to you, especially those installed by default. On Linux with OpenLDAP, that includes core schemas and schemas to support CORBA, Java, Kerberos, basic tracking of people, and others. Active Directory has similar schemas plus more to support Windows, Exchange and so on.
  • Inventory which attributes you think you are interested in tracking. Most may already exist in the base schema set.
  • Note the object assignments for each—many attributes are used in multiple object types—and try and come up with a coherent minimum set of object types that contain the attributes you need. This set should make some sort of sense, not ending up with an amalgamation of "person" and "device" object types.
  • Catalog which attributes you may need that are not in an object type already. c and co are two good examples of "orphan" attributes with the default OpenLDAP install.
  • Describe which attributes are missing. Give them names, aliases if you wish, and decide which data type (and possibly maximum length) they will hold and the syntax in ASN.1 for it.

Following is an example of a new object type for holding information about people. It is not descended from person or any of the other person-based object types. Instead, it is meant to be used in conjunction with those other types. It is meant to hold attributes not assigned to any other person-based object types. The attributes used are both pre-defined in the base schema (c, co, generationQualifier, houseIdentifier) and custom-defined for this object type (birthday, endDate, child, spouse, startDate, weddingAnniversary).

# Seemingly useful information, especially if you want
# to use the directory as either a contacts or HR
# repository (try to do either without birthday or
# spouse, for example).
objectclass ( 1.3.6.1.4.1.314159.2.1
    NAME 'dossierPerson'
    DESC 'Helpful supplementary contact information'
    SUP top AUXILIARY
    MAY ( c $ co $ generationQualifier $
        houseIdentifier $ birthday $
        endDate $ child $ spouse $
        startDate $ weddingAnniversary ) )

Object Types Are Like Interfaces

Objects in the directory can morph in real-time. When you update objects in the directory you can add new object types to an existing object instance, and that instance can then contain all the required and optional attributes defined in all the object types that the entry contains in the objectClass attribute, including the newly added object type. In this sense, objectClass is simply another object attribute (in fact, part of the top object, as we have seen), and it is a repeating attribute that all objects have at least two values of (one of top and one of some other object type). The set of all the values in the objectClass attribute in a directory entry (object instance) comprises all the attributes the entry (object) can possibly contain. Many if not most of the optional attributes may not contain any value at any point in time, depending on the application.

It is better, however, especially given the generic tools that are out there, to define an object instance in advance as being of all the types you think it may ultimately contain. This allows browsers to see those types defined even if no attributes have been filled in for them yet. It forces the filling in of certain mandatory attributes (if any) for each type when an object instance is created and stored, increasing search options and speed, since mandatory attributes are often indexed.

Be Prepared to Code

You will probably have to write code (unless you're working with an email client).

It is amazingly easy to write generic LDAP browsers (done that, been there). That's why you see so many out there, including one with almost every LDAP toolkit and book. And yet, strangely enough, the one production application almost universally LDAP-enabled, which is email, strongly depends on the client implementation to pick up attributes correctly.

For example, Mozilla publishes an LDAP schema for their Thunderbird client, and they conform to others, because if you point their LDAP address book client at an inetOrgPerson, they will pick up many but not all of the attributes correctly. In fact, some seemingly "standard" attributes such as telephoneNumber may or may not be picked up correctly by a given email client, because they have coded against a specific object class or classes and are looking for specific attributes, and the "obvious" choice wasn't the one chosen.

That said, outside of email there are almost always only two ways to use LDAP:

  1. Through an existing generic browser/editor—For example, the ADSI and LDAP API based tools that come with Microsoft's Active Directory.
  2. Via a custom application you write—With the plethora of LDAP APIs out there including all the Java JNDI and .NET DirectoryServices APIs that abstract a lot of it for that language, it isn't hard to write LDAP applications. I even use the SQL Server ADSI interface a lot, which allows you to issue SQL SELECT statements against Active Directory (with some limitations—it doesn't support multi-value attributes, for example). In fact, if you are adding custom attributes and object types, you are almost assuredly going to be using a custom application if you want to deploy to end users, as opposed to technical personnel only.

A User is Just Another Entry

A "user" is just another directory entry. Some object types can contain (clear text or hashed) password and user id attributes. You can use these to control accessing the directory, both signing in and then controlling access after that. In addition, some object types representing persons, for example, can be made members of other object types representing groups. These can all be used to control access to directory entries in rich ways using access control lists (which are nothing more than a list of FQDNs and the permissions attached to them).

The thing to remember is a "user" is just another directory entry. In fact, in LDAP directories, everything is just another directory entry, including the metadata (just like system tables in an RDMBS are tables that hold information about other database entities, including tables, including themselves).

Conclusion

I hope that was worth the read! I attempted to alter your perception on some specific points about LDAP-based directories. To recap:

  1. Everyone approaches LDAP as a hierarchy. This is wrong.
  2. Everything you know about relational, hierarchical and network database management systems is wrong. Wipe it from your head while dealing with LDAP.
  3. Don't think navigation or underlying organization. Think sets and set theory. Think Venn diagrams.
  4. LDAP schemas are easy. Once you get the hang of them.
  5. Object metadata in the directory can morph in real-time.
  6. You will probably have to write code (unless you're working with an email client).
  7. A "user" is just another directory entry.

Each of these issues cost me some time and some pain before I fully "grokked" it and what it meant when working with LDAP. I hope by reading this, I save you some pain, if not now, then in the future when you land on that LDAP project, or start writing that cool new open source LDAP tool.

LEAD, LAG or Get OVER the Way

Once I finally learned the OVER clause, something in SQL Server since 2012, it quickly became one of the items in my SQL toolkit.

Running Totals

This is part of this same work, where I started using a technique to turn data from our transactional systems into more of a "time series." But of course, one of the first things people want to have once you get something like a time series are running totals, for things like "velocity" charting (my boss is big on velocity—bad physics jokes elided).

Turns out running totals in SQL are easy now, and the following is lifted straight from StackOverflow. Let's say you have a date, LastTouched, and a numeric column, in this case, Total, and you want to have a running total of Total as LastTouched increases:

SELECT
    LastTouched AS [Last Touched],
    Total,
    -- See Gareth's answer - https://stackoverflow.com/questions/2120544/how-to-get-cumulative-sum#2120639
    SUM(Total) OVER(ORDER BY LastTouched ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Running Total]
FROM LemonadesSoldByDate
Running totals
last touched total running total
2018-02-01 5 5
2018-02-02 3 8
2018-02-06 4 12

Diff'ing Row Versions

In the same week, for an unrelated project, I was asked to show differences between rows in a history table. For some applications we have mirror history tables that get the entire row's data inserted on each UPDATE via triggers (I know, how 1990s). But one of the primary uses for this data is to see precisely what changed on each update. It turns out that LAG and LEAD (both also introduced in SQL Server 2012) can be used for precisely this purpose.

To do side-by-side "diffs," with pairs of columns showing current and previous values, you can simply do something like this:

CREATE VIEW LemonadeStandHistoryDiffs
AS
SELECT TOP 10000000 -- To get ORDER BY in a view, because 100 PERCENT never works for me.
    Id,
    ModifiedOnDate AS [Modified On Date],
    Customer,
    SaleAmount AS [Sales Amount],
    LAG(SaleAmount, 1, 0) OVER (ORDER BY Id, ModifiedOnDate) AS [Previous Sale Amount],
    GlassesSold AS [Glasses Sold],
    LAG(GlassesSold, 1, 0) OVER (ORDER BY Id, ModifiedOnDate) AS [Previous Glasses Sold]
FROM LemonadeStandHistory
ORDER BY Id, ModifiedOnDate

Which yields results like:

Side-by-side diffs
id modified on date customer sale amount previous sale amount glasses sold previous glasses sold
1 2018-02-01 Fred 5.00 0.00 5 0
1 2018-02-02 Fred 3.00 5.00 3 5
1 2018-02-06 Fred 4.00 3.00 4 3


Pretty cool. But it makes a really wide result set, with 2x the number of columns as the original, and it is still hard to "eyeball" and see what specifically changed from one row to the next. So instead, we want a "version history." One way is to show a row per changed value, grouped by the modified timestamp:

CREATE VIEW LemonadeStandVersionHistory
AS
SELECT TOP 10000000 * FROM
(
    SELECT
        Id,
        ModifiedOnDate AS [Modified On Date],
        Customer,
        'SaleAmount' AS Field,
        CAST(SaleAmount AS VARCHAR(250)) AS [Current Value],
        CAST(LAG(SaleAmount, 1, 0) OVER (ORDER BY Id, ModifiedOnDate) AS VARCHAR(250)) AS [Previous Value]
    FROM LemonadeStandHistory
    UNION
    SELECT
        Id,
        ModifiedOnDate,
        Customer,
        'GlassesSold' AS Field,
        CAST(GlassesSold AS VARCHAR(250)) AS CurrentValue,
        CAST(LAG(GlassesSold, 1, 0) OVER (ORDER BY Id, ModifiedOnDate) AS VARCHAR(250)) AS PreviousValue
    FROM LemonadeStandHistory
    UNION
    -- and so on...
) A
WHERE CurrentValue <> PreviousValue
ORDER BY Id, ModifiedOnDate

Note casting the numeric (and any DATETIME) columns to VARCHAR. This is to make all the "diff" rows play nicely in the UNIONs regardless of each column's data type.

The above view then produces results similar to this:

Version history
id modified on date customer field current value previous value
1 2018-02-01 Fred SaleAmount 5.00 0
1 2018-02-01 Fred GlassesSold 5 0
1 2018-02-02 Fred SaleAmount 3.00 5.00
1 2018-02-02 Fred GlassesSold 3 5
1 2018-02-06 Fred SaleAmount 4.00 3.00
1 2018-02-06 Fred GlassesSold 4 3


Creating all those UNION statements may be a bit onerous, and I am still thinking of a better way to do the same in SQL without resorting to a PIVOT, although ultimately that may be the way to go.

Combining Running Totals With LAG

Now back to the first example about running totals:

Running totals
last touched total running total
2018-02-01 5 5
2018-02-02 3 8
2018-02-06 4 12


Note there are days where there are gaps, i.e., nothing happened on that day, so there isn't a row for that date in the running total results. For your purposes, that may be OK. But what if you want to have a running total for each day, even if it doesn't change? Using the "exploded dates" table created in the first post, you can do something like the following, combining using OVER for running totals plus LAG. For this example I assume there will never be a gap of more than 30 days:

WITH RunningSalesTotals
AS
(
    SELECT
        LastTouched AS [Last Touched],
        Total,
        SUM(Total) OVER(ORDER BY LastTouched ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Running Total]
    FROM LemonadesSoldByDate
)
SELECT
    ED.TheDate,
    COALESCE(
        RST.RunningTotal,
        LAG(RST.RunningTotal, 1) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 2) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 3) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 4) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 5) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 6) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 7) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 8) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 9) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 10) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 11) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 12) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 13) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 14) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 15) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 16) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 17) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 18) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 19) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 20) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 21) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 22) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 23) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 24) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 25) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 26) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 26) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 28) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 29) OVER(ORDER BY ED.TheDate),
        LAG(RST.RunningTotal, 30) OVER(ORDER BY ED.TheDate),
        0) AS RunningTotalClosed -- 0 if there are NULLs at the start of the series
FROM ExplodedDates ED
LEFT OUTER JOIN RunningSalesTotals RST ON
    ED.TheDate = RST.LastTouched
WHERE ED.TheDate >= '2018-02-01'
    AND ED.TheDate <= '2018-02-07'
Running totals with no date gaps
last touched running total
2018-02-01 5
2018-02-02 8
2018-02-03 8
2018-02-04 8
2018-02-05 8
2018-02-06 12
2018-02-07 12

Thanks to Jason Koopmans for his helpful comments on this topic.

LIKE Considered Harmful

LIKE, am I RIGHT?

We have a vendor database at work to which we've built some custom integrations. It is a document management system. One of the columns in the main table contains object names—folders, files, users, whatever—they store all types of objects in one big table.

If the folder is a "customer-level" folder then it contains the customer's name followed by the customer id in parentheses (I didn't design any of this!) There is no direct access to the customer id by itself, so I wrote some SQL that looks to see if a customer folder already exists using the customer id. It looked like the SQL below:

SELECT
    TOP 1 CASE WHEN Id IS NULL THEN 0 ELSE Id END AS Id,
    Name
FROM Objects WITH(NoLock)
WHERE
    Name LIKE '%(' + CAST(@custno AS NVARCHAR(10)) + ')%'

This has been getting slower and slower as the database grows in size, and was taking 10-15 seconds per run. Not good.

Changing it to use the PATINDEX function instead of LIKE didn't help at all, nor did I expect it to.

Then I changed the wildcard search to instead do an "ends with" search:

SELECT
    TOP 1 CASE WHEN Id IS NULL THEN 0 ELSE Id END AS Id,
    Name
FROM Objects WITH(NoLock)
WHERE
    RIGHT(Name, LEN('(' + CAST(@custno AS NVARCHAR(10)) + ')')) = '(' + CAST(@custno AS NVARCHAR(10)) + ')'

This ran in under a second. I have now rolled it into production.

In retrospect, this result doesn't surprise me. What did surprise me was the order of magnitude difference.

Parsing HTML With SQL

A friend once sent me a request on how to parse HTML with SQL. Challenge accepted!

Here is the original request:

I was wondering if you knew how to use SQL to parse a column and return multiple individual records where text in that column is started with <b>This is a test</b>. The column might have these tags multiple times.

Sample Column Text...

This is a test
<b>Test</b>
How is it going
<b>Get this Text Also</b>

It should return...

Test
Get this Text also

Here was my initial reply:

You're going to hate me, but you can do this with SQL's XML functionality. I have built a test case that works on your sample set.

NOTE: ALL XML FUNCTION NAMES ARE CASE-SENSITIVE (lowercase), EVEN THOUGH SQL IN GENERAL IS NOT.

Consider the following table, which represents the existing table, which I presumed had the HTML stored as a VARCHAR:

CREATE TABLE dbo.ParseExample
(
    HTMLText VARCHAR(4000) NULL
)

Now we insert the test case into it:

INSERT INTO ParseExample VALUES('This is a test
<B\b>Test</b>
How is it going
<b>Get this Text Also</b>')

SELECT * will bring back what you'd expect.

So, we can convert the HTML into XML (even though it's not valid XML) on the fly using a common table expression:

WITH Converted
AS
(SELECT CAST(HTMLText AS XML) AS X FROM ParseExample)
SELECT * FROM Converted

Now you can do fun things with XPath and XML functions. For example, to just get the <b> elements and their values (the XPath //b will look for bold elements wherever they are in the XML DOM), you can use the query function:

WITH Converted
AS
(SELECT CAST(HTMLText AS XML) AS X FROM ParseExample)
SELECT X.query('//b') FROM Converted

But this isn't useful, because the result still has the <b> tags and also returned everything in one row and column, which isn't what you'd want. So then you use the nodes function to get individual rows for each node that matches the XPath query, and then the value function to extract just the text (and not the tags) from that:

WITH Converted
AS
(SELECT CAST(HTMLText AS XML) AS X FROM ParseExample)
SELECT nref.value('.', 'nvarchar(max)') BoldText
FROM Converted
CROSS APPLY X.nodes('//b') AS R(nref)

The above returns exactly what we are looking for.

Of course, there was one more wrinkle—his actual live data had &nbsp; entities in it, so the XML parser was choking on that with:

XML parsing: line 1, character 9, well formed check: undeclared entity

In follow-up discussions he decided to just do this in the common table expression:

(SELECT CAST(REPLACE(HTMLText, '&nbsp;', ' ') AS XML) AS X FROM ParseExample)

I personally would prefer something more like:

(SELECT CAST(REPLACE(HTMLText, '&nbsp;', '&amp;nbsp;') AS XML) AS X FROM ParseExample)

Anyway, I thought I would document this just for fun.

Stacked Bar Charts in ASP.NET with No Code-Behind

This is posted as an intellectual exercise someone else may find interesting or useful.

NOTE: This is NOT a suggestion of how to implement something in production (although we do have an app like this there).

Introduction

I am currently working on a project at work that involves among other things gathering metrics for our various scanners across all of our locations. We have a heterogeneous scanner environment (which raises its own issues) with 16 models of scanners from Canon, Fujitsu, Lexmark and Xerox spread across 24 different sites. Some sites only have one scanner, others have two or three. I wanted to show total scanner volume by site, broken down by scanner model at each site. This is a perfect application for a stacked bar chart.

The Problem

I have been using the ASP.NET charting control for other charts in this project, and purely by chance (not design) I had done everything I needed with each chart in pure markup and SQL with no code-behind for the Web page until I needed this stacked bar chart. Then I had a hard time finding any information on the Internet about how to accomplish a stacked bar chart in pure markup (because I wanted to see if I could).

The issue is that for a stacked bar chart to work, there need to be multiple series (in my case, scanner models), and each series has to have the same number of data points, i.e., in my case each series has to have 24 locations. This is because the stacked bar chart is "dumb" and simply stacks the first column in each series on the first bar, the second column in each series on the second bar, and so on. But the locations each only have one to three scanners, so at most each location only has approximately 20% of the scanner models available. Needless to say, a query something like:

SELECT
    Branch,
    ScannerModel,
    COUNT (*) AS Scans
FROM ScanMetrics
GROUP BY Branch, ScannerModel
ORDER BY Branch, ScannerModel

...is going to produce output like this:

This is not what we need, since the output is "ragged" (each location has a different number of scanner models).

Pivot Tables to the Rescue

I thought about it some more and finally figured out what I needed was to have my data in a pivot table. Using the output from that, I could then do the stacked bar chart in pure ASP.NET markup. Here is a view I created to give me the pivot output I needed:

CREATE VIEW BranchScannerScansPivot
AS
WITH Branches AS
(
    SELECT DISTINCT
        Branch
    FROM ScanMetrics
),
Scanners AS
(
    SELECT DISTINCT
        Branch,
        ScannerModel
    FROM ScanMetrics
),
BranchScannerCombos AS
(
    SELECT DISTINCT
        B.Branch,
        S.ScannerModel
    FROM Branches B
    CROSS JOIN Scanners S
),
BranchScannerCounts AS
(
    SELECT
        BSC.Branch,
        BSC.ScannerModel,
        COUNT (SM.ScannerModel) AS Scans
    FROM ScanMetrics SM
    RIGHT OUTER JOIN BranchScannerCombos BSC ON
        SM.Branch= BSC.Branch
        AND SM.ScannerModel= BSC.ScannerModel
    GROUP BY
        BSC.Branch,
        BSC.ScannerModel
)
SELECT
    *
FROM BranchScannerCounts BSC
PIVOT(SUM(Scans) FOR ScannerModel IN
(
    [CANON2200],
    [CANON3080],
    [CANON3100],
    [CANON3300],
    [CANON3320],
    [CANON3570],
    [CANON4035],
    [CANON4080],
    [CANON5035],
    [CANON5051],
    [CANON6010],
    [CANON6050],
    [FUJITSU6010],
    [LEXMARK658],
    [LEXMARK796],
    [XEROX5745]
)) AS Scans

Selecting from this view produces a 24-row result set with exactly the output I need:

It is a "rectangular" grid of values for each combination of location and scanner model.

The Solution

With that data in hand, then producing the stacked bar chart in pure markup is simply an exercise in copying and pasting 16 series (one for each scanner model). Here is the entire Metrics.aspx file:

<%@ Page Title="Metrics" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
    CodeBehind="Metrics.aspx.cs" Inherits="ScanMetrics"%>
<%@ Register Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp"%>
<asp:Content runat="server" ID="FeaturedContent" ContentPlaceHolderID="FeaturedContent">
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1><%:Title%>.</h1>
                <h2>Scan statistics.</h2>
            </hgroup>
        </div>
    </section>
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
    <asp:Chart ID="Chart1" runat="server" DataSourceID="SqlDataSource1" Height="800" Width="800">
        <Titles>
            <asp:Title Text="Scans by Branch and Scanner Model"></asp:Title>
        </Titles>
        <ChartAreas>
            <asp:ChartArea Name="Branch">
                <Area3DStyle Enable3D="true"/>
                <AxisX Interval="1">
                    <MajorGrid Enabled="false"/>
                </AxisX>
            </asp:ChartArea>
        </ChartAreas>
        <Series>
            <asp:Series Name="CANON2200" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON2200">
            </asp:Series>
            <asp:Series Name="CANON3080" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON3080">
            </asp:Series>
            <asp:Series Name="CANON3100" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON3100">
            </asp:Series>
            <asp:Series Name="CANON3300" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON3300">
            </asp:Series>
            <asp:Series Name="CANON3320" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON3320">
            </asp:Series>
            <asp:Series Name="CANON3570" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON3570">
            </asp:Series>
            <asp:Series Name="CANON4035" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON4035">
            </asp:Series>
            <asp:Series Name="CANON4080" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON4080">
            </asp:Series>
            <asp:Series Name="CANON5035" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON5035">
            </asp:Series>
            <asp:Series Name="CANON5051" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON5051">
            </asp:Series>
            <asp:Series Name="CANON6010" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON6010">
            </asp:Series>
            <asp:Series Name="CANON6050" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="CANON6050">
            </asp:Series>
            <asp:Series Name="FUJITSU6010" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="FUJITSU6010">
            </asp:Series>
            <asp:Series Name="LEXMARK658" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="LEXMARK658">
            </asp:Series>
            <asp:Series Name="LEXMARK796" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="LEXMARK796">
            </asp:Series>
            <asp:Series Name="XEROX5745" ChartType="StackedBar" ChartArea="Branch"
                XValueMember="Branch" YValueMembers="XEROX5745">
            </asp:Series>
        </Series>
        <Legends>
            <asp:Legend Enabled="true" Alignment="Center"></asp:Legend>
        </Legends>
    </asp:Chart>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
        ConnectionString="<%$ConnectionStrings:ConnectionString1%>"
        ProviderName="<%$ConnectionStrings:ConnectionString1.ProviderName%>"
        SelectCommand="SELECT Branch, CANON2200, CANON3080, CANON3100, CANON3300, CANON3320, CANON3570, CANON4035, CANON4080, CANON5035, CANON5051, CANON6010, CANON6050, FUJITSU6010, LEXMARK658, LEXMARK796, XEROX5745 FROM BranchScannerScansPivot ORDER BY 1 DESC">
    </asp:SqlDataSource>
</asp:Content>

And here is the output:

Mission accomplished.

Conclusion

Now, I am not saying I think this should be a standard approach. For one, I find it "fragile" as a solution since it requires both the SQL pivot and the chart series markup to know in advance the number and names of the scanner models. Thus, adding a new model would require code changes to both the view and the Web page.

However, I did want to publish this because I have found when working with the Microsoft chart control that often there are fairly straightforward markup-only approaches, but most samples on the Web tend to be a mishmash of markup and code with no good discussion about why a given property is set in markup and another is set in the code-behind. Also, depending on your environment, it may be easier to make changes to markup and SQL views in production than to compiled code. It can certainly be easier to "tweak" markup.

And finally, I just thought it was an intellectual challenge, and hope you found it interesting as well.

Time Series in SQL

Recently at work I needed to turn different sets of "point-in-time" (PiT) data into time series using SQL Server.

Specifically, given rows in a SQL Server database that represent the current state of an entity, how can we show how long that entity has been or was "in process?" I am sure it is not original, but since I figured this out independently, I thought I would document it here.

Assumptions

The PiT data has to have at least three columns for this technique to work:

  1. Created on—a column indicating the date and time at which the entity was originally created.
  2. Modified on—a column indicating the date and time at which the entity was last altered.
  3. Status—some sort of code indicating whether the entity is still "open" (in-flight, in-process) or else "closed" (finished, expired, cancelled, etc.) This doesn’t have to be a simple yes/no or open/closed status, as we will see.

There are many business entities that have that sort of data—e.g., service tickets in a help desk system, opportunities in a CRM system, loan applications, etc.

Also, we will need a simple table with a series of dates in it. See the next section for that.

Create a Sequence of Dates

I can’t take credit for this—I ripped off the original logic from the accepted answer at this StackOverflow post. However, I just wanted a fixed range, and I chose from January 1, 1980, well before our business data begins, until December 31, 2100, long after I am dead (I will let this be part of someone’s Y2100 problem).

First I created a view:

CREATE VIEW [dbo].[ExplodeDates]
AS
WITH N0
AS
(
    SELECT 1 as n UNION ALL SELECT 1)
        ,N1 AS (SELECT 1 as n FROM N0 t1, N0 t2)
        ,N2 AS (SELECT 1 as n FROM N1 t1, N1 t2)
        ,N3 AS (SELECT 1 as n FROM N2 t1, N2 t2)
        ,N4 AS (SELECT 1 as n FROM N3 t1, N3 t2)
        ,N5 AS (SELECT 1 as n FROM N4 t1, N4 t2)
        ,N6 AS (SELECT 1 as n FROM N5 t1, N5 t2)
        ,nums AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS num FROM N6
)
SELECT DATEADD(day,num-1,'1980-01-01') AS thedate
FROM nums
WHERE num <= DATEDIFF(day,'1980-01-01','2100-12-31') + 1

Note that the above generates the given date range of over 44,000 rows fast—under a second (because there is no I/O involved). However, after some testing it seemed like the view would be too slow (not much the SQL optimizer can do with it), so then I created a materialized view and populated it as follows:

CREATE TABLE dbo.ExplodedDates
(
    TheDate DATETIME NOT NULL,
    CONSTRAINT PK_ComplianceChecklist PRIMARY KEY CLUSTERED
    (
        TheDate ASC
    )
)
GO

INSERT INTO ExplodedDates SELECT * FROM ExplodeDates

Now we have a simple, keyed table with all the dates from 1/1/1980 through 12/31/2100. Cool.

Convert PiT Rows to Time Series

For example purposes I’ll use opportunities from Microsoft CRM. However, the concept remains the same regardless of your entity, as long as it has the three columns I mentioned above, i.e., "created on," "modified on," and "status." Let’s create and populate the time series table for opportunities.

CREATE TABLE CurrentOpportunityStatus
(
    StartedOn DATETIME NOT NULL,
    LastTouched DATETIME NOT NULL,
    OpportunityId UNIQUEIDENTIFIER NOT NULL,
    CONSTRAINT PK_CurrentOpportunityStatus PRIMARY KEY CLUSTERED
    (
        StartedOn ASC,
        LastTouched ASC,
        OpportunityId ASC
    )
)
GO

INSERT INTO CurrentOpportunityStatus
SELECT
    FO.createdon AS StartedOn,
    CASE FO.statecode
        WHEN 0 THEN GETDATE()     -- Open
        WHEN 1 THEN FO.modifiedon -- Won
        WHEN 2 THEN FO.modifiedon -- Lost
        ELSE GETDATE()            -- Unknown state code
    END AS LastTouched,
    FO.opportunityid
FROM Your_MSCRM.dbo.FilteredOpportunity FO WITH(NOLOCK)

Note that we use the current date and time if the opportunity is still open, otherwise we used the modifiedon value to indicate when it was closed. For some other entities I have done this for, the CASE statement can get quite long, but at the end, the logic remains:

  1. For "open" status codes, the WHEN returns the current date and time.
  2. For "closed" status codes, the WHEN returns the last modified date and time.

That’s all there is to it.

How Many X Were Open on Any Given Date?

The whole reason I went down this path was then to be able to chart how many of each entity type was open on any given date. That is where the ExplodedDates table comes in to play. For each entity, simply create a view similar to the following:

CREATE VIEW TimeSeriesOfOpportunities
AS
SELECT TOP 10000000 -- TOP used to get ORDER BY in a view
    TheDate,
    COUNT(*) AS OpenOpps
FROM ExplodedDates ED
INNER JOIN CurrentOpportunityStatus O ON
    ED.TheDate >= O.StartedOn
    AND ED.TheDate <= O.LastTouched
GROUP BY TheDate
ORDER BY TheDate

Basically, for each date in the date range, if is is on or after the opportunity’s "created on" date and it is before or on the "last touched" date (either "modified on" or today’s date), then it is counted as "open" on that day. This yields a series like:

TheDate    OpenOpps
1/1/2017    1455
1/2/2017    1455
1/3/2017    1456
1/4/2017    1453
1/5/2017    1463
1/6/2017    1465
1/7/2017    1465
...lots more rows...
1/27/2018    899
1/28/2018    899
1/29/2018    899
1/30/2018    828
1/31/2018    816
2/1/2018     810
2/2/2018     801
2/3/2018     781

Conclusion

Creating the above takes very little time for each business entity. Then, you can start showing graphs that show counts of the various types of entities in your business that are active by date. It is very handy for dashboards and the like.

Trailing Whitespace as "Security"

This is one of those “back in the day” stories, so if you don’t want to listen to this grandpa rock in his chair and spin a yarn, then move along...

My very first job "in computers" was as a computer operator from 1980 to 1985. It was a good job in many ways, especially since it allowed me to go to college during the day and work in the evenings, and I never had to step foot in the school computer lab because I was able to do all my programming for class on my work account.

As time went on a fellow operator and I started creating a bunch of scripts to help us do our jobs, using mostly ISPF screens and first CLIST (the horror! the horror!) and then Rexx as the scripting language to drive the screens.

For reasons that now escape me, we didn't want other operators running our scripts. Yet they were all available, since we were all in the same security group and we didn't have the ability to secure files to our individual ids. What to do? Then I got a "bright" idea.

On MVS at that time script files could be in one of two record formats—80 character fixed length records (to mimic punched cards) and 255 character variable length records. The vast majority of people used 80 character records in their scripts. This was to our advantage. Remember, at this time we were working completely with 3270 "green screen" terminals, most of which were 80 character displays, although there were a few that had 132 character displays. While you could scroll to the right there were no visual indicators that you would need to do so on a long line—you just had to know that there was more data to the right.

So using the psychological expectation by most people that script files are 80 characters wide, the solution was simple. At the top of the file I simply put a comment block, like this:

/************************************************************************/
/* This script written by Jim Lehmer.                                   */
/* It does blah, blah, blah.                                            */
/************************************************************************/

Then, padding those comment lines with spaces I put in an IF statement similar to the following way over to the right of the comment block:

IF USERID() != "jlehmer" THEN
EXIT

Everyone thought we had some sort of special security on the files, because they'd try and run the scripts and the code would immediately exit. No one figured it out, for years. They never thought to scroll to the right, even if they noticed that the record type on the script files was 255 character variable length records.

So now you've heard everything—security through trailing whitespace! The ultimate "security through obscurity."

Training Tesseract

My notes on training Tesseract for an OCR project at work.

Introduction

Tesseract is an open source OCR tool originally developed by HP and now used by Google and others. The source repository is here:

https://github.com/tesseract-ocr

It is primarily a command-line tool. However, there is a library that is available for programmatic access, which has then been ported to Windows. In addition, there is a .NET wrapper API for it available on GitHub and also in NuGet, so installing it in a Visual Studio project is easy:

https://github.com/charlesw/tesseract

Before Tesseract can be used, it must be "trained." This involves a series of steps that teach it both the font(s) that will be used as well as the language. There are defaults for many languages and standard fonts (Arial, etc.) on the project site itself, including the default one for English:

https://github.com/tesseract-ocr/tesseract/releases

However, if you want to use a different, "non-standard" font, such as OCR-A, you must train Tesseract for that. This document explains how I trained Tesseract for OCR-A for a work project.

Resources

You will want to become familiar with all of the following. Really. Even though in the end the steps I give should "just work," understanding what is going on is helpful.

Training Steps

The following describes what to do to create a new traineddata file, which then goes in the tessdata folder that will be under your project's executable location. In other words, if your project executes out of C:\Program Files\Foo, then the tessdata folder should be at C:\Program Files\Foo\tessdata.

You will have to pick a font (in our example OCR-A) and a three-character language code. The language doesn't have to be real. In our example we use "zzz" as the language code. When you use Tesseract, you tell it which language to load.

All of the following assumes you have access to a Linux box with the following installed:
  • Tesseract
  • Python 2
  • ImageMagick
  • Pango and Cairo (installed with Python)

Step 1—Convert "truth file" to image

This uses the text2img.py script in tess_school. Per the readme:

-text2img.py: Takes a ground-truth text file and automatically generates image files from the text, for use in training tesseract. Everything is hard coded at the moment, no command-line options yet. Eventually I'd like to have this generate the boxfile too.

First I changed the hardcoded language in the script from ka/kat to en/eng, i.e.:

LANG = "en"
TESS_LANG = "eng"

Note: Even though I ended up using "zzz" as the language, it was easier in the interim to work with "eng" because a lot of samples on the Internet assume it.

I then ran it in the shell as follows:

python text2img.py -f text.txt OCRA

Let's pull that apart a bit. Besides the script itself, there are two things of interest:

  • text.txt is the input file. It contains the characters we are going to use for training. In this case I made the file a simple one that had all upper and lowercase letters, numbers, and all special characters accessible on a keyboard. Here are the contents:

    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890`[email protected]#$%^&*()-_=+[{]}\|;:'",<.>/?
  • OCRA is the name of the font to output the text as in the resulting image. It has to be the official name of a font installed on the system you are running the script on. On Debian/Ubuntu/Mint flavors, fonts are installed under /usr/share/fonts, and then you have to know what type of font it is, such as OpenType (.otf) or TrueType (.ttf). In our case OCR-A is a TrueType font, and the files are located at /usr/share/fonts/truetype/ocr-a. In that directory are the following files, and by using OCRA we are telling it to use the main OCR-A font:

    • OCRA.ttf
    • OCRABold.ttf
    • OCRACondensed.ttf
    • OCRAItalic.ttf

This brings up another point. When training for fonts, you have to train for normal vs. bold vs. italic vs. bold and italic together all separately. In our case we just want the normal font, so that keeps things simple.

The output of the text2img.py execution will be a file in the same directory named eng.OCRA.exp0.png. That is the language ("eng"), the font we chose ("OCRA"), the "exp0" is used to allow combining multiple training files together (for example, you could have "exp0" be for the normal font face, "exp1" be for bold, etc.).

Step 2—Convert the PNG to a TIFF file

While Tesseract can use PNG files for training, apparently it works better with TIFFs, per the tess_school readme:

-png2tif.sh: Uses ImageMagick to convert the PNG output from text2img.py to TIFF files. Tesseract can read PNG files, but sometimes seems to prefer TIFF.

No changes were required. Just run the script:

./png2tif.sh eng.OCRA.exp0.png

You will then have a file in the same directory called eng.OCRA.exp0.tif.

Step 3—Make the "box" file(s)

This step is where the rubber meets the road. It involves letting Tesseract loose on the image we've produced and see if it can figure out where the characters are and what they are. A "box" file is simply a text file with a simple format:

  • The character Tesseract guessed in a specific location.
  • Four fields that are the coordinates of the character.
  • A page number (zero-relative), which for us is always zero (training multi-page docs is harder).

The make_boxes.sh script generates the box file(s), looking for any .tif files in the directory. The only thing that needs to be changed is the language code, which again I changed to "eng":

LANG=eng

Then you just run the script:

./make_boxes.sh

You will then have a eng.OCRA.exp0.box file in the same directory.

Step 4—Merge adjacent boxes

Tesseract can sometimes "see" multiple characters where there is in reality only one. This script helps fix that, per the readme:

-merge_boxes.py: Merges nearby boxes in a boxfile resulting from tesseract oversegmenting characters. This is a common error that Tesseract makes and this script will quickly fix most instances of this problem.

I had to make no changes to the script. You run it with:

python merge_boxes.py -d eng.OCRA.exp0.box

The -d parameter indicates it's a "dry run" and will just indicate if there were any boxes that needed merging. In my case there weren't. See the script for other parameters in case the dry run indicates there might be boxes needing merging.

Step 5—Align the box file to the truth file

In a typical Tesseract training, you would then go through the box file with a box file editor such as Moshpytt, checking and correcting each and every character. On large box files that is a complete PITA, and from my testing large box files (lots of input characters) didn't seem to significantly increase the accuracy. YMMV. Instead, tess_school has a script that automatically takes in the truth file used to generate the image, and makes sure every corresponding line in the box file is set to the correct character from the truth file. This is handy and very, very time-saving. From the readme:

-align_boxfile.py: Changes a boxfile to match a ground-truth text file. Will abort and complain if the number of boxes doesn't match the number of characters in the file, so run this only after your boxes are in the right places.

I didn't have to change anything in the script. To run it:

python align_boxfile.py text.txt eng.OCRA.exp0.box

It is taking in the truth file we used above, text.txt, and updating in-place the box file we generated, eng.OCRA.exp0.box.

There are other tools in tess_school, but I found its auto_train.sh script to not generate as good of a traineddata file as I got via other means, and I had no use for the other scripts at this time, so we will leave tess_school behind now.

Step 6—Training Tesseract

At this point I wrote a script called trainingtess to finish all the remaining steps in training Tesseract. I won't go through it in detail (the Resources section above has all the gory details). The script is as follows:

#!/bin/bash
tesseract zzz.ocra.exp0.tif zzz.ocra.exp0 nobatch box.train
unicharset_extractor zzz.ocra.exp0.box
echo "ocra 0 0 1 0 0" >font_properties
shapeclustering -F font_properties -U unicharset zzz.ocra.exp0.tr
mftraining -F font_properties -U unicharset -O zzz.unicharset zzz.ocra.exp0.tr
cntraining zzz.ocra.exp0.tr
cp normproto zzz.normproto
cp inttemp zzz.inttemp
cp pffmtable zzz.pffmtable
cp shapetable zzz.shapetable
combine_tessdata zzz.
cp zzz.traineddata /home/youruserid/tessdata/.
sudo cp zzz.traineddata /usr/share/tesseract-ocr/tessdata/.
tesseract zzz.ocra.exp0.tif output -l zzz

You have to make the following changes:

  • Rename the "eng" files that came out of the tess_school work to "zzz", or to change the trainingtess script to use "eng" itself. Your choice. And for your project you may want some other "language" like "foo" or "bar" instead anyway. I also changed the font name in the files from "OCRA" to "ocra" to match Tesseract "standards."
  • Change the font from "ocra" to the appropriate font name for your uses.
  • Change the line that creates the font_properties file appropriately. Its format is:
    • Font name—as used in the file names, here ocra.
    • Italic1 if training for italic font. 0 in our example.
    • Bold1 if training for bold font. 0 in our example.
    • Fixed1 if training on a fixed (monospaced) font. 1 in our example, since OCR-A is a fixed font.
    • Serif1 if the font has serifs. 0 in our example.
    • Fraktur1 if the font is a "Fraktur" font (aka "blackletter" or "Olde English/Gothic" font). 0 in our example.
  • You will also want to change where it copies the output traineddata file.

For input, it will need the .tif and .box files generated by the tess_school scripts to be in the same directory as trainingtess. You then simply run it:

    ./trainingtess

You will get a lot of output files from it, including:

font_properties
inttemp
normproto
output.txt
pffmtable
shapetable
unicharset
zzz.inttemp
zzz.normproto
zzz.ocra.exp0.box
zzz.ocra.exp0.tif
zzz.ocra.exp0.tr
zzz.ocra.exp0.txt
zzz.pffmtable
zzz.shapetable
zzz.traineddata
zzz.unicharset

Out of all those, and out of all this work, the one we're interested in is the zzz.traineddata file. That is what will go in your tessdata directory of your project. The other interesting file is the output.txt file, because that shows the output from the last step in the script, which ran Tesseract with the new traineddata file on the .tif file and had it OCR the image and output what characters it found. If you did everything right, it should be the same characters that are in the image file. If so, you have been successful! Good job, citizen!

Other Issues

I did not have to train Tesseract for "words," which is where the whole language thing really comes into play, with dictionaries and files to help "unambiguate" similar characters, especially when considering kerning issues, e.g., distinguishing "rn" from "m" in a sans serif font. That is more useful when you are trying to OCR entire documents into English, for example.

The Tesseract language files that are on the project site are already pre-trained for some common (mostly sans serif) fonts. If you are trying to do real language processing I would start with those files and hope they "just work." If not, you have a lot of work ahead of you. At that point I would start considering a commercial package.

Using Checksums in SQL to Find Groupings of Like Data

This is a bit of an edge case and there are probably better ways to approach it, but it took me less than five minutes to whip up and saved someone else in our company a bunch of time.

We have at least two custom apps (neither of which I had any part of writing, BTW—as the post goes on you’ll see why I disavow them) that use denormalized tables that hold both rows for individual items (users in one case, pick list items in the other) and groups (user groups and pick list names, respectively) in the same table. Then, in both apps there is a second “mapping” table that maps the individual items to the group items. Perhaps a sample would be clearer.

Here is the Users table—misnamed, since it holds both user and group definitions:

id name type
1 admins group
2 joe user
3 jim user
4 lusers group
5 jon user
6 jack user
7 jerry user


And here is the GroupUser table—the “mapping” table:

groupid userid
1 2
1 3
4 5
4 6
4 7


With me so far? If you haven’t clawed your eyes out by now, it’s probably because you’ve seen this sort of thing, too. Heinous, heinous stuff. Especially because that Users data table doesn’t just have those three columns in it—no, it has other columns, some of them holding orthogonal data based on what the Type column contains.

Now, consider a really flawed application that we want to rewrite. The application depends on two tables such as the above to hold users and groups in the Users table, with the GroupUser mapping table holding which users are in which groups. For reasons that are too painful to even contemplate the original authors of the app, which deals with reports, decided that each report should have it’s own group for defining who can access it. Worse, they didn’t allow for groups within groups, which means there are literally hundreds of groups (like, almost 800), many of which hold—you guessed it—identical group members, all manually maintained as reports are added or people are hired or leave or change job positions. So obviously as we rewrite the app we want to be able to define such groups once and reuse them across reports.

How to figure out which groups are identical in terms of user membership? Well, one way would be to have the person who administers them sit for a day and figure it all out by hand and hope they don’t miss the fact that some groups may differ from others by only one member (and some of these groups can hold a hundred users in them, so good luck with that). Instead, I came up with the following using T-SQL’s CHECKSUM function.

Here is it in all its glory:

SELECT
    [Group],
    SUM(Checksum) AS Total
FROM
(
    SELECT
        G.NAME AS [Group],
        CAST(CHECKSUM(U.NAME) AS BIGINT) AS Checksum
    FROM GROUPUSER GU
    INNER JOIN USERS G ON
        GU.GROUPID = G.ID
        AND G.TYPE = 'Group'
    INNER JOIN USERS U ON
        GU.USERID = U.ID
        AND U.TYPE = 'User'
    GROUP BY G.NAME, U.NAME
) A
GROUP BY [Group]
ORDER BY 2, [Group]

Basically, this joins each user to their appropriate groups (a row per group/user combo) and takes the checksum of the user’s name (login id, actually). Then those checksums are summed together by group and displayed in order by those sums and then group names underneath that. When looking at the checksums all the rows with the same sum likely hold the same group members.

Now, purists will note there is some chance of collision with checksums, and summing checksums certainly raises the chances of that slightly, but in our case the results that came out look right, in terms of the person who admins all the groups looking at the clusters and saying, “Yes, those groups all have the same members in them.” So I wouldn’t claim this would work across really large data sets but for the purpose at hand it did Just Fine, and five minutes worth of work saved someone a lot of manual cross-checking.

You're Soaking in It

A long colophon explaining the ideas behind the design of this site.

Introduction

Every few years I redesign this site, usually as an excuse to learn something new. Quite a while back it was built with Pelican, a static site generator. Then I moved to using pandoc, Markdown, Bootstrap and make. Both of those worked OK, but in the end they both required remembering to install a series of toolchains to keep working, and more importantly how those toolchains worked.

Then I decided I wanted to learn more about CSS than what I've picked up on the streets for work. I also wanted to get the "toolchain" down to "just a text editor." Finally, I wanted to eliminate any reliance on Javascript libraries, and just for fun, at least for the main page (this one), to use no Javascript at all. The question then becoming, "How responsive, dynamic and 'modern-feeling' could I make it, sans scripting?" As the title says, "You're soaking in it."

I call the end result SKABS, or "stone knives and bear skins." Written entirely by hand, no scripting except on some auxilliary pages where their functionality requires it (and the use of Javascript on those pages is noted both in the footer and with <noscript> tags), and only one piece of third-party CSS embedded in my styles.css file, but then heavily modified by me.

As time went on, I added some additional constraints. I wanted the main page to emulate a SPA. I wanted it to load fast, so any resources should not be fetched until they are required to be visible. And I wanted user-friendly features, like collapsable menus. Again, all without scripting. Some of my inspiration came from two manifestos I read right around the time I started—Jeff Huang's This Page is Designed to Last, and Daniel Janus's Web of Documents. I don't follow either religiously, but they were in my mind while building this.

More technical details follow—if you are interested I presume you will "view source" (Ctrl+U) and look at styles.css to follow along.

Note: There is also a "style guide" that is really only interesting to me.

Showing and Hiding Without Script

This consists of two techniques. The first is pure HTML—the details and summary elements. These give a way to show some introductory text in a summary text block, and when it is clicked, to expose the rest. This is how the menu works, as well as all the "Read more..." elements following every article's lede. Very, very easy.

The second is a bit more involved, and relies on "the checkbox hack" (search the web for that phrase and you will get plenty of hits). This is how the "tag filters" at the top of the page work. It involves hiding a checkbox but leaving its label exposed. Clicking on the label checks or unchecks the hidden checkbox, and then through CSS other elements can be shown or hidden at will.

Delaying Resource Downloads

As the main page grew bigger and added a lot of images and videos, I noticed every reload was downloading all of them as well, even if they were hidden behind a collapsed <details> tag. Making them display: none didn't stop the downloads, either. Not good, because that would end up bringing down hundreds of megabytes on every page refresh!

For the images there is a well-known hack where, instead of using <img> tags, you can use a <span> or <div> element and either set its content style to the image URL, or set a ::before or ::after pseudo-element's content or background-image to the same. I use both techniques.

For videos it was a bit harder, and ended up being a bit of a hack. The problem is I use Vimeo to host my videos. While I could use the new HTML 5 <video> element and delay downloading by styling it hidden, Vimeo wants to charge me $240 a year for the "embeddable links" required by those. Otherwise, on my free account, I am stuck with embedding <iframe> elements. And <iframe> elements are like <img> tags, in that they download whether they are visible or not. But in this case, there is no easy "set it as the background" hack available as with images. So what to do?

"Every problem in computer science can be solved by adding another level of indirection." In this case, I created a second page and load that in the <iframe>. So of course that second page is loaded as many times as there are <iframe> tags on this page, but at just a bit over 2KB per reference, that's not too onerous. But here's the cool hack—the secondary page embeds an <iframe> itself, but its src attribute is empty! It then uses some Javascript (which is a bit of cheating, but hey, this page isn't using it!) to detect when it is made visible (by a <details> element getting expanded) and sets the src attribute to the appropriate Vimeo URL at that point, and then the Vimeo resources download. I think that's pretty cool!

As of this writing, on page load for index.html, the following network traffic occurs:

  • The page itself, which is by far the "heaviest," as it is over 300KB as I type this.
  • The styles.css file, a tad shy of 20KB at this point.
  • My picture in the upper-left corner—the so-called "hero image" (snork), ca. 28KB.
  • n X the <iframe> placeholder page (at n X 2KB)

In other words, the entire "site" downloads in less than 500KB. And since it is static and everything is cacheable, and it is all text so everything is highly compressable, I feel like that's a pretty good page load goal. Even the skinniest Wikipedia page is around 800KB, and of course most commercial sites really increase the payloads with Javascript libraries, CSS, images, trackers, etc.

Miscellany

A few other comments and thoughts. The first is, to keep bandwidth down and avoid any licensing issues, I use no third-party fonts, not even the so-called "Web-safe" ones. I have restricted myself to serif, san-serif and monospace font-family options exclusively. I also use no special fonts like Glyphicons or Font Awesome, but instead just use Unicode characters for any special glyphs I want, after making sure they render correctly on both desktop and mobile.

The only CSS that isn't hand-carved by me is for the photo slideshows (look at something like Mt. Harvard, for an example). For that I use CSSBox, although I have then heavily modified it to avoid using <img> elements, as well as to add captions.

Getting the "checkbox hack" to layout correctly on mobile was a long and involved process. No matter what I did, on mobile (only) layouts it wanted to reserve space for the checkboxes. Look at the input[type="checkbox"] selector in the stylesheet for everything I did to finally make them hide, hide, hide, dammit!

I only used tables for laying out actual tabular data (like the results from SQL queries), and even so I am not very happy with the results and may keep tweaking them or going to something like <pre> layouts instead (which I did in at least one place already). For one thing, getting tables to hyphenate correctly is a bitch, and because of how the CSS standards are implemented, in English it only works if the words in the table cells are lowercase (really—you then have to text-transform: capitalize those cells to get them back to being, well capitalized). If you don't believe me, try it yourself! But otherwise without hyphenation they look even worse on responsive mobile layouts.

About

I'm Jim Lehmer, a software architect in the middle of nowhere in flyover country. I am also an O'Reilly author.

All content written or created by me and is copyrighted by me unless otherwise noted. Everything expressed here are my personal views, and do not represent my employer.

This site was written using "SKABS" (stone knives and bear skins), that is, plain old HTML 5 and CSS 3. It uses no Javascript, because "The fastest framework is the one you don't download." I consider it both a exercise in self constraint, plus a way to make a site I can edit in Notepad or vi without any additional tooling or prerequisites. Everything has been hand-crafted by me, although I've certainly used inspiration from around the web.

You don't care, but there are style guidelines.