13.07.09

Pawling, NY to Unionville, NY: “it’s pronounced NOO-kyoo-lur”

August 12

(8.3; 751.5 total, 1422.5 to go; -6.7 from pace, -223.5 overall)

After a night underneath the pavilion, it’s on to town to do a last few things before heading out to hike again. First stop is a gas station on the way out, where I grab some breakfast and purchase a lighter, as I’m running low on matches. I first attempt to purchase matches, but they have none as they don’t sell cigarettes (due to a recent underage sale); why they still have lighters given that explicitly stated reason is beyond me. Next stop is the library, where I write a brief post noting my rattlesnake encounter before walking the three miles back to the trail. (Recall that New York prohibits hitchhiking.) Along the way I pick up another lighter found on the side of the road — too bad I already got one.

The Dover Oak, the largest tree on the Appalachian Trail (over twenty feet four inches in circumference four feet from the ground)
The Dover Oak, the largest tree on the Appalachian Trail (over twenty feet four inches in circumference four feet from the ground)

After a stop at the nearby Telephone Pioneers Shelter I head south again, passing by the view from Cat Rocks down upon Pawling and the road into it.

The view from Cat Rocks along the road toward Pawling
The view from Cat Rocks along the road toward Pawling

Between a late-morning departure from town, the three miles of walk back to the trail, and a lengthy stop at the shelter, it’s getting fairly late in the afternoon, so I decide today will be a fairly short day of hiking, culminating at Morgan Stewart Shelter.

Another view from Cat Rocks
Another view from Cat Rocks

Before hitting the shelter, however, it’s time to pass by Nuclear Lake, first mentioned to me by Powder River at my last overnight stop in Massachusetts before entering Connecticut. He’d suggested a good route to reach the lake and take a swim, but it’s getting late enough in the day that I decide to pass on a swim; I don’t feel the same desire to swim that I did when I passed by Lonesome Lake in the White Mountains. Even omitting a swim, however, the lake is well worth hiking past. It’s easily the most beautiful lake on the entire trail; my pictures fall far short of doing it justice:

A view across Nuclear Lake, which is clearer and more perfectly reflective than this picture demonstrates
A view across Nuclear Lake, which is clearer and more perfectly reflective than this picture demonstrates

The lake derived its name from a nearby nuclear research facility on site until 1972, demolished when the Park Service acquired the lands for the Appalachian Trail. Extensive testing proved fears of lingering contamination to be unfounded, and the lake now serves as a prime swimming spot on the trail in New York. Nonetheless a small, irrational stigma remains attached to the lake through its nuclear heritage, and most register entries in nearby shelters joke about not seeing three-headed fish or other genotypically-deviant creatures. It’s depressing just how much irrational fear remains of all things nuclear, from the relatively unimportant cases like this to the momentous ones like considering construction of new power plants, as though nuclear byproducts were so much more dangerous and more harmful to the environment than the alternatives. (Consider, for example, that coal ash is more radioactive than stored nuclear waste, not even reaching the vast difference in quantity of normal pollutants each produces. I envy very little of French society, but I do envy the extent to which they’ve overcome naysayers and switched to efficient, clean nuclear power over more expensive and otherwise-troublesome alternatives, generating around 80% of their electricity from nuclear power.)

Another view across Nuclear Lake, again with excellent reflection of the surroundings and their colors
Another view across Nuclear Lake, again with excellent reflection of the surroundings and their colors

Walking continues apace through trails skirted by copious amounts of wintergreen. I’ve been seeing this plant along the trail for awhile now; it’s easy to recognize for two reasons: first, the shape of its leaves, and second, their characteristic minty smell when ripped. I pull out a ziploc bag and fill it with leaves from the plants, because I hear it can be used to make a great tea, and it should be early enough in the day when I stop that I’ll be able to make some with dinner.

There’s actually quite a crowd at Morgan Stewart Shelter tonight when I arrive. It’s not a weekend, so I’m not really sure why there are so many people. There’s still plenty of space for me to make dinner and eat, and it’s nice to have company; non-thru-hikers make for a refreshing change of pace. Nobody knows what the right way to make tea from leaves is, so I try slicing leaves into small pieces and dumping them into water boiling on my stove, letting them sit covered for a few minutes. It doesn’t turn out half bad, but over subsequent weeks and months it becomes clear that meticulous slicing is more troublesome than simply taking the leaves and ripping them into pieces by hand. Having depleted much of my water on dinner and tea, I refill at the pump installed at the site, maintained as I understand it by the local trail maintainers. The water does have to be purified, and it has an extremely metallic taste due to a high concentration of iron from the pump and the tubes down to the water below, but it works reasonably well. As usual I read through register entries as part of the pre-sleep ritual; one entry recommends a Grand Slam breakfast sandwich (I think I’m remembering the name correctly) that’s absurdly caloric, greasy, fatty, and all things awesome and awful (think This is why you’re fat except that for any thru-hiker, as noted many times previously, it doesn’t matter), available from the deli reached from the next road crossing south. I plan that as my breakfast for the next day before heading to sleep.

August 13

(19.7; 771.2 total, 1402.8 to go; +4.7 from pace, -218.8 overall)

It’s up and out fairly quickly this morning as I head four miles south to the road crossing and 0.3 miles east (well, a few tenths further as I overshoot by failing to notice it just off on a side road) to the Mountain Top Market Deli, where I order the Grand Slam and a second sandwich to be consumed as lunch. I also fill up on water from an outside hose, a nice change from the highly metallic water from the pump at Morgan Stewart.

Returning back to the trail I pass by a carton of packages of Ramen noodles discarded along the side of the trail. It almost looks like someone oversupplied, but the number of packages seems too high for it to have been one person, unless that one person were especially incompetent. I don’t need anything, so I pass on by. Much of today’s walking is cutting across hillsides through forests, and it’s mostly unmemorable.

My lunchtime stop is at RPH Shelter, the first of three shelters on the trail where — I kid you not — pizza delivery is a viable option. There’s a parking lot a few tenths of a mile north of this shelter to which deliveries may be made, and judging by the trash can here, people have definitely been doing so. I enjoy my second deli sandwich of the day and briefly talk with a northbounder passing through, mentioning where I got the sandwich I’m eating for lunch. The caretaker walks in a little later around the time I start heading out; I fill up on water from a creek just south of the shelter and continue on.

