I rode 50 miles with Steve this morning. The ride put me over the 4,000 mile mark for the year.
I discovered an ISP that allows DNS changes through a simple web form. To ensure changes are made by authorized personnel, they only accept changes from the Administrative Contact listed in the WHOIS records for the target domain.
Talk about a gaping security hole. Just find a domain with DNS hosted by this particular ISP, use the results of a WHOIS query to get the necessary credentials, and hijack the domain. Doing it from a public terminal at 5:30 PM on a Friday should minimize the chance of being noticed before the change is complete.
I discovered this flaw at work this week when I was asked to submit DNS changes for a client that moved their physical location necessitating an switch to a different ISP.
We had a technician on-site, but he had his hands full with the hard work: wiring, bring up systems, etc.
Initially, I submitted the changes using my own name and e-mail address,
explaining in the
special instructions box who I was, how they could
verify the authenticity of my request, and why it wasn't practical to
submit from the Administrative Contact's e-mail address: the mail server
was setting at the new location, on one of the new ISP's IP addresses,
which couldn't be reached by name until these very DNS changes were
The reply to my first submission:
For security reasons, we will only accept DNS requests from the administrative contact (WHOIS Lookup) of the domain name.
After hours of tail chasing with the ISP's support department (mortals are not allowed to talk to the DNS team directly), and rather frustrated, I just filled out the web form with the unreachable contact information. An hour later, the DNS changes were active.
No e-mail messages requesting a reply to authorize or a link to their website to verify the authenticity of the request was sent. The web page just generates an e-mail to the DNS team and a copy back to the submitter. The fact that the courtesy copy is undeliverable is overlooked.
The following morning, I got a call from the ISP with the account
manager and a supervisor on the phone. They were ready to conference a
member of the DNS team on the phone get the DNS changes I needed made.
Already done, I told them. "I walked through a gaping security hole
in your system and the DNS team happily made the changes for me."
I explained the situation. Hopefully they will fix the hole. I'd hate to see our client or any one else have their domain hijacked due to such stupid security.
Leave me voice-mail, lose my vote
This is my first, and probably only, political blog entry. I detest politics. This election year I've received dozens of automated calls with political messages. I don't want them. But as far as I know, there's no easy way to block them. So, I'm protesting as effectively as possible.
If you leave me an automated voice mail message, you'll lose my vote. If I receive messages from all the candidates in a particular race, I will use the write-in option to avoid voting for any of them.
Rest assured, I've heard your messages, they have changed my position, and I'll vote accordingly Tuesday.
Strange web searches
Some time ago I wrote a small perl script I call
googled. It lists the search terms used to find my weblog
by analyzing the Apache log files. The strangest search to date:
My weblog happened to have several of these words in different entries. Obviously, the user didn’t find what she was looking for here. Curious, I did some web searching to see if I could discover the target of her search. All I discovered is that a Skinny Mary and a Blue Banana are both drinks. Having looked at the ingredients, I suppose if consumed together in a body may indeed be found.
The Curious Incident of the Dog in the Night-Time
The other day, while chasing the answer to some question I don't recall, I ran across a weblog entry by DJ Adams.
DJ is the author of Programming Jabber which has a prominent place on the bookshelf behind my computer desk. So, when I read his comments about a book he was reading, I went right out and picked up a copy at the local Barnes and Noble.
If I ever author a book, I'd love for someone to say about it what DJ said about The Curious Incident of the Dog in the Night-Time:
The writing is simple. Straightforward. It reflects the exact, black and white reasoning of this autistic child. Sad and funny at the same time. And as I read each sentence, I feel that a lot of work has gone into every one of them. Exactly the right words, the right number, and the right punctuation. It's almost as if the words on the page, at a level above the story, tell a story themselves.
Mount St. Helens meets Linux
The Mount St. Helens VolcanoCam is a webcam located at the Johnston Ridge Observatory. The online image is updated approximately every 5 minutes. With recent volcanic activity, I started checking the VolcanoCam image periodically.
Not having time, patience, or inclination to watch it for the hours on end that would be required to see an eruption which could occur at any time, I ran a small script to begin grabbing the image every 5 minutes.
Actually, to call it a script is an overstatement. I simply started a screen session and entered on the command line:
while true; do wget \ http://www.fs.fed.us/gpnf/volcanocams/msh/images/mshvolcanocam.jpg;\ sleep 300; done
Originally, I intended to simply let wget run
screen session for the day and view the images when I returned
home. But it's been running continuously since Monday, October 4th,
when I started it.
Frustrated with my inability to view the images in a reasonable way, I decided to try to create an MPEG movie with them so I could quickly scan the day's images for interesting events and single step the frames when I found one.
It took a bit of research to discover the tool I needed was
which is part of the netpbm package of
graphics software. It took a bit longer to learn how to use it. The
result has been MPEG files for each day starting with Monday, October 4,
each about 2MB. I'm using the EXHAUSTIVE search algorithms for best
compression, so it takes about 7 minutes to create each MPEG file on my
2GHz P4 system.
I've used the contact form on the VolcanoCam to request permission to share the MPEG files I've created since I don't own the images used to create them. No response, yet. If they grant permission, I'll find a way to get the MPEGs posted on provide links to them.
This little project demonstrates one of the many reasons I love Linux. The tools I needed for this simple, personal use project were readily available and the only cost was the time and effort required to learn them.
I'm really pleased with my fitness as the cycling season draws to an end. Jenny and I have been continuing our rides after work, but we've had to shorten them to accommodate the fleeting sunlight. Even so, we've been finishing in the dark.
Our standard, short ride has become a 20 mile out-and-back trip from Mirabeau Point to the Idaho/Washington state-line I-90 rest stop on the Centennial Trail. One evening, we averaged 20.0 MPH. We were thrilled with that, having averaged 19.9 a couple of times earlier in the year, just missing that magical 20 MPH threshold. A couple of evenings later, we bettered it with a 20.2 MPH average.
Then, Friday night, we rode a significantly faster 21.5 MPH average.
Those speeds won't win us any time trials, but for a couple who's youngest child will be 21 next month, we're thrilled with them. It's Jenny's first year on a road bike. I can't put into words the feeling I get when, after pedaling for all I'm worth through a difficult section, I glance over my shoulder and see Jenny right there on my wheel, all smiles.
I think I have to credit my recent jump in fitness to the Sunday rides with Joe, Steve, Andy, and the others who have participated. Chasing Joe up the hills and trying to stay with him when he cranks it up on the flats has certainly ratcheted up my performance level.
I received a followup message from Jim indicating the problem may be solved. He got some cooperation from his Sheriff's department and the owner of the truck got a visit from a detective.
Hopefully, the thug takes the detective's advice and ceases endangering cyclists. I'm curious to know whether he does or not. There's always the chance he'll be vengeful and even more dangerous—let's hope not.
Since the pepper spray incident several people have asked questions and offered suggestions about how to respond to hostile motorists. The suggestions have ranged from giving up cycling to packing firearms. None, at least at those extremes, has any appeal for me.
First, let me say such events are rare. I've ridden over 3600 miles on the bike this year, most of it on roads shared with motorists, and haven't had any more altercations. There have been a few motorists that just haven't known how to handle themselves near a bicycle. They misjudge my speed and turn right across my path when they shouldn't, or attempt to pass me 20 yards before a stop sign leaving themselves straddling the center line at the intersection. But I expect such incidents and haven't suffered anything more than minor frustration from them.
The truly hostile motorists are, fortunately, few and far between.
So, what to do about them.
I bought a small handlebar bag and carry a digital camera. About half the time, when I've been the target of some hostile act by a motorist, I've caught up to them an the next light or two. If I had a camera on those occasions, I could have gotten a picture of the car, recording the license plate, and even a shot of the driver and occupants.
Sometimes those incidents happen too fast. There's nothing to do but maneuver the bike—no time to get a license plate number or respond in any way. That would be the same whether I was packing a weapon or using any of the other methods suggested.
The camera hasn't been tested under fire, yet. I've gotten a few nice pictures with the camera along, but mostly it has just gone along for the ride. If and when I use it to get a picture of a hostile motorist, it will be interesting to see if the resulting police report gets any more action than the prior reports (none of which have resulted in so much as a return phone call).
Ideally, I'd love to have a small helmet mounted camera that records to a light weight but very durable digital recording device. I'm thinking something along the lines of an iPod. It doesn't even need a great deal of storage. Just run it in an endless loop and save the last 90 seconds (or some other configurable interval) when a button is pressed.
That way, when an incident occurs, you've got it recorded. You've likely got the incident itself, the vehicle with license plate, perhaps the driver and occupants, and other vehicles whose drivers may have witnessed the incident. When the dust settles, press the button and upload it to your computer, later. A nice, 90 second video clip of the whole incident would make a handy attachment to a police report!
Does such a device exist? I know the small, helmet mounted cameras do, and I've even seen helmet cam video clips on the web taken by mountain bikers bombing down their favorite trails. But from what I can tell, they've used expensive digital camcorders that are too expensive, too fragile, and too bulky for the task I have in mind. I'd like something that fits comfortable in a jersey pocket and can withstand the weather and sweat its likely to encounter on long hard rides.
If anyone knows of such a device, I'd love to hear about it!
Nice ride, nasty fall
Several weeks ago, I learned that some riders were meeting at the local bike shop Sunday mornings for a group ride. I've joined them most Sundays since. They've been interesting rides.
This morning, I rode with Joe and Steve. Both are training for the Coeur d'Alene Ironman next June. The first time Steve joined us on a Sunday ride, I didn't recognize him, initially. Half way through the ride, I discovered we knew each other. He lived just around the corner from us for 5 or 6 years before moving out of the neighborhood. Our kids were good friends is Junior High and High School.
Today, we rode from the bike shop, Wheelsport, on Sullivan Road south on Highway 27 to the Palouse Highway, west to Valley-Chapel Road. Valley-Chapel Road is one of my favorite rides. It runs along a beautiful section of the Hangman Valley. There's little weekend traffic and the road is smooth and well maintained.
The route features a challenging climb from the Hangman Valley up on to the Palouse. The views from the high wheat fields are fantastic. There is an old chapel and cemetery on the route just west of the small community of Mt. Hope.
Steve's wife, Pam, had a food booth at the Farm Chicks' Antique show in Fairfield. We planned to drop by on our ride and say hello. I knew the that if we continued east past the cemetery and through Mt. Hope, we'd hit Highway 27 again about 6 miles north of Fairfield. Not familiar with other roads in the area we didn't know for certain, but suspected a turn south at the cemetery would likely lead us to Fairfield.
It did, but it was a longer than expected, hilly detour. We rode almost into Waverly at the southern most point of the route and a looped back north into Fairfield.
We were rewarded for our effort with some of Pam's famous baked goods. The chocolate treats fulled our ride back home but caused my stomach to churn in rhythm with my legs for awhile.
For much of the ride back north on Highway 27 we shared the work at the front with Joe doing 80% of the work and Steve and I helping where we could. (Joe is an incredibly strong, talented rider. Attempting to keep up with him on these Sunday morning rides has really improved my fitness. They are real workouts for me.)
Just north of Mica with maybe 6 or 8 miles of riding left, Steve got his front wheel overlapped with Joe's back wheel. I was at the back and luckily saw the trouble from the start and was able to get clear. Steve was in the aero bars and couldn't get to his brakes in time. He bumped Joe's back wheel 3 times before hitting the pavement and sliding off into the dirt.
Joe almost went down. That last bump knocked his back wheel sideways and he went skidding off the shoulder into the dirt but avoided a fall. I went clear to the left and managed to stay out of the fray.
Steve was scraped up—elbows, knees, hands, shoulder, and hip. But he wasn't badly damaged—no deep lacerations or broken bones. He was more embarrassed than hurt. Steve is an excellent athlete. He's been running with a passion since 1997 and competes frequently in marathons. But cycling is new. Riding in a pace-line has its dangers and Steve learned one of them today. I'm sure he'll be quite sore for a week, but at least no one was badly injured.
If not for Steve's fall, it would have been a near perfect ride. We covered 70 very hilly miles in 3 hours 40 minutes. I was quite pleased with that. I was suffering and holding the group back a bit near Waverly and Fairfield, but Pam's treats gave me the energy to finish strong. On the way out, I had my best time of the year up the grade on Highway 27—under 6 minutes. Overall, I think it was one of my strongest performances of the year. I'm hoping for more good riding weather in the weeks to come and more rides like this one, minus the crash.
Yesterday, on my ride to work I was surprised to see a huge cow enter the street just ahead of me. It made it's entry from behind a business on Sprague Avenue and McDonald Road and went trotting up McDonald at a good clip, detouring briefly to trample sprinkler heads and lawn ornaments before heading east down Main.
As I passed Main I could see the cow headed into the sun flinging streams of snot left and right as its head bobbed and blowing clouds of steam.
The cow was really moving and looked mighty unhappy. I didn't want to get too close being quite vulnerable on my open-air, two-wheeled vehicle. But a block later, realizing I had a digital camera in the handlebar bag, I made a U-turn and went back in search of the runaway.
I missed the photo op, though. The beast had disappeared.
Shortly after I arrived at work, Jenny called. She wondered if I'd seen
a cow on my way to work.
Sure did! I told her. She'd gone to Buzzy's
(a drive-thru espresso stand) for her
tall-hot-skinny-single-white-coffee-mocha (sounds like a personal ad,
eh?). There were cops everywhere, she said. One went racing through the
Buzzy's parking lot while she waited in line. The girl that waited on
her told her they were trying to capture an escaped cow.
This morning, there was an article in the Spokesman Review (subscription required) about it.
Apparently, a butcher shot the cow but didn't kill it. Police finally brought it down but not before they shot it several times. It changed officers and a police car, and I'm sure it frightened a fair number of school kids waiting for busses and walking to school.
You really never know what sights to expect when traveling on two wheels.
Tour Des Lacs
The weather forecast for the week leading up to the event was dismal. We were dreading the prospect of rain both days. We were lucky, though. It was cold both mornings, and the road was wet for the first 40 miles or so on Saturday, but it never rained on us. And Sunday we actually got some sun.
I fixed three flat tires on the ride. The first came early in the ride Saturday. I generally climb the hills at my own pace and wait for Jenny at the top. As I was topping a mile long climb, my cell phone gave the message alert tone. Who, I wondered, would be leaving me a voice mail message at 7AM on a Saturday morning?
It was Jenny. "Marc, I have flat tire. Do you think you can come back and help me with it?"
The long stream of riders struggling up the hill must have thought I'd lost my mind when I turned around and headed back to the bottom.
Jenny had company when I arrived. Another lady cyclist had pulled up to
moral support. And a motorcycle was parked behind her with the
emergency flashers on.
Those motorcycles were a frequent and welcomed sight on the tour. Volunteers patrolled the course, directing traffic, assisting cyclists in need, and calling for help when necessary.
All three were looking at the bike. Jenny and the motorcycle rider were fumbling with tire levers. None really knew how to change a flat. So I gave a detailed lesson as I replaced the tube in Jenny's front tire.
About 5 miles later, we rode up on a lady who had removed the front
wheel from her bike and was staring at it with a puzzled expression.
Do you need any help? I asked as we approached.
If you don't mind, she said. "I'll watch closely so I can fix it
myself next time."
She had the exact same bike as Jenny. The only two I've seen. I gave another crash course in roadside tire repair and we were on our way again.
At the first food stop in Rockford, we saw the lady that had lent
moral support to Jenny.
Have you fixed any more flats? she asked.
Yes. In fact, I have. She hadn't expected my reply.
Really!? Yours or your wife's?
I told her the story. A few minutes later she found us again.
she said, "This is my friend! We've been riding together. I was
wondering where she was." She had her arm around the lady whose tire I
What a coincidence. Out of 800 riders, the two we'd met so far were together.
The third flat was my own. On Sunday morning I discovered my rear tire was flat as we were leaving the hotel room. At least that time I had the comfort a chair and a warm room to make the repair.
In another coincidence, we met a couple that had ridden the Spokane
Autumn Century the week before. They happened to be in the
crash I wrote about.
They were following the lady that cried out and crashed right behind me.
Apparently she completely lost control of her bike as she
approached the corner. The woman we met on the TDL said she saw it
unfold in front of her and shouted over her shoulder,
Rider down. Her
partner didn't hear what she'd said. When he finally saw the rider down
it was too late. He slid into his partner, taking them both down, as he
tried to avoid the fallen rider.
Obviously, they weren't badly injured. We met them at the St. Maries food stop about 65 miles into the first day's ride. They were riding well.
Another sight that became familiar on the ride was the Bike Doctor. A gentleman from Wenatchee has a fully equipped bicycle repair business in a trailer he pulls behind his truck. We saw him at just about every food stop and he always seemed busy. We heard other cyclists talking happily about the repairs they'd had done while they waited.
I bought a pair of cleats from him. Jenny and I both had worn cleats, but I didn't replace them until after the ride, anyway. I just wanted to give the Bike Doctor a bit of business in hopes it would help make his weekend profitable. I'd like to see him on rides we do in the future. You never know when you might need a repair.
The ride was a real treat. We covered some back roads we haven't been on in the 13 years we've lived here, saw some great scenery, enjoyed the outdoors, met some fine people, and met a long standing goal—to do the Tour Des Lacs.
Jenny’s first century
Jenny did her fist century (100 miler), yesterday. We rode the Spokane Autumn Century together. The twenty-fifth annual event was organized by the Spokane Bicycle Club with many friendly, helpful volunteers and sponsors.
Every rider received a nice water bottle, seat bag, and coupons for some free, delicious food items. Thanks to the sponsors for the schwag! Among them: Two Wheel Transit, North Division Bicycle, Slick Rock Burrito, and Didier's Yogurt & More. T-shirts were available for an optional fee, which we elected, and we're really happy with them. They are navy blue, long sleeved, polyester, athletic T-shirts with a very nice design on the front commemorating the ride. They are, by far, the best T-shirts we've collected from such rides.
The cool (dare I say cold) drizzily weather for the first half or more of the ride was a challenge. Jenny doesn't tolerate the cold well, so it tested her mental toughness. She prevailed.
In the first few miles, the route descended a reasonably steep, winding
road to the Spokane River. The road was rain slick. A woman ahead of
me was braking hard to slow for a sharp right turn. I, in turn, had to
brake hard to avoid overtaking her. As I was braking, I was thinking,
Damn. Braking any harder would put me in a slide.
Just then, behind me, I heard a woman gasp then hit the pavement. More sounds of a crash followed. I pulled to the side and stopped forty or fifty yards down the road. Looking back, I could see riders piled up on the outside of the turn. Oncoming traffic had stopped and other cyclists were swarming around the downed riders, one of which was holding her head and either writhing in pain or trying to curl up and make her self a smaller target for any more riders headed her way.
There were a few anxious moments before I saw Jenny round the corner safely. Knowing she wasn't far behind me, I had been concerned she may have gone down in the fray.
Later, at a rest stop, I heard there were three riders involved with no serious injuries. Hopefully that is indeed the case and they'll be back on their bikes soon.
I got a wasp or hornet trapped in my helmet about the twenty mile mark. He had a good time stinging my bald head before I got stopped and released him. Then he made four or five angry dives at Jenny and I before leaving the scene. The little bugger had a bad case of road rage.
There were plenty of rest stops with food and drink. The best at a park in Deer Park—a small community north of Spokane. The route took us by that stop, twice. First, just before the half way point, then again sixteen miles before the finish.
At the first Deer Park stop, we were cold and tired. The only warmth we had was generated by the constant movement, especially the hill climbs. Stopped at the park, the heat quickly drained from us and getting back on the bikes was a challenge. The next few miles were tough.
Eventually, the rain stopped and we even got a bit of sun.
About the eighty mile mark, Jenny reached a point of near exhaustion. We stopped and she consumed a packet of GU she'd purchased last week at REI. That seemed to do the trick. Within the next few miles she'd regained her stamina and we continued to Deer Park for the final rest stop.
We had seen the same half-dozen riders at nearly every rest stop. We would pass them, they would pass us, but inevitably, we'd all end up an the rest stops together. On the final stretch from Deer Park back to Spokane, we saw them all, again. As we climbed some of the hills leading back to Spokane, we passed a couple of them. They passed while we were stopped over the top of one of the hills putting a thrown chain back on Jenny's bike. Then we passed them a final time on the last climb.
There were hot burritos and frozen yogurt waiting at the finish.
Next weekend, we ride the Tour Des Lacs, a two-day event. The first day we'll ride 85 miles with a cumulative elevation gain of 3500 feet that takes us around the south side of Lake Coeur d'Alene and into the city of Coeur d'Alene for the night. The next day is a 73 mile rolling route back to Spokane.
The forecast is for some of the same, cool, wet weather. Hopefully the weather will change for the better. We'd really like to ride in more pleasant conditions. But we'll take what we can get.
The Ironman USA Coeur d'Alene triathlon is tomorrow and Jenny will be there, not as a competitor, but as a volunteer. Her job? Applying sunscreen to the athletes as the transition from the swim to the bicycle.
Some need a reason to ride
For some of us, the ride is all the motivation we need. For others, it helps to have a goal—a target. A chocolate covered banana at the Rocky Mountain Chocolate Factory in Post Falls, Idaho kept Jenny focused and motivated for the first 13 miles of our ride, yesterday.
What the heck is a Tyrolean Traverse?
My youngest brother, Brent, is a climbing Ranger for the National Park Service stationed at the North rim of the Black Canyon of the Gunnison. One of the projects he worked on recently, upgrading the Chasm Tyrolean, was written up at climbing.com.
What the heck is a Tyrolean, you ask? So did I. And I'm still not sure I understand. <g>
Way to go, Brent!
Hey, Lady, how about a little help here
Yesterday, Jenny and I rode from the house to the Idaho/Washington state line and back. At the I-90 rest stop, our turn around point, there was a pigeon sitting in the drinking fountain waiting to coerce some human into turning on the water so it could have a drink and a quick shower. Jenny obliged.
One of the pleasures of cycling is getting close to a lot of the wild life that otherwise goes unnoticed. This encounter doesn’t exactly fall into that category, though. Not too many wild critters are this comfortable around people. I’m not sure this bird qualifies as wildlife.
To the son of a bitch that unloaded a can of pepper spray in my face,
You’ve committed a felony. I’ve filed a report—case number 04-142710 with the Spokane County Sheriff’s Department. You probably regularly travel the same route at about the same time of day and there’s a good chance I’ll find you, identify you, and see you face charges in court.
It’s not your road. A bicycle is a legal, street worthy vehicle. On my bike, I have the same rights and responsibilities as a motorist, and I follow the same rules. There’s no sign on the road that says, “No Bicycles.” Unfortunately, there’s no sign that says, “No Assholes,” either, so I have to share the road with dangerous felons like you.
That is, until you’re caught, have your driving privileges revoked, and spend some time in county lockup.
So, you detest bicycles on the road so much you’re willing to use force to remove them, huh? Would you have shot me dead if you’d had a gun? Would you have run me over if you weren’t afraid of scratching your paint job?
Pricks like you eventually run into a situation that puts them on the losing side. Whether I find you and have my day in court or not, somewhere, sometime, you’ll end up on the receiving end of your stupidity and cowardice. Good luck when it’s your turn at bat.
I had just left the office to meet Jenny on the Centennial Trail. The traffic was unusually light on Pines for rush hour. Not a car in sight in the south bound lanes between Broadway and Mission. And only a single car northbound. When it passed, I made a left and quickly up to speed—25 MPH with a nice tailwind.
About a block down the road, a car honked, passed, and turned in short intimidatingly. The jerk, I thought, he had the entire left lane open but couldn’t be bothered to change lanes for a bike. We’ll end up sitting at the same stop light together, anyway. Which we did.
He pulled to the extreme left side of the right lane when he stopped at the light at Mission—an obvious invitation to pull along side.
Here we go, I thought. Another “get on the sidewalk where you belong” speech. I’ve had dozens of them spewed at me over the years. When I pull alongside, he rolls down his window half way and starts hurling a string of obscenities at me. I return a few of my own. Then he shouts again to get my attention. When I look at him, I see a stream of pepper spray much too late to avoid it.
My sunglasses spared me a direct blast in the eyes, but my face and forearms were covered. The driver stepped on the gas and made a tire squealing right turn onto Mission. I turned to see a woman driving a Subaru behind me. I shouted, “Get that guy’s plate number,” and motioned for her to follow. She was probably confused and didn’t understand what had happened or what I said. She did turn right, but several cars from the oncoming left turn lane had turned between my attacker and her. As far as I know, she never got his plate number.
It’s hard to recall details. I think the guy was in his thirties. He had an olive complexion, perhaps of middle eastern heritage. And I think he was well dressed. The most surprising thing was he had a car seat in the back and I’m almost certain there was a child in it. What would this guy do if he splashed pepper spray on the kid? Was it worth that?
I’ve been yelled at, spit on, had things thrown at me, had car doors thrown open in front of me and brakes slammed on. I’ve been run off the road and I’ve been run over. Now I can add a new one to the list: I’ve been pepper sprayed.
99.9% of the drivers out there are friendly and courteous. It’s that one in a thousand that just wrecks your day. This guy cost me some real discomfort, a pair of contacts, an emergency room visit that will probably take $200 out of my pocket. But he isn’t going to scare me off the road. I have a right to ride the roads and I’m going to exercise it. Someday, one of these assholes is going to pull this crap in full view of a police officer and get hauled in. Or I’m going to find a way to drag one of them out of his car and have him ready him waiting for the authorities. Or, heaven forbid, I’ll finally meet one who doesn’t mind scratching his vehicle up and takes me off the road permanently. But dammit! I’m not going willingly.
Jenny runs Bloomsday
Jenny ran Bloomsday again this year. My good friend, Tim Maher, and I rode our bikes from the Spokane Valley across town to the top of Doomsday Hill to watch for her.
She topped the hill all smiles, looking great. She’d been suffering from a strained tendon below her right knee. The doctor told her she better not run Bloomsday this year. Jenny thinks doctors should provide remedies, not advice, so she didn’t take any.
Racking up miles on the road less travelled
We just returned from another trip to Colorado. Dad’s shop is loaded to the gills with tools, books, electronics equipment, surveying instruments, and tons (literally) of his possessions. Mom needs the space cleared so she can rent the shop out. That means separating items we want to haul back to Spokane, some to keep and some to dispose of on eBay, items for a local auction, and the rest to the landfill.
Dad passed away six months ago. It was our first trip back since his funeral. Mom was happy to see us and had plenty for us to do around her apartment: fixing blinds, hanging mirrors and pictures, and such. Truth be told, I think having our company and helping with the minor tasks were much more important to her than cleaning out the shop. So that job never got done. We barely made a dent in it. Which means another trip, soon.
I had a miserable cold that hit me as soon as we arrived in Grand Junction and stayed with me until the day we left. That dampened my enthusiasm for the shop cleaning project, otherwise I might have pushed harder to get the job done while we were there.
Still, it was a wonderful trip with a long list of highlights.
On the way, we spent a night with my best friend from high school, Vince Baiamonte, and his wife, Barbara, in Rexburg, Idaho. We had a great time catching up, sharing dinner and breakfast the next morning, and refreshing some nearly forgotten memories.
Bob Somrak took us out to dinner at Zack’s Barbecue in Hotchkiss. We had a good visit. Bob has added many new pictures to his website. When we got back to Grand Junction, I set up a link on Mom’s computer for her. She and Jenny spent an hour browsing the site and trying to decide on their favorite photos.
We stayed at the Bross Hotel in my home town of Paonia, Colorado one night. The historic Bross Hotel, built in 1906, has been restored as a Bed and Breakfast. It was a run down, low rent, eye sore when I was growing up in Paonia. Now it is a marvelous piece of living history. And breakfast was fantastic. Linda served, among other things, Baked French Toast. It had a flavor and texture that reminded me of a really good bread pudding and was topped with a pecan sauce like a sticky bun.
On the return trip, we spent a night with Russell and Sueli Durtschi. Russell and I worked together at Computerland of Orem for several years in the 1980s. We spent a summer mountain biking together, including a trip to the top of Mount Timpanogos! The Durtschis have some wonderful kids, Rafael and Melissa. Rafael was a first class gentleman. Melissa, 9, reminded me of April at that age—a perfect angel.
The following morning, Russell lead us on a bike ride he called The Tour of Opulence. He lives in Spanish Fork, so we started there and rode to Hobble Creek Canyon and back hugging the base of the mountains. Folks with more money than God have erected some truly amazing monuments to ego along that route.
The normal route home is simply east on I-70, north on I-15, and west on I-90—endless hours of interstate broken only by the relatively short stretch of non-interstate between Green River and Spanish Fork, Utah. We departed from the normal rout and took a road less travelled when we reached Dillon, Montana. It was richly rewarding. From Dillon, we backtracked a couple of miles and took 278 west, then north to Missoula on US 93. Along the way, we stopped for an hour at Bannock State Park and wandered through the old abandoned buildings, visualizing life over 130 years ago.
We stopped for a picnic lunch at the Big Hole National Battlefield—such a beautiful, quiet place. It is difficult to imagine the violence that occurred there and eerie to stand that historic ground.
In addition to the bighorn sheep, we saw elk, deer, antelope, coyotes and several large crane or stork like birds. The birds were in the fields along I-15 in northern Idaho. I’ll have to do some research to see if I can discover what they were. If you know, drop me a note.
It was a great trip, and I’m actually looking forward to the next one. It will only take a couple more to put Jenny’s white, 1997 Honda Accord Wagon with the two bikes on top over the 200,000 mile mark.
Deli and Pizza Express
Our lunch plan was to go to a deli we’ve been regulars at since we moved to Spokane. We were going to take sandwiches to the park and enjoy a nice Spring day. The Deli and Pizza Express has been a regular part of our summer routine for years.
Tom always greets us as we walk in and starts making my favorite sandwich without asking—he knows what I’ll order: a Deli Avocado with Turkey. It’s not on the menu. It’s nice to have a place like that where the people know you and you feel you’re among friends. How are the kids doing? Has Jenny gotten you to cut down that tree in the back yard, yet, or are you still winning that battle?
The deli was all locked up. The equipment, signs, and furnishings were gone. We were just in there a week or two ago. No indication from Tom that it was coming to an end. We’ll miss Tom and the deli.
Paramedics were loading him on a stretcher while continuing CPR when we happened on the scene. He was an older gentleman, ashen gray and lifeless. A passer-by had apparently found him lying there in the trail just east of Barker Road. Jenny teared up as they wheeled the gurney past us—she thought she recognized him.
Perhaps we’ll see a note in the paper or hear a news bite to let us know what happened and whether or not he survived. But it didn’t look hopeful. The paramedics seemed matter-of-fact going about their business. There didn’t seem to be the urgency you would expect when there is hope for a life hanging in the balance.
They wheeled his bicycle up the trail after the ambulance departed.
I assume it was his last ride.
Jenny will be searching faces on the trail this summer hoping it wasn’t the friendly older man she remembers from last year. They always waved and smiled at each other.
Still toying with Fibonacci numbers
Yesterday, I said I needed to stop this silliness with Fibonacci numbers. But I still remain intrigued.
Knott’s page, which I referenced yesterday, includes some
information about the relationship between Fibonacci numbers and the
(sqrt(5)+1)/2, or 1.61803
I found the perl module Math::Fibonacci which uses this relationship to calculate the n-th Fibonacci number using the fast algorithm:
F(n) = ~ g^n/sqrt(5)
g is the golden ratio and
“take the nearest integer.”
I experimented a bit with that algorithm and it is quite useful for Fibonacci values that can be expressed within the precision of native floats. To get beyond the limitations of native floats, I used Math::BigFloat. Unfortunately, it took much longer to get results than just using the trivial expansion with Math::BigInt, and those results were not exact.
Then I found Math::Big
which has a
fibonacci function. In scalar mode, it uses a
very fast divide-and-conquer algorithm based on the formula:
F(n+m) = Fm * Fn+1 + Fm-1 * Fn
Using Math::Big::fibonacci, I can calculate the 10,000-th Fibonacci number in 0.37 seconds with this command line:
perl -MMath::Big -e 'print 0+Math::Big::fibonacci($ARGV),"\n"' 10000
It takes about 2.5 seconds to get the same result with the trivial expansion using the code I posted yesterday.
Counting Fibonacci numbers
The latest incarnation prints the n-th Fibonacci number where n is passed as an argument. Here, n is 1000:
perl -MMath::BigInt -e '$b=new Math::BigInt 1;($a,$b)=($b,$a+$b)while--$ARGV;print"$b\n"' 1000
This morning I got up early and read a section in GEB while the house was quiet and the sun was coming up. To test understanding, Hofstadter listed several items, some well formed, some not. As an answer key, he wrote, “Those whose numbers are Fibonacci numbers are not well formed.”
On a sheet of paper I wrote the Fibonacci sequence far enough to check the answers. Then, just to exercise tired brain cells, I started adding as fast as I could to extend the sequence.
I had about 80 numbers written when I grew weary of the exercise. But staring at the page of digits, I couldn’t rest without knowing if and where I had made any errors.
So, I headed down to the computer and wrote a couple of perl one-liners.
I love Perl, and I especially enjoy writing little one-liners I can execute from the command line without having to create a source file. My first attempt looked like this:
perl -e '@f=(1,1);print$f[@f]=$f[-1]+$f[-2],"\n"while@f<80'
That resulted in the last few terms printing in scientific notation,
e.g., 2.34167283484677e+16. I wanted the full integer representation.
The final version prints the term number and the full integer
representation using the the Math::BigInt
module. It also takes the number of terms as an argument and the
command line shown pipes the output to
less for easy
perl -MMath::BigInt -e '$one=Math::BigInt->new(1); @f=($one,$one); print@f+1,": ",$f[@f]=$f[-1]+$f[-2], "\n"while@f<$ARGV' 80|less
Bob Somrak’s photos
Bob Somrak has started a website featuring his photography. Bob and my father graduated from the Colorado School of Mines together. Dad had gone back to school when I was in grade school and graduated when I was about 10 years old. After he graduated, we moved to Paonia, Colorado, Bob's home town.
Bob is partly responsible for my interest in mathematics and computers. He stopped by the house often during my junior high and high school years. He and Dad included me in some fascinating discussions that motivated me to learn more.
Dad was a very private person and chose his friends carefully. Bob was at the top of a short list of people Dad truly loved and considered close friends.
Enjoy Bob's pictures. He lives in some truly beautiful country I sorely miss.
I’ve been reading Gödel, Escher, Bach (GEB). It is a book I’ve owned for many years. At least once before, I made an attempt to read it. It is not, however, a quick, easy read. There’s a certain amount of determination required. After having GEB on my bedside reading table for many months, occasionally thumbing through it reading random sections and admiring the Escher drawings, I’ve begun a front-to-back read in earnest.
One of the many gems I’ve discovered so far is Hofstadter’s Law:
It always takes longer than you expect, even when you take into account Hofstadter’s Law.
Anyone in software development is intimately familiar with Hofstadter’s Law whether they know it by that name or not.
Jonathan Lundquist and I coined our own version of Hofstadter’s Law in an even tighter loop than Hofstadter’s. In fact, it addresses why things take longer. Let’s call it Marc and Jon’s Law:
Everything is harder than it is.
CV Spring Craft Show
Jenny had a booth at the CV Spring Craft Show this weekend. It was a real disappointment for her. Worked 14 hour days for a couple of weeks making some really cute items for the show, but nothing sold.
If you’re interested in a cute, meticulously painted, hand crafted Easter-egg holder, e-mail me. She’s selling them for $35, each. Click the image above for a better view.
Mom’s music preservation project
Mom sent me about 35 stereo cassette tapes of her favorite music. The tapes are aging. She asked me to transfer the music to CDs so she can listen to her music on her new CD player.
I bought a decent stereo cassette deck on eBay for
about $15. At my local Radio Shack, I picked up a cable to connect the
RCA output to my sound card. I've been using a
snd to record each tape to
a WAV file. Then I use
snd to extract each song into a separate file.
to burn CDs with a track for each song.
Her new CD player is supposed to play MP3 files. So, I've been using lame to encode MP3 files for each track. When I've finished creating normal, audio CDs, I'll create a couple of CDs for her with the MP3s files. They may prove to be more manageable.
Jenny has a new bike
Looks like a nice sunny day. We had snow yesterday. If it warms up into the 40s, we'll go for a bike ride today.
Jenny got a new bike last weekend—something we've been planning since last summer. We took the bike, a Specialized Dolce Elite, out for a test ride last weekend. The ride was great, the fit was great, and Jenny came home with a new bike.
Now, she'll get to do her turns up front—no excuses.<g>
One Bad Bit
I spent 9 hours this week helping a Windows user recover from a nasty crash. And it's not done, yet. Windows XP Pro, Microsoft Office, and another critical application have been reinstalled, Windows and Office updates applied, and user data restored. There are still many applications to reinstall and configure and a lot of clean up to do.
Sadly, the system would quite likely have been completely recoverable if I had been able to toggle just one bad bit. In the worst case, one disk sector was corrupted, so it could have been more than a single bit, but I like to think it was just one. An entire Windows system defeated by one bad bit.
Last Thursday, the user noticed that the system was responding very, very sluggishly. She did what all Windows users do when they're having system troubles–she rebooted.
On reboot, the system blue screened. The error message was displayed so briefly, it couldn't be read. Then the system rebooted itself. This cycle repeated until the computer was powered off.
I was called to help. When I fired up the machine, it entered the same reboot loop. It exhibited the same symptoms attempting to boot to Safe Mode and Safe Mode With Command Prompt. I was only able to successfully gain access to the machine by booting to the Recovery Console using the Windows XP Pro installation CD.
The user had forgotten the Administrator password, so to even boot into Recovery Console, I had to first reset the Administrator password. I did that with Petter Nordahl-Hagen's Offline NT Password & Registry Editor.
Recovery Console includes a pathetically weak set of tools for performing system recovery.
When I was unable to locate the source of the problem, we decided to pay Microsoft $35 for support. After attempting the initial, obvious solutions, the Microsoft tech suggested restoring the registry to an earlier version.
First, we renamed the registry hives (system, security, sam, and default) in the C:\Windows\System32\Config folder. Then we copied backups from C:\Windows\Repair to the Config folder. There was trouble, though. No backup copy of the System hive existed. And even if it had, the other hives were 11 months old. Restoring such an outdated registry would have been nearly as painful, perhaps more painful, than completely reinstalling Windows.
The support tech indicated the only option left was reinstalling Windows.
Of course, that means not only reinstalling the OS–it means reinstalling all the application software as well.
I didn't want to give up the fight just yet. So, I used the current System registry hive and backup copies of the other hives. That gave me a bootable system! But there were, not surprisingly, many problems. I did verify that the application data was intact. And that gave the user some hope.
Obviously, the problem was in the registry. So, I tried putting each of the current registry hives back in play, one at a time, to see which one was bad. That's when I discovered the real problem. The Software hive, the largest of them all, had a CRC error. It could not be read or edited.
The best I was able to do was:
type software.old > software.new
That got me a 14MB file before failing with a CRC error. The original file was 18MB.
Attempting to run with the truncated software registry hive failed. No surprise there. More disconcerting was the fact that I could not boot the system into recovery console any longer!
I was able to remedy that situation by using Petter's Offline NT Password Boot Disk (mentioned earlier) to boot, do the necessary copies and renames to get a working registry again.
In the end, I reinstalled Windows.
The registry is the Achilles' Heel of Windows systems. It is an endless source of trouble. It grows and collects cruft until it collapses in failure. It makes migrating from one system to another nearly impossible. It makes backing up or migrating a single application with its user and state data nearly impossible.
Yes, it makes some interesting things possible, but in my opinion, it was a disastrous design error. I'll happily stick with Linux for my own use.
I signed up for Vonage Voice Over IP (VoIP) telephone service. The Vonage service allows you to make and receive telephone calls using your normal phone over the Internet. It can supplement or completely replace your telco service.
Yesterday I received my Vonage installation kit including a Motorola VT1000 Voice Terminal. How does it work? Too good. I've always had a hum on my phones at home. With my Qwest telco service, the hum seemed to get filtered out. With the VT1000 digitizing the signal, the hum comes through on the other end crystal clear. I'll have to track down exactly where the hum is coming from and eliminate it.
Contrary to the installation instructions, I connected the VT1000 behind my Linux firewall. Absolutely no setup was required that way. I connected the VT100 WAN port to my home LAN. The VT1000 acquired an IP address from my DHCP sever and established a connection with Vonage.
I did need to configure the firewall to forward outbound UDP packets to destination ports 5060-5061, 69, and 10000-20000 as indicated in Vonage Installation Guide, Appendix B. In addition, I discovered the VT1000 was attempting to connect to external time servers on UDP port 37. I opened the port on the firewall but also provided the service internally and added an appropriate DHCP option for it. I haven't checked yet to see if it is polling my own, internal time server based on that change or if it is still polling an external time server.
When I get time, I'll have to establish a connection to the VT1000's LAN port and explore the configuration options. Perhaps I can specify a time server there.
I'm thrilled with the features and functionality of the Vonage service. It worked great from inside the firewall at the office and from my home network. Voice mail is substantially better than on my Qwest line.
I will be replacing my Qwest service with Vonage, porting my old number over, saving $30 per month and getting some great new features. I will find e-mail notification of voice-mail messages particularly useful. Right now, I have the notifications sent to my cell phone. I intend to set up an e-mail address that can distribute the messages to my cell phone and/or Jenny's based on the number of the caller.
I'm sure I'll have more to share when I've had more time to play.
Vonage has a Refer-A-Friend Program. I don't intend to spam all my family and friends with referrals. If, however, you decide to use Vonage, definitely use the referral program. It gets you and the referrer a free month. If you'd like a referral from me, just drop me an e-mail requesting one.
I took a few random paths on the Web today and found couple of gems. The first is a neat little article about using LPD to play music.
Following the instructions, I had it working in minutes. This would be be a lot of fun in an office or group setting where everyone could queue up a few of their favorites songs for all to listen to.
I found a link from Jeff Duntemann's ContraPositive Diary to the Linksys Blue Box Router HOWTO by Eric Raymond. I've always liked the Linksys devices but hadn't realized some run Linux and play so well in a Linux environment.
I may consider replacing my Linux firewall box with a Linksys Blue Box soon. I subscribed to Vonage and I'm anxiously awaiting the arrival of the analog phone adapter (probably a Motorola VT1000v ). I'll be using the Linux Advanced Routing and Traffic Control HOTWO to figure out how to ensure quality voice connections without dropped packets or delays. I intend to install the analog adapter behind my firewall.
If a Linksys Blue Box can do a better job of routing my VoIP traffic I'll happily replace my 400Mhz Celoron based firewall. I can recycle it as my annual Windows tax machine.
At home, I use Windows just once a year. The only piece of software I find I still need Windows to run is TurboTax. I have an old 200 MHz system with Windows. Once a year, I fire it up, headless, with just a keyboard (and only then because it refuses to boot without one). Then I access it via RealVNC from my Debian GNU/Linux desktop. I would happily use one of the online tax preparation services except I need to prepare several returns: mine, one for each of the kids (3), and this year I'll probably be preparing one for my mother. Having my own software is more cost effective.
I love all my free, open source software. However, I would happily pay for a good quality tax preparation package to run on Linux. It would certainly be nice to see TurboTax for Linux!
I've been doing a bit of bio-tech experimentation recently. No—not
bio-weapons development (at least I hope not!). I read an interesting
article in the January/February issue of
Adventure Cyclist. According to The
Cyclists' Kitchen column, titled
Winter Weight Gain:
A growing body of evidence indicates that consuming calcium-rich dairy foods three to four times a day equals burning about one hundred more calories of body fat per day—or about ten pounds of fat per year.
Of course, you can't add the dairy products to your diet—you have to replace existing calories with the dairy products. Yogurt is recommended.
I love yogurt. Dad went on a diet years ago and lost an incredible amount of weight. One of his primary foods was yogurt. He made it himself.
So, armed with some motivation go give it a try, I did a bit of Internet research. There's plenty of information. The first hit on Google was an article at Doing Freedom, a site where you can learn not only how to make yogurt, but how to make an RPG.
I simplified the recipe. I bought several small, reusable plastic containers that hold just over a cup and a couple quart sized containers. I sterilize the containers and utensils, bring one-gallon of two-percent milk just to boiling. Then I remove it from the heat, cool it quickly in a water bath to 110 degrees. I stir in three or four table spoons of yogurt saved from the last batch, then pour it into the containers.
The first time I made yogurt, I didn't trust the oven to keep the 100 to 110 degree temperature required, so I used a picnic cooler and surrounded the yogurt containers with bottles of hot water. It worked great! I've since used the oven and found the old beast does keep the temperature I need.
This site is the personal weblog of Marc Mims. You can contact Marc
by sending e-mail to:
Marc writes here about cycling, programming, Linux, and other items of personal interest.
This site is syndicated with RSS.
CSS stolen from Tom Coates who didn't even complain.