Command-Line Utility to Create BlogEngine.NET Password Hashes

I ran into an interesting predicament the other day, and I thought that both the situation and my solution were worth sharing. Here's the scenario: I host websites for several family members and friends, and one of my family member's uses BlogEngine.NET for her blog. (As you may have seen in my previous blogs, I'm a big fan of BlogEngine.NET.) In any event, she forgot her password, so I logged into the admin section of her website, only to discover that there was no way for me to reset her password – I could only reset my password. Since it's my webserver, I have access to the physical files, so I decided to write a simple utility that can create the requisite SHA256/BASE64 password hashes that BlogEngine.NET uses, and then I can manually update the Users.xml file with new password hashes as I create them.

With that in mind, here is the code for the command-line utility:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace BlogEnginePasswordHash
{
  class Program
  {
    static void Main(string[] args)
    {
      // Verify that a single argument was passed to the application...
      if (args.Length != 1)
      {
        // ...if not, reply with generic help message.
        Console.WriteLine("\nUSAGE: BlogEnginePasswordHash <password>\n");
      }
      // ...otherwise...
      else
      {
        // Retrieve a sequence of bytes for the password argument.
        var passwordBytes = Encoding.UTF8.GetBytes(args[0]);
        // Retrieve a SHA256 object.
        using (HashAlgorithm sha256 = new SHA256Managed())
        {
          // Hash the password.
          sha256.TransformFinalBlock(passwordBytes, 0, passwordBytes.Length);
          // Convert the hashed password to a Base64 string.
          string passwordHash = Convert.ToBase64String(sha256.Hash);
          // Display the password and it's hash.
          Console.WriteLine("\nPassword: {0}\nHash: {1}\n", args[0], passwordHash);
        }
      }
    }
  }
}

That code snippet should be pretty self-explanatory; the application takes a single argument, which is the password to hash. Once you enter a password and hit enter, the password and it's respective hash will be displayed.

Here are a few examples:

C:\>BlogEnginePasswordHash.exe "This is my password"

Password: This is my password
Hash: 6tV+IGzvN4gaQ0vmCWNHSQ0UQ0WgW4+ThJuhpXR6Z3c=

C:\>BlogEnginePasswordHash.exe Password1

Password: Password1
Hash: GVE/3J2k+3KkoF62aRdUjTyQ/5TVQZ4fI2PuqJ3+4d0=

C:\>BlogEnginePasswordHash.exe Password2

Password: Password2
Hash: G+AiJ1Cq84iauVtdWTuhLk/xBGR0cC1rR3n0tScwWyM=

C:\>

Once you have created password hashes, you can paste those into the Users.xml file for your website:

<Users>
  <User>
    <UserName>Alice</UserName>
    <Password>GVE/3J2k+3KkoF62aRdUjTyQ/5TVQZ4fI2PuqJ3+4d0=</Password>
    <Email>alice@fabrikam.com</Email>
    <LastLoginTime>2015-01-31 01:52:00</LastLoginTime>
  </User>
  <User>
    <UserName>Bob</UserName>
    <Password>G+AiJ1Cq84iauVtdWTuhLk/xBGR0cC1rR3n0tScwWyM=</Password>
    <Email>bob@fabrikam.com</Email>
    <LastLoginTime>2015-01-31 01:53:00</LastLoginTime>
  </User>
</Users>

That's all there is to do. Pretty simple stuff.


Note: This blog was originally posted at http://blogs.msdn.com/robert_mcmurray/

Code Monkey Save World

OK - I have to make a shameless admission: I really like Jonathan Coulton's music. Jonathan's style is sort of like modern-day-Internet-geek-cyber-folk-pop, as if that's a real genre.

Anyway, years ago he wrote a song called "Code Monkey," which became something of an Internet hit. (Hey, I'd call over one million downloads a hit.) If you're curious about the song, you can browse to http://youtu.be/MNl3fTods9c in order to see it with the lyrics.

Code_monkey

That being said, fans of "Code Monkey" might not be aware that Jonathan teamed up with Greg Pak and a few additional artists, and together they converted "Code Monkey" and several of Jonathan's other songs (like "Skullcrusher Mountain," "Re: Your Brains," etc.) into a weird little graphic novel.

codemonkey

Truth be told, I'm not a graphic novel kind of guy, but I love the song - so I ordered a copy through Greg Pak's online shop.

My signed copy of the graphic novel just arrived, and it was a great read; it was fun to see the characters from so many of Jonathan's songs brought to life, even if it was just for a hundred pages or so.

EPSON MFP image

For those of you who are familiar with the song, you're probably wondering to yourself, "Does Code Monkey finally tell his manager to write that @#$% login page himself and win the heart of Matilde, the girl of his dreams?"

Well, you'll just have to order the book and find that out for yourself.


(FYI - The graphic novel was a Kickstarter project in 2013 which was fully-funded in just 12 hours; it eventually reached $340,270 of it's original $39,000 goal.)

Anti-Vaxxers are Idiots

Warning: I will be a little more... um, blunt.. than usual in this blog. I make no apologies, because this is a very serious topic.

Someone I know posted the following article to Facebook with the caption, "When you don't vaccinate your kids, you contribute to this:"

Disneyland Measles Outbreak Hits 59 Cases And Counting

But what was the most-troubling about his post was an anti-vaxxer who responded to it; this anti-vaxxer was suggesting that: 1) measles isn't a deadly disease, 2) it can be treated by homeopathic herbs and essential oils, 3) contracting the disease will build natural immunities, and 4) we should be more concerned about the amount of sugar in our food than the measles. Unfortunately, this person was being serious. Adding insult to injury, when she was corrected with information from the World Health Organization (WHO) which pointed out that hundreds of thousands of people die each year from the measles, this anti-vaxxer changed her story and claimed that since only 145,700 people died from the measles in 2013, that's only 0.000024% of the world's 6 billion people, so measles isn't that big of a deal. This anti-vaxxer was completely blind to the fact that we were discussing 145,700 people who didn't need to die because the cause of their deaths was easily-preventable. In other words, what she really meant was - since the people who are dying from the measles aren't people that she knows personally, their lives obviously don't matter.

Before I continue, I need to state that I passionately agree with my friend's original statement: if you do not vaccinate your kids, you are contributing to potentially lethal outbreaks. Let me put this another way, and let me be very clear as to how I feel about vaccinations: if you are part of the current crowd of crazy people who oppose vaccinations for easily-preventable diseases - you are an idiot. Period. End-of-story. And if you are a parent who refuses to vaccinate your children, and your children contract an easily-preventable disease - you are a terrible, wicked, stupid, horrible, despicable person. Child Protective Services should take your children away from you because you are endangering your children, and you are obviously too inept to be a parent.

Let me dispel some of the anti-vaxxer's arguments with actual facts about the measles from the WHO at http://www.who.int/mediacentre/factsheets/fs286/en/, (note that the added emphasis is mine):

Key facts

  • Measles is one of the leading causes of death among young children even though a safe and cost-effective vaccine is available.
  • In 2013, there were 145,700 measles deaths globally - about 400 deaths every day or 16 deaths every hour.
  • Measles vaccination resulted in a 75% drop in measles deaths between 2000 and 2013 worldwide.
  • In 2013, about 84% of the world's children received one dose of measles vaccine by their first birthday through routine health services - up from 73% in 2000.
  • During 2000-2013, measles vaccination prevented an estimated 15.6 million deaths making measles vaccine one of the best buys in public health.

Measles is a highly contagious, serious disease caused by a virus. In 1980, before widespread vaccination, measles caused an estimated 2.6 million deaths each year.

The disease remains one of the leading causes of death among young children globally, despite the availability of a safe and effective vaccine. Approximately 145,700 people died from measles in 2013 - mostly children under the age of 5.

Measles is caused by a virus in the paramyxovirus family and it is normally passed through direct contact and through the air. The virus infects the mucous membranes, then spreads throughout the body. Measles is a human disease and is not known to occur in animals.

Accelerated immunization activities have had a major impact on reducing measles deaths. During 2000-2013, measles vaccination prevented an estimated 15.6 million deaths. Global measles deaths have decreased by 75% from an estimated 544 200 in 2000 to 145 700 in 2013.

Let me reiterate some of those facts: immunizations have reduced the number of deaths by 95% in just the past 35 years (from 2,600,000 fatalities to 145,700 fatalities). When we discuss childhood immunizations for diseases like the measles, we are not discussing whether your child will stay home from school for a couple of days with a temperature - we are talking about preventing your child's death. Your child could die because of your parental incompetence, and all it takes is a simple vaccine to remove the possibility.

This anti-vaxxer also suggested that natural medicine was sufficient for the measles, which is a ludicrous proposal; if natural medicine was sufficient, then we would not have had millions of people dying each year throughout the history of humanity. I have met several people in my life who have grown up under the mistaken premise that centuries of naturalistic alchemy was more effective than present-day medicine. I would love to point out that for the thousands of years that homo-sapiens have walked the face of the planet, the life-expectancy of the average human was ½ or ¼ of what it is now. During that time, thousands of pseudo-doctors prescribed any number of naturally-based remedies, yet the majority of people could still expect to die before the age of 30 or 40, and millions upon millions of children died before they left infancy due to disease. In contrast, modern medical science has introduced thousands of real cures based on real science which have produced real results in terms of preventing disease and improving the quality of life. Natural medicine may make your feel better about yourself in an isolated, narrow-minded, yuppie universe, but a host of readily-available facts tell a decidedly different story: science actually works, whereas visiting a modern-day witch doctor does not.

I grew up in a time where contracting a large number of easily-contractible diseases was still a frightening fact of life, when millions of lives were seriously impacted by global diseases like measles, polio, etc. In the decades that preceded my childhood, a plethora of deadly diseases ravaged our society; diseases like smallpox, cholera, diphtheria, typhoid, etc. Times are vastly different now; in today's United States we are blessed with a society where decades of successful vaccination programs have reduced these diseases to the point where apathy and complacency have set in, and as a result we are forced to endure the idiocy of anti-vaxxers who think that vaccines are no longer necessary.

However, vaccines are still just as necessary as they were in the past. An essential part of our country's life-blood is immigration; millions of new immigrants settle within our borders each year, and most of these people are coming from countries which have no regular vaccination program. If your unvaccinated children go to school with children who have inadvertently brought diseases to the United States - your child will likely become infected. And as our world becomes increasingly more global, your child's chances of travelling outside the United States increases, and immunizations are necessary to prevent overseas exposure to diseases that we no longer worry about domestically. For example, thanks to a successful vaccination program, the United States hasn't seen a case of polio since 1979; however, when I was in India a few years ago, I met someone whose brother was recently paralyzed by polio.

If there was no measles vaccine and people were still dying to the left and to the right, people like this anti-vaxxer and everyone like her would be clamoring for a measles vaccine. You might recall the recent Ebola panic; suddenly everyone was screaming for a vaccine. I am completely confident that science will eventually come up with a vaccine for Ebola, and I am just as certain that 100 years after its debut the world will have anti-vaxxers who think that they just need to apply a homeopathic salve until they build up their immunity to Ebola. (There should be a special category in the Darwin Awards for anti-vaxxers.) Just because we don't see a specific disease in our day-to-day lives, that doesn't mean that it isn't a threat to the rest of the world.

I understand that some parents were unnecessarily frightened by a popular myth that was floating around which suggested that the MMR (Measles/Mumps/Rubella) vaccine could cause autism. That theory has long-since been debunked, but a few ill-educated people are unwilling to let it go. However, even if the infinitesimally-small chance of autism was remotely true, the theoretical number of people actually affected by the risk of autism would still be staggeringly-less than the number of lives that are actually saved by vaccinations. Penn and Teller put together a presentation which beautifully illustrates this point (Warning: Foul Language):

I have wasted enough time and effort on this subject, so I will leave you with a final parting thought: vaccinations have a proven track record of saving lives. If you are an anti-vaxxer, I do not care which stupid theory you are adhering to - you are just wrong. If you believe that natural medicine is the cure for everything - you are just wrong. Or if you believe that vaccines were designed by evil pharmaceutical companies to get rich - you are just wrong. Or if you believe that the side-effects from vaccines are worse than the disease - you are just wrong.

The simple fact is - vaccines save millions of lives each year. If you are too foolish to be immunized, perhaps you are doing the world a favor if you die from an easily-preventable disease and your genes are removed from the global gene pool so humanity can evolve past your demonstrably-lower level of intelligence. However, if you are a parent and you refuse to immunize your children, I will state once more - for the record - that you are a terrible, wicked, stupid, horrible, despicable person.


Updates:

Since the time that I published this blog, several relevant articles have been published on this topic, so I have decided to periodically update this blog with pointers to articles that I think will add to this discussion.

And even though this subject isn't funny, there are a few humorous posts on the subject:

However, I noticed over the years that a few of the links might have changed or disappeared, so I have replaced several of the URLs with links to the Internet Archive to preserve the original citations.

Ride Notes for January 17, 2015

Once again, I was a weather wimp today. The nice folks at Sabino Cycles had organized an 8am ride for the Northeast side of town, (even going downhill on Freeman Road!). That being said, I looked at the weather forecast last night and saw that the temperature was going to be around 45 degrees at that time, but if I waited a few hours the temperature would be in the 70s. With that in mind, I didn't bother to set my alarm last night and I woke up sometime around 8:30am. Kathleen and I had a bunch of various chores to do around the house, and I wanted to do a small bit of bicycling maintenance before I hit the road, so I made plans to head out sometime in the afternoon.

2015-01-17

After taking care of our assorted domestic activities around the house, I managed to get on the road shortly before 3pm. My plan was to ride around Pistol Hill Loop, which is decent metric half-century ride (50K or 31 miles). The weather was gorgeous – 65 degrees, blue skies, and nary a cloud in sight. The first four miles of the ride were fairly routine – it's the same path that I take whether I'm riding to Saguaro National Park or the Pistol Hill Loop.

As I hit the bottom of Jeremy Wash and rode past the Rincon Valley Market, I had been riding for almost a half-hour, and I could tell that my pace felt just slightly behind normal. (Looking at my ride statistics later in the day showed that I was 1.5 minutes behind my normal pace for the 15-mile loop from the Rincon Valley Market around the Pistol Hill Loop and back. Hmm… I can tell when I'm going to be a minute off for a whole hour?) With that in mind, I decided that I should hit some of my energy snacks. I usually use the Gu gels, but Kathleen had picked up some of the Gu Chomps energy chews for me, which are somewhat like Gummi Bears:

gu-chews

They were pretty good, but eating something solid like an energy chew while riding uphill is a little more difficult than ingesting a gel; I had to be extra careful not to inhale something by accident while I rode (and thereby I avoided choking to death).

There's not much to say about my ride around the Pistol Hill Loop; it's much easier for me than it used to be, but that doesn't mean that it still doesn't suck. Nevertheless, I saw lots of other cyclists on the road, and we all waved cordially to each other as we passed on opposite sides of the road.

I had been riding for 1.5 hours by the time I completed my way around the loop past the Rincon Valley Market and started my way up the steep hills on the north side of Jeremy Wash. The next few miles were pretty much all uphill, and I could really feel the impact of not having ridden earlier in the week. (By way of explanation, I was slammed at work this week, so I was forced to skip my normal Tuesday and Thursday rides.)

Needless to say, I was pretty tired by the time that I was approaching Saguaro National Park. And even though it wasn't on my original plan, I decided to turn into the park and add its 8-mile loop to my ride. (Although the whole time my brain was screaming, "I don't want to do this! I don't want to do this!")

Unfortunately I entered the park behind a very slow-moving vehicle that wanted to negotiate all of the initial hills around 5mph, and the road was too narrow so there was no way for me to pass. I was really frustrated by this predicament – not just because I was forced to ride 20 mph slower than normal, but also because it meant that I couldn't pick up any speed during my descents to use when ascending the next hill. After an extremely slow first mile or so, I was finally able to pass the slowpoke, who never pulled to the side of the road despite clearly seeing me in their driver-side mirror. (Grr.) Needless to say, this really hurt my ride time around the park.

On the straightaway between the 2nd and 3rd miles, I was hitting my energy snacks again as another cyclist passed by me. That probably wouldn't have happened on a normal day, but I was riding a few mph slower at that precise moment while I was consuming a few more Gu chews. Once I was done, I resumed my normal pace, and I stayed a couple of hundred yards behind the other cyclist for the next mile or so as we approached the steepest part of the climb up Riparian Ridge.

As we both climbed the ridge for the next half-mile or so, I was steadily gaining on the other cyclist, but he crested each hill before me (since he was a hundred yards ahead of me by this point), and he took better advantage of his descents to widen the gap between us. (You may remember from previous blogs that my overwhelming Fear of Mortality on a bicycle kicks in around the 30 mph mark, and the other guy obviously does not suffer from a similar sense of fear.)

Anyway, the gap between us grew to a sufficient-enough distance that I would not be able to catch up, but I tried my best to keep a decent pace for the rest of the ride through the park and all the way home. I arrived at our house right around 5:30pm, with just a tenth of a mile under 40-miles for the total distance. That's not too bad for my only ride this week.

Ride Stats:

  • Primary Statistics:
    • Start Time: 2:57pm
    • Distance: 39.9 miles
    • Duration: 2:33:18
    • Calories Burned: 1708 kcal
    • Altitude Gain: 1808 feet
  • Speed:
    • Average Speed: 15.6 mph
    • Peak Speed: 31.2 mph
    • Average Cadence: 77.0 rpm
  • Temperature:
    • Average: 63.7 F
    • Minimum: 59.0 F
    • Maximum: 66.2 F
  • Heart Rate:
    • Average: 158 bpm
    • Maximum: 174 bpm

Losing My Father-in-Law to Alzheimer's Disease

I seldom talk about this, but it was on this day three years ago that our family lost my father-in-law, Terry Wetmore, to Alzheimer's Disease. My father-in-law was truly a second father to me; after my wife and I were married, Terry quickly became one of my closest friends. No matter the situation, the two of us would trade jokes back and forth - perhaps a little too often - and often to the chagrin of everyone else around us. Terry was a successful businessman in his younger days, and in his latter years Terry and my mother-in-law were part of a clown ministry that performed around the world.

Terry-and-Bob

The first indication of Terry's battle with Alzheimer's Disease was forgetfulness, and as his symptoms gradually progressed over several years, we found ourselves trying to help him process his fears and frustrations as he fully realized what was happening to him. I cannot imagine how terrifying that must have been for Terry, and it was extremely painful to watch his slow descent from a successful and self-determined businessman and loving grandfather into a growing fog of confusion.

As the months slipped by, Terry became progressively disorientated; for example, on more than one occasion he would plead with me to take him home, and I would have to gently remind him that he was already there. Eventually he could do little more than sit and stare at the world around him with an empty gaze from eyes that could not process his surrounding environment. One of the worst parts about Alzheimer's Disease is that each day passes and you are gradually robbed of your loved ones in spirit, even though you still have them physically.

I have a cousin who is living through similar circumstances, and during one of our conversations I mentioned that I am certainly no expert on how someone should go through this type of situation with a loved one. But I told her that I learned to appreciate the good days that we had near the end, and one particular event came to mind. My wife and I were visiting with my in-laws at a time when Terry's existence was rarely more than sitting in his favorite chair and watching television during his conscious hours. My mother-in-law invited my dad over to join us for dinner, and as the five of us relaxed around the dinner table, Terry miraculously emerged from his usual lethargy and became fully-engaged in the conversation. Terry was behaving more like his old self - he was joking with everyone, he was firing back at my dad's ubiquitous one-liners, and he was referring to me by an old nickname which he had fashioned for me during all the years that we had known each other.

This was a wonderful moment in time; but it was all-too-brief, and sadly it was the last of its kind. Terry's return to normalcy lasted for just that evening, and even though the weeks ahead had periodic episodes of lucidity, we soon had to put my father-in-law in a nursing home because his day-to-day needs were too much for my mother-in-law to take care of on her own. Terry's health declined rapidly over the next several months, and he passed away within the year.

IMG_0092

There is hardly a day that goes by where I do not think about how much I miss Terry. Brief moments like the dinner that I described were unexpected blessings, and they are wonderful memories that I will treasure for the rest of my days. Events like that are the way that I choose to remember Terry's latter years, and I am so thankful that I have a lifetime's worth of deeply-cherished reminiscences of him from our younger years.

Ride Notes for January 10, 2015

Today was a fairly easy ride, although I had planned to ride more. The folks from Sabino Cycles had a ride scheduled for 8am this morning, but I had stayed up way too late the night before and decided against going out that early. I got up around 9am, but I had a lot of household work items to do, and as you may recall from earlier blog posts I needed to change out my flat tire.

I tried an experiment for my new inner tube: I bought a Slime Smart Tube, which is touted as a "self-healing tube," meaning that it contains a compound that should automatically plug small holes when they occur. (And Arizona is a state with no shortage of sharp, pointy things that try to kill your tires.) Reviews for Slime tubes are mixed, but I have known some people who love them. I knew that they would weigh more than a normal tube, so I decided to weigh a tube before installing it on my bicycle. A normal tube that I use weighed 84 grams (2.96 ounces), whereas the Slime tube weighed 176 grams (6.21 ounces). That shouldn't be enough of a difference to weigh me down all that much; and it's much better than a solid tube.

2015-01-10

After finishing some routine maintenance on my bicycle, I was able to get on the road shortly after 4pm. I made good time to Saguaro National Park, where I got into a conversation about Fat Bikes with another cyclist who was leaving the park and one of the Park Rangers. I had been researching that style of bike earlier in the week, so I was able to discuss the merits of owning one. (I'm still not sure if I would get one, though.)

There were a few cars in the park, but for the most part the traffic wasn't too bad. I felt like I was making good time for the entire ride, and I completed the full distance from my house through Saguaro National Park and home again in a few seconds over an hour, so I was incredibly close to my one-hour goal. That being said, my time around the park loop was a little over two minutes slower than my best time, so had I completed the loop around the park a little closer to my 30-minute goal for that course, I would have beat my one-hour goal for the total distance.

There's always next time.

Ride Stats:

  • Primary Statistics:
    • Start Time: 4:14am
    • Distance: 16.8 miles
    • Duration: 1:00:16
    • Calories Burned: 745 kcal
    • Altitude Gain: 3173 feet
  • Speed:
    • Average Speed: 16.7 mph
    • Peak Speed: 32.3 mph
    • Average Cadence: 71.0 rpm
  • Temperature:
    • Average: 58.0 F
    • Minimum: 55.4 F
    • Maximum: 69.8 F
  • Heart Rate:
    • Average: 162 bpm
    • Maximum: 175 bpm

Ride Notes for January 7th, 2015

Well, today's ride didn't start as planned, and as a result, the rest of the ride didn't go as planned, either. If you read my last blog post, you would remember that my rear tire was flat from the other day. I had a spare inner tube, so I budgeted time to replace the tube before heading out for a ride. It took a while to remove the old tube, and after I had the new tube in place, I started to pump up the new tire. I had barely got the air pressure up to 40 PSI when the tube exploded – quite loudly. (It really scared our puppy who was resting nearby.)

This left me with two options: 1) ride my hybrid bicycle, or 2) don't ride. The second option was totally undesirable, so I decided to ride my hybrid. I hadn't ridden that bicycle to Saguaro National Park in a few months, so I was slightly curious how badly that would impact my ride. (Not too much, as it turns out.)

2015-01-07

My cadence meter is mounted on my road bike, so I wasn't able to track my cadence; that meant that I simply judged my speed based on miles-per-hour. There were a couple of other things that impacted my ride time: 1) my hybrid is about 15 pounds heavier than my road bike, and 2) the pedals on my hybrid bike are not configured for cleats, so I lost a great deal of pedaling power. Nevertheless, I completed the whole ride around four minutes slower than normal.

There isn't much else to say about the ride; my attempts at repairing my flat tire meant that I left home later than I intended, so the sun was setting as completed my loop around Saguaro National Park. With that in mind, I was extremely happy that I had re-attached my good riding light to my hybrid.

Ride Stats:

  • Primary Statistics:
    • Start Time: 4:44pm
    • Distance: 16.9 miles
    • Duration: 1:06:39
    • Calories Burned: 727 kcal
    • Altitude Gain: 823 feet
  • Speed:
    • Average Speed: 15.2 mph
    • Peak Speed: 31.4 mph
    • Average Cadence: n/a
  • Temperature:
    • Average: 63.9 F
    • Minimum: 60.8 F
    • Maximum: 71.6 F
  • Heart Rate:
    • Average: 160 bpm
    • Maximum: 177 bpm

Ride Notes for January 4th, 2015

It has been a couple of weeks since my last ride; I had been out of town, and then we had a spate of really, really cold weather. (Below freezing at night, and in the low-40s during the day.) With all of these factors in mind, I hadn't ridden in a while. Sunday isn't my normal day, but I decided that I really needed to get back on the bike.

2015-01-04

The temperature was pretty good considering the time of year; the rest of the country is embroiled in the throes of winter storms, and I was treated to sunny, 60-degree riding weather. (Times like this remind me of why I like Arizona.)

For the most part the ride was going well; my pace was around normal, and what little traffic was driving around the loop was easily passed. That being said, I had a couple of little mishaps as I was exiting the park: 1) I was pulled over by the park rangers, and 2) my bicycle got a flat tire.