After RPH Shelter commences the longest stretch of trail without shelters that I remember on the trail, at 31 miles (31.6 if you count the 0.6 miles off-trail to reach West Mountain Shelter at the south end of it). I’m not really sure why there’s a shelter drought here; there are plenty of spaces to put them, at the existing campsites in the section if nowhere else. If I wanted to I could push out the entire distance in a day if I were at the end of the trail, assuming I started from RPH, but since neither is the case it’s a night outside a shelter today. I have two options: stay at a group campsite just off the trail at Dennytown Road in 10.7 miles, or stay underneath the pavilion at a baseball field at — again I kid you not — a monastery, Graymoor Spiritual Life Center, in 18.9 miles. In my best shape on the trail 18.9 miles is feasible before dark, but I’m not quite there yet, so it’s through the forests, past a vista or two over the surrounding area, and to Dennytown Road I go. The nearest southbounders are comfortably ahead of me, so it’s a surprise when I find the tent of another southbounder, Timber, at the site. He’s been taking a slower pace than I have (I met him at Trail Days 2009, which he reached in his hiking last year before running out of money to continue south; he’s saving up now to continue further south when he can), and he signs into registers far less, so it’s understandable that I would have missed notice of him before. It’s a fairly early stop for me today, but the usual sluggishness to do the usual in-camp chores means I eat dinner as darkness descends. As dark descends we hear weird noises from the surrounding brush that almost sound like some sort of fight between two animals, one might guess a bobcat and a raccoon, but neither of us has much desire to go and get in the middle of such a fightinvestigate.

August 14

(20.3; 791.5 total, 1382.5 to go; +5.3 from pace, -213.5 overall)

I wake up this morning to rain, which causes me to delay a bit getting up and out this morning. I have a bit of a walk today, as I’m hoping to get to West Mountain Shelter tonight, and I want to literally pass through the Bear Mountain Zoo along the actual Appalachian Trail while it’s still open for the day. The Companion says it closes at 17:00, so I have plenty of time to make it as long as I don’t dally much after this morning.

The day’s hiking is intermittently sunny and dreary. I pass by Graymoor without stopping, propelled by a desire to make it to and through the zoo while I still can. It sprinkles a bit as I walk on, with every appearance of a downpour in the distance ready to move toward me, but it never actually gets past sprinkles. After a little confusion navigating N.Y. 9D, I pass from it onto the Bear Mountain Bridge, a large bridge over the Hudson River. The Companion says Earl Shaffer, the first thru-hiker, had to pay a toll to cross the bridge when he came to it, but now the only tolls are for vehicles (and possibly, if I remember right, only for vehicles heading in one direction across it). The bridge is several tenths of a mile in length, and it takes awhile to get across it, passing by the obligatory anti-suicide signs along the length of the walkway on the south side of the bridge. When I arrive at the other side, it’s 16:40, just in time to walk through the zoo (and pass the lowest point on the trail at 120-odd feet), maybe pick up a hot dog or something from a concession stand, and continue on. However, my plans are confounded as I learn that my 2007 Companion lies: the gates close at 16:30, not 17:00. (Insert scream of primal rage here.) At this point there’s nothing more to do but walk around the zoo (the official route after hours and for hikers with dogs) and try to figure out where the trail connects up later. (Alas, it seems the 2008 and 2009 Companions still contain this misinformation, so this year’s thru-hikers may end up making my mistake. However, while I was at this year’s Trail Days I spent some quality time with my copy, a 2009 copy, and my memories recording all the errors I remembered, so future thru-hikers won’t make the same mistake.)

After walking around the zoo and stopping to pick up some small snacks at vending machines near a lake on the road just opposite the zoo, I start up Bear Mountain along somewhat confusingly-blazed trail. The mess of trails in this area means there are half a dozen different blazes to distinguish, and the differences among them can be subtle. There’s a multi-year construction project underway to install stone steps up the mountain, and judging by the current trail they’re definitely needed. This trail switchbacks across heavily eroded paths, and people cutting across them do yet further damage to the trail. These problems are further compounded by this section of trail being one of the most-hiked sections on the entire Appalachian Trail. I hike up around the same time as another guy who says he hikes up it regularly, possibly even every day if memory serves. It’s starting to get close to dusk as I reach the top, and I need to start hurrying to make it to West Mountain Shelter before it gets dark. The remaining miles go past quickly as I carefully watch for the side trail on which the shelter lies, then it’s a quick 0.6 miles down it to the shelter, and I arrive with almost perfect timing to get in before dark. My Companion talks of a resident rattlesnake in the past, but it doesn’t seem to be around this year. I share the shelter with a few other people out for overnight hikes; two of them cook food in foil on coals in a fire, while the other uses a backpacking stove as I do to cook food. Supposedly the skyline’s great, with views of NYC, but it’s cloudy enough that we can’t see that far. Nonetheless, it’s a good view over the surrounding area, and the occasional lightning flash is beautiful.

This shelter has no water source according to my 2007 Companion, but the others make a claim of water further (steeply) down the trail in a quarter of a mile (as does the 2009 Companion, as I discover later), so I head down it as darkness descends. I eventually do reach water — not high-quality water, but water nonetheless — way after a quarter mile, I’m sure, and I fill up. It’s at least a fifteen minute walk to get back to the shelter (I timed the return trip but have forgotten the precise time), and I’m sure it took at least twice that much time on the way down due to the descent and concern about keeping on the trail and not missing the water — definitely the longest trip to get water I’ve done on the trail. That finished, it’s off to sleep for the night after a thoroughly satisfying day of hiking.

August 15

(15.8; 807.3 total, 1366.5 to go; +1.0 from pace, -212.7 overall)

Today’s hiking is fairly unmemorable. The trail continues further through Harriman State Park, as yesterday still much crisscrossed by the other trails in the park, each with their own esoteric method of blazing. Most travel is over rolling hills with large boulders embedded in the ground — nowhere near small enough to make footing difficult, but enough that you have to hop a bit.

