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.
Mt. White
I fill in the space between Mt. Antero and Mts. Shavano and Tabeguache by climbing Mt.
White (13,667').
The following is from my trail journal.
Was awake at 4:30am, up at 5:00 and at the Brown's Creek trailhead and on-trail at
5:30am. Was on top at 9:00. Had the summit to myself for 45 minutes. Left at 9:45, off
the summit block talus at 10:30, back at the truck at 12:30pm. Not bad! And it wasn't
as hot as anticipated coming down because the afternoon monsoon storms started
collecting and growling about 10:30 or so.
Saw two pairs of climbers on Mt. White. The first were descending a gully, very
cliffy, to the south off the summit. First I could hear them, then see them. One seemed
much more confident than the other. Considering there were two cars parked west
of the summit at the top of the jeep road, I don't think they were descending to
Brown's Creek (a suicide proposition, IMHO), but instead were prospecting? [I was
saddened by the mining on the back side of Antero.]
The second pair were as I was coming down, they were trying to climb the north slopes
of White, but way too early through some steep, chossy shit. They finally turned
around and descended. Anyway, good day for me, back at the truck just as it started to
rain.
-
One-Way
-
~7 miles
-
Time
-
3:30
-
Starting Elevation
-
~8,900'
-
Maximum Elevation
-
13,667'
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.
Handies Peak, Again
I climb Handies Peak (14,048') again, this time from Grizzly Gulch.
The following is from my trail journal.
I got to the Redcloud/Sunshine/Grizzly Gulch trailhead and was on-trail at Grizzly
Gulch at 9:00am, "just for a walk." I felt strong. The weather was overcast but in a
way that kept it both cool and made it seem like no chance of monsoon storms soon.
Halfway up the gulch, looking at the peak, I decided to go for it and was on top at
11:22, three miles even according to GPS, so 3,500' elevation gain and three miles in
2.3 hours is not too shabby.
Took pics, talked with other summiters and was back descending at 11:48 and back at the
truck at 1:20pm for a round-trip of six miles and 4.3 hours. Kicked it!
-
Round-Trip
-
6 miles
-
Time
-
4:20
-
Starting Elevation
-
10,400'
-
Maximum Elevation
-
14,048'
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. Ouray, Again
I re-climb Mt. Ouray (13,961'), this time in the summer and from the Continental Divide
Trail/Colorado Trail on its west side.
The following is from my trail journal.
On trail shortly after 6:30am on the CT/CDT heading north for about a mile and until
there was a USFS "Road Closed" sign on a trail heading up at the crest of the CT going
over the west ridge from Mt. Ouray. It quickly petered out but that was OK because it
was easy walking up through thinning alpine forest until timberline, then it is just
following the ridge up, and up, and up, and up, and then down, and then up, up, up to
the summit.
It is a very big summit with three wind shelters and two USGS markers. Beautiful day -
few clouds, almost no wind on the summit. Watch says I made 2.84 miles to summit in
1:47. Not too shabby! The rock was a great climb, and just sticking to the ridge crest
was usually the winning strategy up and down. On the way down I angled more directly
for the pass (which was visible all the time above treeline). Spent about 45 minutes on
top. Was back to the truck by 11:30.
-
One Way
-
2.8 miles
-
Time
-
1:47
-
Starting Elevation
-
10,842'
-
Maximum Elevation
-
13,961'
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.
San Luis Peak
I finally climb San Luis Peak (14,014') after passing by it on the Colorado Trail in 2016
and not feeling the weather was right, and attempting it in an Autumn snow storm a year
later.
The following is from my trail journal.
Was on-trail at 4:50am. Planets were large and bright, waning moon was setting over the
basalt ridge to my left. Headlamp was off by about 5:10 or so. Good, clear day. Really
enjoyed the walk over to the saddle via the two big, long curving drainages. I
always forget for how dramatic the rock formation that marks the trail meeting the
Continental Divide Trail/Colorado Trail is, it is barely distinguishable from the
peak's summit or coming back until you are almost on it.
Was on the summit at 7:35am. A couple from Aspen, then a guy from Denver, all came up
the northeast ridge route, which I find interesting. Was on top for an hour. Clear,
only one small puffy cloud. Then down at 8:35 and a nice relaxing walk back including a
brief stop in the woods to enjoy the wild flowers. Was back at the truck at 11:10am.
Take the hour on top and the stop out, and the 11.5 mile round-trio was five hours..
Not too shabby!
-
Round-Trip
-
11.5 miles
-
Time
-
5:40
-
Starting Elevation
-
11,500'
-
Maximum Elevation
-
14,014'
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.
West Spanish Peak
I climb West Spanish Peak Peak (13,631'), part of one of the best skylines in Colorado.
The following is from my trail journal.
Happy Independence Day!
I was up and on the trail at 5:30 this morning, and was on the summit by 8:00! The
first 1.5 miles went just as great as yesterday The last 1+ mile and 1,600' elevation
gain was as described, but for as forbidding as it looked, there was always a class 2
route somewhere, mostly it was looking for cairns until through the cliff bands, then
it wasn't as bad, and the false summit was probably only 300 yards (if that!) from the
real summit.
(I met) Two guys coming down who had went up at 2:30am to catch the sunrise, then a
girl and her dog, and then I was #4 on the summit and had it all to myself for 40+
minutes.
There were lenticular clouds over Culebra and another high peak in the Culebras. Patchy
clouds here and there but surprisingly calm and nice on top. Sorta like Hope Pass on
the Colorado Trail on 7/4/2016.
Headed back, took longer to come down off the scree than to go up, although the way was
usually clearer. Then a nice relaxed hike, stopping to hang out and sightsee a little,
and back to the pass at 11:00.
-
One-Way
-
4 miles
-
Time
-
2:30
-
Starting Elevation
-
11,247'
-
Maximum Elevation
-
13,631'
Click on any picture below to see the slides full-sized.
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:
- There was a very short but exposed down-climb I didn't like doing solo
(down-climbs are my weakness).
- 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.
- 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. We then watched her twice
live-streaming in 2020, because COVID.
-
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.
-
U2—finally 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.
-
Matthew Sweet—Does live-streaming count, especially if you paid a tip?
Because we both love him and watched him on January 1, 2021.
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
:
- Log something (because without logging debugging this thing is almost impossible,
especially production problems).
- Change the actual thing you want to change.
- 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:
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:
- 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.
- It looks for for directory entries that:
-
Are a person—
objectCategory=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.
- 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).
- 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).
- 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.
- Navigate to
HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal
Services\Client
.
- 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.
-
objectClass
—from top
.
-
sn
—from person
, alias surname
.
-
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:
- Through an existing generic browser/editor—For example, the ADSI and LDAP API
based tools that come with Microsoft's Active Directory.
- 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:
- Everyone approaches LDAP as a hierarchy. This is wrong.
- Everything you know about relational, hierarchical and network database management
systems is wrong. Wipe it from your head while dealing with LDAP.
- Don't think navigation or underlying organization. Think sets and set theory. Think
Venn diagrams.
- LDAP schemas are easy. Once you get the hang of them.
- Object metadata in the directory can morph in real-time.
- You will probably have to write code (unless you're working with an email client).
- 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 UNION
s 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
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, ' ', ' ') AS XML) AS X FROM ParseExample)
I personally would prefer something more like:
(SELECT CAST(REPLACE(HTMLText, ' ', '&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:
-
Created on—a column indicating the date and time at which the entity was
originally created.
-
Modified on—a column indicating the date and time at which the entity was
last altered.
-
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:
- For "open" status codes, the
WHEN
returns the current date and time.
- 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
.
-
Italic—
1
if training for italic font. 0
in
our example.
-
Bold—
1
if training for bold font. 0
in our
example.
-
Fixed—
1
if training on a fixed (monospaced) font.
1
in our example, since OCR-A is a fixed font.
-
Serif—
1
if the font has serifs. 0
in our
example.
-
Fraktur—
1
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:
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:
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.