Here's the story:

As everyone completes the loop, there is a posted stop sign for both cars and bicycles, although I usually treat it as yield sign. My reasoning is simple: I can easily see when there are no cars in the area, so I'm well-aware when there are no safety issues, and it's easier to ride through the stop sign rather than come to a complete stop. (Plus I'm riding for time.) But today I saw a park vehicle near the end of the loop with flashing lights, and as I rode by it, one of the park rangers gestured for me to stop. He asked if I had come to a complete stop at the sign. I replied honestly and said that I had not, so he mentioned that they were writing tickets for cyclists who weren't stopping. He took my driver's license and called that in, and we continued to talk. He explained why they were giving tickets, which was to increase safety near the park entrance, and I explained that I usually treat it as a yield sign. (I'm an honest guy, even when faced with a possible ticket.) For some reason the ranger decided to let me go with a verbal warning, but after he had done so, we got into a discussion about our respective military careers. We chatted for ten minutes or so, and then we both needed to head off to our respective destinations.

As I got back on my bicycle, I had ridden perhaps 100 yards or so when I noticed that the ride was quite bumpy. By the time I had ridden another 100 yards I realized that my rear tire was completely flat. I hopped off the bike, and I tried to call Kathleen. She didn't answer her phone, so I walked my bicycle back to the shack near the park entrance where I re-inflated my rear tire with my pump. I climbed back on the bike and started to ride toward home, but I barely made it 100 yards before the tire was flat again. At that point, my only choice was to try and call Kathleen again. This time she answered, and we arranged for her to come pick me up.

In the end, I lost a little over four miles for today's ride because of the flat. Just the same, I was very glad that Kathleen was available to pick me up. If this had been a weekday and she was working… I would have had a long walk home.

Ride Stats:

  • Primary Statistics:
    • Start Time: 3:32pm
    • Distance: 12.6 miles
    • Duration: 0:50:45
    • Calories Burned: 595 kcal
    • Altitude Gain: 819 feet
  • Speed:
    • Average Speed: 14.9 mph
    • Peak Speed: 31.4 mph
    • Average Cadence: 72.0 rpm
  • Temperature:
    • Average: 60.1 F
    • Minimum: 59.0 F
    • Maximum: 62.6 F
  • Heart Rate:
    • Average: 165 bpm
    • Maximum: 176 bpm