Early in the day I pass over Palisades Interstate Parkway, a well-trafficked, divided road which brings to my mind the game Frogger. Most of the road crossings on the trail are quite safe as long as you’re a little careful, but some require particular care. The road to Rutland in Vermont was probably the first such road crossing, and this makes the second. Nevertheless I pass it without incident and continue south to William Brien Memorial Shelter. It’s a stone shelter built by the CCC back in 1933, and it certainly looks the part. I stop and eat some gorp as I pass by before continuing on another four miles to a road crossing, at which a brief 0.3 mile trip to the east brings me to Tiorati Circle, a large parking lot and building with showers, bathrooms, and most importantly, vending machines. My food and gorp supply is starting to get low, and I need to get something to make up for what I’m not carrying. I refill on water, drop around $10 in the machines (some of the results of which I eat immediately, the rest of which I pack away for later eating), return to the trail, and head south again.

It’s only a mile south to Fingerboard Shelter, where I stop again to read the shelter register (which might not have existed, memory hazy) and look around. I stop and pull out some of those mostly-tasteless sugar wafer cookies (the long rectangular ones) and eat some of them while I sit and read Hope for the Flowers, a watercolor hundred-odd-page illustrated book, according to the note inside it left by friends of a thru-hiker for him. It’s not a book amenable to reading a little bit to know what it’s about, at least not well, so I sit and spend an hour or so not hiking and simply sitting and reading. It’s a beautiful book, worth reading if you’re the sort of person who likes “kid books with a message” such as The Giving Tree, that makes you think about how to live life meaningfully, rather than be sucked into a race to nothing. By the time I finish it’s getting late enough in the afternoon that I need to get moving and keep moving if I’m going to get to Wildcat Shelter for the night, around fifteen miles south.

Unfortunately, my body doesn’t want to cooperate. I don’t know why, but my stomach aches and I feel like I’m going to be sick if I keep hiking. (I’m tempted to blame it on the sugar wafer cookies I bought and just ate since they’re so un-tasty as candy goes.) In this situation there’s not much to do but stop and hope it wears off, so I pull out my sleeping pack, kick back, and read more of Charlie Company — the perfect thing to quell an upset stomach! I get a couple hours of reading in until it starts to sprinkle slightly, at which point I decide I don’t have much choice except to hike on again; it looks like I’m going to be hiking past dark tonight. Hiking goes pretty slowly to top it off, and the lack of markings at trail junctions have me somewhat confused about exactly how far I’ve hiked at any given point in time, which doesn’t especially help morale. A few spots like the Lemon Squeezer (a fifty-foot stretch of trail that descends between two long boulders spaced narrowly enough that I have to remove my pack to get it and me through) are recognizable from their names in the Companion, but most of them I think I’ve passed only to find myself passing them much later than I’d expected to pass them. Eventually I reach N.Y. 17, the end of Harriman, and I continue up a steep climb up Arden Mountain on the other side. I stop at trail register at the top to sign in and check on the progress of people ahead of me to discover a curious surprise: the earliest of the southbounders I’ve seen in registers, who had gone by the name SOBO Scottie up until just north of Greylock in Massachusetts and now goes primarily by Chatterbox, is only a day or two ahead of me! His note in the log book explains: he took two days off the trail to go to a wedding, but those two days turned into ten, and now he’s no longer in shape and hurting again. I’ve been trying to catch up to people I’ve already seen, but here’s one I’ve never met, and it’d be great to meet him. Another goal for future hiking!

(A digression: time off the trail and/or not hiking usually to some extent endangers successful completion of a thru-hike. Reminders of the comforts of modern life as well as the time back among friends and family take their toll on someone committed to a goal that requires foregoing of such comforts. Partly for this reason [and partly because I wanted to catch up to people ahead of me, or at least aim to do so even tho it was likely impossible without putting more effort into it than I wanted], I never spent spent consecutive days not backpacking south down the trail. [However, I had any number of hiking days that were so short that I made no more than perfunctory progress at not stopping, the shortest of which I remember as three miles.] Given what I knew of myself at the time and also [but much less necessarily] what I know from having completed the trail, I probably had no reason to worry. I never had much trouble remaining focused while hiking; Bill Bryson in his book A Walk in the Woods says there comes a point in every thru-hike where the thru-hiker wants to give up, or stop hiking, or something to that effect, but I remember no such time. I do remember any number of times [especially in downpours] wishing I were already at the next shelter, and by the end I wished at times that I were already done and looking back on the entire trail being completed, but at no time do I remember wanting to give up.)

It’s dusk at the top of Arden Mountain now, but I still have nine miles to go to the shelter. There’s not much to do but keep hiking into the dark; recall that according to one of the signs I saw entering New York, the state is evil and prohibits camping except in designated sites along the A.T. Had I not had to stop to avoid getting sick earlier I wouldn’t be in bad shape time-wise — it might have been a little walking after dark, but not much, not hours of it like now. After an hour or two of this, however, with a dim flashlight, I realize this isn’t going to work. The trail’s not very visible with my light, and I’m not going to get to the shelter until after midnight if I try to keep hiking this way. At one road crossing I note that the omnipresent white A.T. sign noting the trail and general usage information omits the add-on magnet saying that camping (except in designated sites) is prohibited in this section of trail, and I decide that safety concerns and time require me to avail myself of this loophole for the night. I set up my tent just off the trail a couple tenths of a mile short of the next road crossing and head to sleep, setting the alarm for extra-early (before six) to get moving before anyone can pass by and complain.

August 16

(18.7; 826.2 total, 1347.8 to go; +3.7 from pace, -208.8 overall)

It’s an early start today with the sun as I continue south. The long-awaited Mayor of Unionville, NY is a couple days south, so it’s time to start planning travel to arrive at a reasonable time; today I head south and out of New York into Wawayanda Shelter just inside New Jersey. From there it’s a relatively short subsequent day into Unionville to see this legend of the trail (recall that I first learned about him roughly seven hundred miles ago).

The first stop is almost before I start, at a road crossing by which the self-proclaimed Tuxedo Trail Angels have left about a dozen gallon jugs of water for hikers to fill up from. Water’s been less plentiful lately, partly because it’s late in summer and water sources start to dry up and partly because they’re just out less compared to earlier (or so I perceive). I leave roughly this note in the register accompanying the stash: “Never before have I appreciated such a tasteless gift! Also, your name suits you well.” Later on early in the morning I pass what seem to be two guys from Israel, based on accents and general appearances. One asks if I’m thru-hiking, and when I reply yes he offers me a plum, which I gratefully accept. It’s not dark-purple like all other plum I’ve ever seen, but nevertheless it tastes excellent. (The label on the plum further lends support to the Israel hypothesis.)

Whatever the momentary stomach bug of yesterday was, it’s gone today. Hiking goes well to Wildcat Shelter, my planned target yesterday, and I stop and read through the register. As I head out I pass by a dozen or so day hikers, a couple of whom remark upon my stench, which even I’m noticing lately. (Recall that this is during the several-weeks-without-shower stretch mentioned in a previous entry, starting from Manchester Center, VT and going to the mayor’s house in Unionville.) Unfortunately, there’s nothing I can do about it now except keep moving and wait for Unionville.

It’s a couple miles further down the trail to the last major road in New York on the A.T., N.Y. 17A, which I’ve been anticipating for awhile now as 0.2 miles west on it is the Bellvale Creamery — ice cream! I never pass up an opportunity for ice cream, particularly not a specialty place like here. Such a quality establishment doesn’t have half gallons, and I wouldn’t spend three to four times grocery store rates for that quantity ($8 a quart here, grocery stores are $5 or fewer for half a gallon), so it’s a quart of mint chocolate chip ice cream for me while I read.

As I eat I finish reading Charlie Company; it’s clearly been worth the read. The book is intentionally one-sided in that it covers Vietnam and its aftermath only from the perspective of the soldiers in Charlie Company, almost completely ignoring the geopolitical situation, but it covers that angle well, from a wide variety of individual perspectives. (There is, of course, the trap of forgetting the bigger picture, particularly in a book like this that’s likely to tug on heartstrings, but with care by the reader that problem can be avoided.) There are soldiers who considered deserting to Canada rather than be drafted, soldiers who thought it was their duty to country to go and serve, soldiers who believed in the war throughout it, soldiers who never believed, soldiers who believed initially but lost faith over time, and so on.

A few messages shone clearly through the numerous stories and anecdotes. The usual message about the psychological health of soldiers — that some emerge unscathed and some do not — that the strongest ones coming in emerged most unscarred, while those not so emerged with more scars — were predictably present. Most important however was this: the strategy, insofar as what there was could be called a strategy, was nonsensical. Soldiers were to act as a retaining wall, perhaps gaining ground for a moment but quickly relinquishing it, fighting battles without conquest or significant, permanent gain. The enemy we were fighting might retreat from the momentary goal, but it would retreat far enough to remain behind the metaphorical line we had drawn — and we would stop. We both would regroup to fight again (minus our and their casualties, but more important asymptotically less some of our will but a lesser proportion of theirs), and battles would repeat in different locations with little change in strategic advantage. This inability to take the battle to the enemy was apparently a product of the geopolitical situation, and my interpretation is that this, more than anything else, was why we lost the war. Nearly every soldier, pro- or antiwar or apathetic, at one point or another said that he believed if they’d been allowed to fight they could easily have won, and none said otherwise; the same held for commanders. Why didn’t we do this? The book intentionally does not address that side of the war, so I don’t know the answer yet, although certain guesses seem plausible. The one clear conclusion is that if it were a requirement to not take the battle to and through the enemy, Vietnam would have been better not fought. There may be something to say for hindering the spread of Communism during the time we fought, but this effect was inevitably short-lived, and the immediate and lasting psychological effect upon America and its soldiers vastly outweighed that small gain. Also in this broader view, an interesting contrast between Vietnam and Iraq presents itself: when we saw our Vietnam strategy wasn’t working we continued it; when we saw our Iraq strategy wasn’t working we changed it. The results of the two decisions as we’ve seen them to this point speak for themselves.

Once I’m done eating and reading, it’s time to fill water bottles, then it’s back to the trail again to continue my southings. (Incidentally, that’s one of the few nine-letter words I’ve successfully played in Scrabble, although it’s easily the dumbest, because it was only a couple turns in and I had two blanks. The others were “delirious”, from DE with the L as a blank, and “fetishist”, through the F and first S [although the correct play would have been its anagram “shiftiest”, which would have played and hit a triple word score, not to mention netted a most-unexpected-performance cash prize]). Back heading south the good times keep on coming as I pass a small stash of hiker magic, part of it in the form of a pear, which I grab and munch on as I head south. It’s not too long before I reach a sign pointing out a “Greenwood Lake Vista Trail”. However, the Companion mentions a turnoff for a “Village Vista Trail”, which will take me into Greenwood Lake where I can do a little bit of resupply before Unionville, and which I’d been intending to take. Based on a reduced hiking pace while eating the pear and the time it took to reach the fork, I incorrectly gamble that this trail isn’t the one I want and head on.

The next several hours are mostly ridge walking with nice views of the surrounding and some minor scrambling up, over, and down from boulders following Greenwood Lake south. None of it’s particularly difficult, but it’s enough that you can’t just walk over it in many places. My pace isn’t remotely similar to what it usually is, but it’s hard to judge; I think I’ve passed the border and entered New Jersey for over an hour when I finally reach the well-marked border — as it should be! I’m a little frustrated that my progress estimates seem to have been so wrong, but there’s nothing to do about that now. I don’t know why, but New York’s trail just didn’t feel all that great to me; maybe it’s just not enough forest walking, lots of old stone shelters, and the camping restrictions. In any case, since they leave me a register in which to record thoughts, I make sure to exult at getting out of the state — and I leave an obligatory “Yankees suck!” comment as well because, well, it needs to be said.

The New York - New Jersey state line, marked by white painted abbreviations and a line on a large rock, with a blaze and trail register off the side of the trail
New Jersey at last, I've had enough of New York

Past the line now, however, I’m forced to acknowledge that I’m running late today and that resupply on the side trail has been impossible since I passed the misnamed trail. My only option now is getting to the first road in New Jersey, the Warwick Turnpike, walking 1.8 miles east on it into town, and resupplying at a small deli with who knows how little in the way of options (not that I need much for one more day, but I’d rather not be forced into Ramen or worse if I can help it) — then walking back out to the trail, where at least there’s a shelter less than half a mile in where I’ll be staying for the night. The going is slow as I’m running low on energy and food, and it’s going to be near dark when I finish today. Thankfully, just before I hit the road I pass a cooler filled with trail magic — pop and granola bars — and the burst of energy from a can and a few bars really helps as I turn up the pace past full speed to get to the deli (which, I hope, doesn’t close too early, else I’m in real trouble). I’m half to two-thirds of the way to the deli when a car driving by offers me a ride, which I gratefully accept. The guy who picks me up says his son is doing a northbound thru-hike this year with the trail name Crazy Pete (which might actually have been Cranky Pete, since looking at the ATC‘s list of completions last year I see that name but not the other). He met with his family sometime in the last few weeks at home near here, and he’s doing thirty-mile days. That sort of mileage still seems pretty insane to me, considering I still haven’t strung consecutive twenties together yet, but it’s at least plausible.

At the deli I grab a deli sandwich for dinner and half a dozen Snickers bars to get me to Unionville. While standing in line I note that New Jersey’s smoking age limit is, curiously, not 18 but rather 19; I wonder why. (Even ignoring how easy it seems to be to get cigarettes under-age, I would bet it’s fairly common for people to cross state lines to smoke them legally, particularly given how small New Jersey is.) The man giving me the ride gives me a twenty to cover things as I fumble through my pack for my wallet, then says not to bother paying it back. This guy’s my hero for the day. He then drives me back to the trail, at which point I literally bound the remaining few tenths of a mile into Wawayanda Shelter; my pack’s nearly empty, it’s still awhile until dark, and I have time to relax. I share the shelter and campsite for the night with one or two families, pretty nice people all around. I eat my sandwich, pack up my smellables and put them in the bear box at the site (New Jersey has the highest concentration of bears on the trail at one per square mile in some areas), write a register entry thanking the guy who got me in and out of the nearby deli for the ride, and head to sleep after a long day. Tomorrow to the legendary Mayor’s house!

August 17

(17.1; 843.3 total, 1330.7 to go; +2.1 from pace, -206.7 overall)

It’s a nice, leisurely start today as I have relatively little distance to cover to reach Unionville. Even still I probably shouldn’t lag too much, because I have stops to make along the way. The first one is at Heaven Hill Farm for yet another quart of mint chocolate chip ice cream, which I eat this time while reading more of the Federalist Papers. A couple more miles of walking bring me to a trail landmark: a one-mile boardwalk constructed several years back as a handicap-accessible portion of the trail. (When one hears of such things it becomes even clearer that hiking the Appalachian Trail is distinctly unlike hiking the more remote long-distance trails.) The mile on that proceeds very quickly as I don’t need to worry about footing, after which I start climbing up one of the mountains along the trail in New Jersey. Truth be told they hardly deserve the name at half the highest elevation in the state (which is itself only around 1800 feet), but you’re still noticeably higher than the surrounding land.

A view south toward a nature preserve around which the trail travels
A view south toward a nature preserve around which the trail travels

My footing turns worse later in the day when I discover the boots I’ve been wearing since the start of the trail are beginning to fall apart. The section of rubber starting under the ball of my right boot and heading toward the back of the boot has started to loosen from the back toward the front, a nice complement to the rubber from ball of foot around the top of the toe that’s been peeling off since before Monson. (It also complements the rubber by the heel that’s been peeling off since Gorham; I’m not impressed by this pair of boots falling apart after only a couple hundred miles. The dysfunction now is seemingly reasonable — I’ve never worn a pair of boots long enough to have this problem in the past — but that I wore them this long is more a matter of dogged persistence and a lack of nearby REI stores at which to make an exchange than a testament to their construction.) Clearly these boots don’t have much longer for this world — a shame, really, because from what I understand of Pennsylvania it would be great to not have to wear a set of new boots over the extremely rocky trail there. I pull out a little duct tape and attempt to tape the rogue sole onto the boot before continuing further.

The last stop of the day on the trail is at Pochuck Mountain Shelter, 5.3 miles from the road into Unionville. I have some time as it’s only around 15:00, so I stop and read the register. It’s amazing: nearly every entry is either thanks to the Mayor or exhortations for hikers heading south not to stop now but to keep going another five miles! When you see something like that, you really understand 1) why you’ve been hearing about the place for 600 miles and 2) why someone might choose to open up his home in that manner.

It’s only five miles to go, so I figure I’ll try to maximize rest time by taking a fast clip and aiming to make it to Unionville by 17:00, a pace of roughly three miles an hour. After the descent down Pochuck Mountain the terrain is relatively flat to very slightly hilly, and I make excellent time to arrive at the road around, as best as I can recall, ten minutes before 17:00. First stop now is the general store in town, where I first purchase supplies for the next leg of the trip (as I have no idea what sort of schedule I’ll take when I leave). Here marks my first departure from purchasing the raw materials to make gorp to carry: the store doesn’t have the supplies, so I start purchasing large candy bars in large quantities. I also begin to purchase Pop-Tarts as breakfasts; oatmeal’s fine, but it takes a long time to cook and eat, and I’m hoping this may allow me to get a faster start each morning. After making the purchase and buying a deli sandwich to eat for now, I ask about the Mayor, at which point I’m told to wait until I can be picked up and taken there.

A few minutes later Butch, a friend of the Mayor, arrives with a truck, and I throw my backpack in the back and hop in for the ride over to the Mayor’s house. The rules are simple: treat his house as tho it were your own (and if you happen to throw chairs against walls in your own house or do anything similar, “don’t do that”), watch the brief film the Mayor shows everyone who stays as a requirement of being allowed to stay, and send a postcard after you’ve finished your hike (which I finally managed to do by early May — but at least it got sent!). Hikers stay in a basement in which bunks have recently (since the start of the summer, I think) been built. There are a handful of other hikers here when I arrive: Chatterbox (SOBO Scottie), Sweet Water, Little Fly, Silver Potato and Cracker, and another person or two whose names I’ve forgotten.

I don’t do much more than get a shower (glorious! first since July 29, way too long) before it’s dinnertime, provided by the Mayor. Portions are adequate but not large (at some point during the time I stay he mentions that since one early error he’s been very careful about how much is made so that people don’t eat extreme quantities), and it’s of course all a tasty change from dehydrated pasta all the time. I also discover a very good (ergo necessarily dark) local beer in Yuengling Original Black & Tan. (Yuengling has a brewery relatively close to the trail in Pennsylvania with guided tours, actually, although I forget to take one when I pass near it.)

The rest of the evening is fairly mellow. The Mayor shows the brief film to those of us who haven’t seen it already: it concerns Paul Potts, the winner of Britain’s Got Talent, the American Idol lookalike in Britain. Basically, Potts was a car phone salesman who loved to sing — sing opera, that is. (Imagine that on American Idol, if you will!) The film shows his progression from his first, tentative performance on the show through his final performance, starting with little self-confidence but then clearly gaining confidence as the show progresses; eventually Potts ends up winning the entire contest. (Again, imagine an opera singer winning Idol!) It’s intended to be inspiration at future points on the trail to continue hiking, or elsewhere in life to continue to work toward your goals. The Mayor mentions that he’s gotten post-hike postcards from thru-hikers who’ve told him they’ve found one of the songs featured most prominently in the film running through their heads as they completed the final climb up Katahdin, so it’s clearly been successful.

The rest of the day winds down fairly quietly. It’s the middle of the Olympics (I think Phelps may have become the new Spitz just the previous day), so they’re on quite a bit for the rest of the night. I round out the day typing up trail updates before heading to sleep.

Another state down, halfway through New Jersey already, then it’s into the third-longest state on the trail, Pennsylvania (behind only Virginia and Maine). The news on the trail has consistently been that Pennsylvania (really, starting south of the Mayor’s house through Harpers Ferry) is really rocky, making footing difficult and substantially slowing hikers down, so it may be that Happy Days are here no more. Of course difficulty estimates are fairly personal, so I’m waiting to see how bad it is for myself — and really, does the difficulty matter that much anyway? If I were worried about difficulty I wouldn’t be so stupid as to attempt a thru-hike. Just keep on moving and seeing what the days bring…

09.07.09

One day…

Tags: , , , — Jeff @ 16:18

I will learn to restrain myself from clicking on links to attachments in crasher bugs. And I will never ever again crash Firefox through personal incompetence and inattentiveness. And it will be glorious.

07.07.09

Help someone win a multi-million dollar penthouse condo overlooking Central Park in New York City!

Tags: , , , , , , — Jeff @ 15:07

No, that someone isn’t me; I wouldn’t know what to do with one if I had one (and I’d be astounded if I could afford the property taxes in any case), beyond flip it for a pile of money. All you have to do is find someone running recent Tracemonkey code (that includes xulrunner, Firefox, Thunderbird, Songbird, anything that embeds Gecko, any Linux system with GNOME and a sufficiently recent libgjs installed, &c.) on a V8 or earlier Sparc processor.

Further details in bug 502369 comment 11. 😀

04.07.09

Quote of the day

Tags: , , , , — Jeff @ 13:17

It’s Independence Day, so what better topic to discuss than the juridical matters of the United States? (Frankly, there are more substantive topics to address, to be sure — as a palliative I direct your attention [yet again!] to the Federalist Papers for one such topic — but a dash of humor with underlying substance is never out of order.) Here follows a brief anecdote I ran across recently:

In Gilchrist v. O’Keefe, 260 F.3d 87 (2001), Sotomayor wrote for the panel, which rejected an inmate’s claim that he was unconstitutionally deprived of his right to counsel during his state sentencing proceeding when the trial judge declined to appoint a new attorney to replace the attorney who withdrew after the inmate punched him in the head.

See the original source, as well as the decision itself.

It is worth highlighting that the fact that the deprivation occurred during “state sentencing” is critical to the opinion, as 28 U.S.C. § 2254(d)(1) (the relevant clause in US code) prevents granting relief in response to a state proceeding, assuming the decision was not “contrary to clearly established Federal law” (which, the decision notes, it was not). As a consequence the decision need not (and does not) reach any question along the most obvious line suggested by the quote, at least not outside of dicta (with which, tangentially, I am not particularly inclined to disagree) — an example of how legal decisions need not be as obvious as they seem, and an example of how common sense may play little to no part in the legal reasoning of a “common-sense ruling”.

15.06.09

Why Firefox 3.0.11 gained a point on Acid3

Astute observers of the recent Firefox 3.0.11 release will note that this release gains a point on the Acid3 test, specifically fixing test 68, involving a difference in how Mozilla processes UTF-16 from what the Unicode specification requires. (Indeed, it seems Wikipedia’s Acid3 article was updated to reflect this on the very day of the 3.0.11 release, and that edit has even been reverted and un-reverted once. One does wonder at times whether these people don’t have better things to do with their time. 🙂 ) What did test 68 check, why was it fixed, and why was it fixed in a dot release of a stable version? If you’re curious about this and are willing to dive into technical details at some depth, keep reading. If you aren’t, I write here for the pleasure of a presumptively-interested audience whether or not any such thing exists for the topic at hand, so you’ll forgive me for not caring too much what you do. 🙂

Representing text through Unicode and UTF-16

Without descending into too much detail, modern computer programs represent text as a sequence of numbers, one number for each “character” in the text. Unicode defines each such number as a code point and assigns each number a particular meaning (e.g. 99 is “LATIN SMALL LETTER C”, that is, the letter ‘c’). Such an arbitrary sequence can’t simply be represented as itself partly because computers can only efficiently handle numbers whose values are within small, fixed ranges, and code points cover too large a range (0 to 1114111) to handle directly. Unicode therefore defines a small number of well-known, widely adopted processes to convert an idealized sequence of code points into computer-friendly sequences.

UTF-16 is one way to represent a sequence of code points, using a sequence of 16-bit numbers. Broadly speaking, code points in the range 0 to 65535 are represented using the identical number; code points 65536 and greater are represented by a pair of 16-bit numbers. There’s an obvious problem: how do you determine if a 16-bit number encodes a single code point or half of one? Basically, not every 16-bit number is a code point; there are intentionally no code points from hexadecimal 0xD800 through 0xDFFF (55296 through 57343). With a little care, we can use two (exactly two, no more, no fewer) numbers from this range to represent a code point. For example, the hexadecimal number 0xD863, 55395 in decimal, does not correspond to a valid Unicode code point, nor does 0xDDDD, 56797 in decimal. The sequence 0xDDDD 0xD863 also corresponds to no Unicode code point or sequence of code points. However, 0xD863 0xDDDD represents the Unicode code point with the hexadecimal value 0x28DDD, 167389 in decimal.

Acid3 test 68 and its fix

The failing test 68 examined how to interpret a purportedly UTF-16 value which actually was in error. Specifically, consider a sequence of 16-bit values like so, to be interpreted as UTF-16:

Index Value description Example
0 Value appearing to be the first in a valid pair (a high surrogate) 0xD863 (decimal 55395)
1 Value not appearing to be the second in a valid pair (instead appearing to be a value in range [0, 65536) validly represented as itself) 0x61 (decimal 97)
2 Value in range [0, 65536) validly represented as itself 0x61 (decimal 97)

How should such “UTF-16” data be interpreted? First, note that Unicode includes the concept of a “replacement character”, used to fill in for the malformed parts of ostensibly-UTF-16 data when interpreting it. With that concept in mind, we have three plausible ways to interpret this sequence of values:

  • complain that the data wasn’t UTF-16 and refuse to interpret it
  • interpret as:
    • replacement character, identical value at index 1, identical value at index 2
    • replacement character, identical value at index 2

In fact if you look at test 68 itself, you’ll see a variety of responses are (to put it as conservatively as possible, since the specs are currently insufficiently precise to admit only one correct behavior) “not prohibited” by the relevant specifications. Mozilla at the time chose to interpret such data as the last of the three possibilities, thinking that the pair of 16-bit values was invalid rather than merely the first of them (in which case the second of the “pair” would be interpreted as its own value or start of a pair). However, the Unicode standard didn’t permit this choice, and neither did Acid3; further considering that other browsers had correct (and just as important, different) behavior, it made sense to change our interpretation in this case. I pushed a fix to the mozilla-central repository very nearly a year ago, and I made no attempt to get it in 3.0, for two reasons. First, the bug didn’t matter in the real world (web developers are very unlikely to have relied on the previous behavior, and the fix enables no new, desirable functionality); second, I knew we didn’t have enough time before the release to sniff out all potential regressions from such a low-level change and be confident nothing had been broken.

Acid3 refldux

Fast-forward a year later, however, and suddenly the fix for test 68 is in 3.0.11. The test, while important to fix eventually for a number of reasons, is not especially important for real-world behavior (a flaw of many aspects of Acid3, notwithstanding its many useful tests of desirable functionality, but I digress), so why fix it now rather than in the 3.5 release? Surely such a non-essential bugfix is better left to 3.5 as it already had been, right? That’s certainly true enough if our assumptions are correct — but in this case, curiously, they’re not.

One of the things that makes changing how character encoding works so exciting is that it affects a lot of other code. A small bugfix to such code usually has no effect on properly formed input, because such input is the normal case that receives regular testing. Improperly formed input, however, may cause immediate problems (which are usually simple to smoke out through careful creation and use of automated tests) or problems in other code at miles of distance (which are far more difficult to discover). Suppose data is interpreted by two different decoding implementations, producing two different idealized representations — what are the consequences? Maybe the lengths will differ. If those implementations are used in code written by memory nazis, perhaps a string will be copied incorrectly and result in a buffer overflow. Algorithmic differences might also throw off hashing schemes that use string length in computing a hash key. Of course, if lengths differ the characters must differ as well. That might cause a CSS selector to not apply correctly, or it might introduce a vector for slipping forbidden characters through an anti-XSS filter. Character encoding and decoding is fundamental to any number of other systems which rely on precise, correct behavior in order to work properly. If you don’t have that behavior, all bets are off.

In this case, as it turns out, two separate bugs were uncovered which my proposed patch fixed: bug 490513 and bug 489041. If you read the details in each bug, you’ll note that there’s very little in either bug to suggest why my change might have any effect. To be sure, both testcases deal with strings containing problematic sequences as above, but nothing in the testcase explicitly suggests UTF-16 decoding is happening.

A useful first step in examining any bug in a bug database is to look at its ancestry. Curiously, bug 490513 is a Bugzilla clone of bug 439206, with the same steps to reproduce and the same testcase. From there we proceed to the fix for the bug. The patch is small, and if one understands the relevant code it’s similarly easy to understand, but

The comment in the patch looks strangely familiar.

In fact I seem to remember exactly that comment in my patch for bug 421576 that fixed test 68. (Lest I be misconstrued, this comment-cribbing is perfectly acceptable in open source code, indeed is even stylistically better for demonstrating consistent intent in the code. However, your mileage may vary in other code or if perchance you happen to work for Microsoft.)

Also suspicious: this bug was filed roughly a week after I pushed 421576 to mozilla-central. A little more investigation confirms the obvious conclusion: bug 439206 was a regression from bug 421576, vindicating my initial thoughts in bug 421576 that “we couldn’t reasonably take this now and expect to be able to sniff out all possible regressions”. It seems that I updated most of our decoding code to handle lone high surrogates correctly, but I missed the spot being fixed in this patch. The code being patched here handles string hashing within Mozilla’s hash tables, and if you read the other bug comments you can see the testcase is causing a string to be hashed using two different algorithms (a failure mode I mentioned earlier), and as the computed hashes differed things went awry.

Here’s where Denmark turned rotten: this change was deemed important to fix for 3.0 point releases, but because no one noticed it was a trunk-only regression and thus didn’t need to be fixed in a security updates, it was backported to 3.0. The problem on trunk was that I only updated half the decoding algorithms in bug 421576, so fixing bug 439206 fixed the other half and brought them into sync. What did fixing bug 439206 in 3.0 do? It updated the other half of the decoding algorithms and took that half out of sync with what the other half was before 421576! Our trunk problem — that we changed one decoding algorithm but not a second that needed to be synchronized with it — had been ported in mirror image to 3.0 point releases. This problem, then, triggered the filing of bug 490513 (incidentally regressing bug 489041 as well), and for precisely the same reasons bug 439206 was marked as security-sensitive until being fixed, bug 490513 was marked as security-sensitive.

Let’s recap:

  1. I fix bug 421576 (and Acid3 test 68) in mozilla-central.
  2. This causes the security-sensitive regression bug 439206.
  3. Bug 439206 is investigated and fixed in mozilla-central.
  4. This fixes the potential vulnerability I introduced.
  5. People recognize 439206 as potentially dangerous but not as a regression, so the same fix is added to 3.0 point release code.
  6. This causes the security-sensitive regression bug 490513 (and bug 489041 as well), because we’re missing the first half of the code (in 421576) that caused 439206.
  7. That bug is investigated by the reviewer of my fix for 421576, who correctly hypothesizes that my fix will fix that bug without determining exactly why.
  8. 421576 is fixed in 3.0.11.
  9. This fixes the potential security vulnerability in 3.0.11 (and less importantly, Acid3 test 68).
  10. Both halves (421576 and 439206) are now fixed in mozilla-central and in 3.0 point release code.

…and people wonder why we’re so hesitant to fix anything except security bugs in updates to stable releases, instead deferring to the subsequent major release. The potential for error, even in code that’s been written and reviewed by four different people across the two bugs, introduces a far higher cost than can be offset by the value in fixing nearly any non-security, non-stability bug.

Lessons for the future

All this mess is now behind us with the 3.0.11 release. However, a number of the causes for failure here are not peculiar to the precise bugs fixed here. What can we learn from this that can be applied in the future?

Make string encoding/decoding code simpler

First, and most pertinent to the case at hand, string encoding and decoding are complex, and we need to do everything we can to make this code simpler. A large part of the reason 439206 was missed when fixing 421576 was that the relevant code was not part of Mozilla’s string code — instead of residing in xpcom/string, it was in xpcom/ds. It’s difficult to argue that a data structure used to hold atomized strings (that is, strings which uniquely identify a sequence of characters, making a comparison of two atomized strings as fast as comparing two numbers) shouldn’t reside in a data structures (ds) directory. However, the code to compute the hash of the string (a single number that summarizes a string’s contents, hopefully uniquely but possibly non-uniquely) must simultaneously decode the string, and that code should be in xpcom/string with all other string decoding code.

In response to this state of relative disarray, I’ve filed bug 497204 to reorganize and consolidate Mozilla’s string code, with the primary goal of getting it all in one location (so that even if you’re unfamiliar with it, you at least know all the code you might need to read) and with the secondary goal of organizing it in a clearer and simpler fashion (to make the consolidated code easier to read). We may still end up making mistakes in how we handle string encoding and decoding even with that work complete, but those mistakes will be easier to find, diagnose, and completely fix.

Write more automated tests, and make it possible to include them in security fixes

Second, we need to move as much testing like this out of human hands and into “computer hands” as possible. One reason we introduced a regression was that we relied on fallible human testing to varying degrees throughout this whole process. I relied on some informal testing of my original patch in deeming it complete; the regression fix did likewise as manual QA testing verified the problem had been fixed on trunk and then later discovered the bug not to be fixed in 3.0.x releases (after the unnecessary backport). Yet I didn’t uncover my omission, and QA didn’t notice the backport caused the branch regression rather than fixed it. Some amount of manual testing, formalized through QA or otherwise through masses of nightly testers, is both desirable and unavoidable. Most of the time, however, we are much better off with automated tests that can be run with much less effort, on a much shorter time scale, with much greater rigor, and with much less chance of mistakes in their execution.

Now, to be fair, automated tests have less value here than in many other case. I included automated tests in my original patch, but they only addressed the bug at hand and not the regression (else that regression would never have occurred). It’s true that the followup would have been helped by an automated test, because when it was ported to branch it would have failed, and the backport would have been reverted pending further investigation. (Whether this investigation would have led to discovering bug 439206 to be a trunk-only regression is unclear, but it certainly seems plausible.) Here, however, we encounter the large problem that we currently can’t include automated tests in security bug fixes because we don’t want to tip our hands before a release with the fix is available. (In cases such as this one this worry is perhaps more paranoid than well-founded, but in many other cases where a testcase is half a step from a full exploit it’s vital; mrbkap can elaborate on this at length.) The testcase is often committed after the release, particularly when the problem is memory corruption in ways that appear difficult to control (the apparent case here), but by that time the damage has already been done.

Automated tests are not a panacea, as my original fix shows. Nevertheless, consistent use of them here would have at least eliminated the 3.0.11 regression if not the trunk regression. For this to happen we must have security bugs include automated tests that run, essentially, as soon as the fix lands. The solution that I believe best meets this need as I envision it consists of one separate, private Mecurial repository per actively maintained release to which security bug tests may be committed. Access to these repositories would be strictly limited to developers with access to security bugs plus accounts for use by tinderboxen. We would then add additional steps to the build process on those tinderboxen to pull and run the security tests, reporting either PASS or FAIL for the lot of them. Detailed information would not be publicly displayed but would be available in some unspecified manner to developers who cause security bug tests to fail. Then, as security bugs are fixed, we would require two-phase commits for security bugs: first the fix to the public repository, then the test to the restricted repository. As failures would turn the main tinderbox orange, this ensures regressions get attention between the initial commit to the security repository and their eventual migration to the main repository — early enough to make the difference in cases like this. Another plus: I believe this would dovetail nicely with work in bug 383136 to make it possible to run tests against prepackaged builds.

There may be a different solution which meets the needs I specify here; I’m less concerned about the process than about results. However, I haven’t heard another proposal that I believe would work well enough.

Manual testing: actually, I don’t know what the lesson is here

Third, we have manual testing, imperfect but still necessary to some degree. I don’t know what the lesson for QA and manual testing is. Sure, they could be more diligent about checking that a bug exists pre-commit and is fixed post-commit, but in isolation every such action is reasonable. Is the decrease in available time worth the benefit of potentially catching a problem like here every so often? I don’t know the exact processes they follow these days or how they otherwise spend their time, so I really can’t evaluate this. I’ll let QA consider this situation and decide how to adjust, because I’m certainly not qualified to do so.

Conclusion

The particular bugs at issue here are now fixed, so for the moment we’re back to steady state. As explained above, however, it’s possible that further errors might happen for the same basic reasons unless we make an effort to eliminate those reasons, and we still have work to do to fix the root problems. I have hope that this article may spur improvements in processes that will make mistakes like this much harder to make, but it will take more than just me to make these changes happen. In the meantime, to Firefox 3.0.11 users, enjoy the gift of an unintended Acid3 point; it came at a much higher cost than we’d have been willing to pay if we had known the full story and never made either 3.0.x backport.

« NewerOlder »