Monday, March 12, 2012

Cold weather cycling

Rode a 200k permanent yesterday ending up with 127 miles. My new Sigma 1609 cyclecomputer worked out really well. I like the temperature feature and the big readout. It was cold when I started - about 50F.

While 50F isn't very cold it got me thinking about the times I've cycled in snow and freezing rain. Cold weather isn't a problem if you know how to deal with it. The best way to deal with it is to know ahead of time what the predicted highs and lows are along your route. Arm warmers and leg warmers are your first defence as the weather cools - they are light and don't take up much room. As the temps drop closer to 50F you will need to add a wind shell which is also very light and rolls up into your jersey pocket when you need it. I have Pearl Izumi arm and leg warmers and a Pace wind shell (15 years old - best value ever).

When the temperature continues to drop you might need to add a vest which layers well with the shell. As your fingers get cold you can add long fingered gloves but I prefer to use silk ski undergloves. Mine came from Campmor and are so thin they fit under my cycling gloves. You also need to consider replacing the wind shell with a heavier jacket like the Performance Century II jacket. You'll notice I'm staying away from the high-end jackets - I find they tend to be too warm and I sweat too much with them.

At some point I will replace the undergloves with lightly insulated full-fingered gloves and replace my cycling socks with neoprene socks. Mine are 1.5mm thick but if you have room in your shoes you can go up to 2mm. Many people have booties that go over their shoes to protect their toes.

Below 35F I'll also add a neck/head warmer from Buff which is very flexible and about the correct weight for exercising. I also own cycling tights and long sleeve jerseys which I can add at a pinch but they are bulky and I only use them if I know it will need them for the entire ride. At this point I might take my Carradice bag so I have somewhere to stow all this gear if it's too much.

I also bought a Capilene base layer for Iditasport many years ago and I still use it sometimes (but it has to be really cold). I remember putting it on near the top of Mt Baldy while it was snowing during a 200k brevet and I was able to bomb back down to the valley. There were other riders who had to keep their speed way down because they were freezing.

You generate a lot of heat when you ride (remember you burn through 4000 calories every 100 miles). There is a tendency to overdress. If you're comfortable standing around before the ride, you will overheat during the ride.

All the above advice assumes you knew the ride would be cold. I've done a couple of rides where the rain/cold caught me by surprise. You don't have to risk hypothermia.

The first trick is to find a big garbage bag. Ideally you'll find a grocery or hardware store. I've seen a rider take the bag out of a public trash can, empty it into a second trash can, and use the bag. That was disgusting. Tear holes for your head and arms and put it on. It works best if it is between two layers. It will warm you up almost as soon as you start riding.

The second trick is for your hands. Go to a gas station and beg or buy two diesel gloves. They give them to you if you buy diesel fuel. They're just very cheap, generic food handling gloves. Put them on under your cycling gloves and they will quickly warm your hands up when you start riding. If you can find them at the store you bought the garbage bag at, even better.

Both these solutions will end up with you cycling in your personal puddle of sweat but they're cheap and they work. I'd like to thank the Davis Bike club for both these ideas which have saved my bacon more than once.

Tuesday, March 6, 2012

The Spirit of Randonneuring

A new randonneur posted an interesting question on our local group's Google Group recently about a RUSA rule. He was concerned about the rules governing outside help but I interpreted it as a wider question about the spirit of Randonneuring in general.

I'm always surprised to meet cyclists who have never heard of randonneuring. It's a French concept that has taken off around the world and is particularly popular in the USA, UK, and Japan (and, of course, France). It has a very inclusive approach to long-distance cycling especially for those of us who like doing very long rides, at a relaxed pace, and can be self-supporting. It's different from the double-century format in that the rides vary from 200k to 1200k (124mi to 750mi) called brevets, have a minimum speed of 9.5mph, and there is generally little to no support.

The organization is typically French in concept. A group of riders start at a prearranged time and place and follow a specific course to the end at an average pace from 9.5 to 19mph. Although this may seem very slow, you'd be surprised how much time is lost at red lights, stop signs, convenience stores, getting lost, etc. Plus on the longer rides you have to get some sleep in too. There are controls at specific locations to give the riders the opportunity to get fresh supplies and also to prove they are more-or-less on course and not taking any shortcuts. They are rarely manned and rely instead on getting store reciepts or answering a question on the brevet card that could only be answered by being at the specified location.

Although the riders are encouraged to stay on route (and there can be secret controls to ensure they don't cheat), it's not uncommon for riders to slightly modify the route. For example on a 400k I rode recently the official route took a parallel road through Laguna Beach because that stretch of PCH can have heavy traffic. However at the time I went through the traffic was light so I simply stayed on PCH and rode the same distance. With a US mentality I broke the rules, with a French mentality I was simply being sensible.

We also encounted a serious traffic accident near San Pedro. The group I was in was fortunate in that the police allowed us to pass through. A group behind us was not so lucky. They elected to sleep for a couple of hours until the road was open again. I'm sure the RBA (Regional Brevet Administrator) allowed them to get to the controls later than the official cutoff time because of this. They could also have found a detour but even with a GPS system the best alternative route would have added five miles. Again, the RBA would have made allowances. They could also have asked someone to drive them along the detour and drop them at the far side of the accident site where they could have continued riding.

All these would be considered reasonable solutions to an unforseeable problem.

The rules prohibit receiving help from anyone not riding or officiating the ride. But they should be interpreted as saying "don't get your friends to come and take turns pulling you for 100 miles". The rules require you to stay on the designated course, but they should be interpreted as saying that you must not take shortcuts.

Odd how Americans fret so much over interpreting the rules, just like the Brits. As a friend said "The French just shrug as only the French can."

Monday, March 5, 2012

Simi Valley to Solana Beach 400k

This is an account of a 400k brevet hosted by Greg and Lisa Jones of the Pacific Coast Highway Randonners.

On Saturday March 3rd a group of  about 16 riders left Simi Valley Amtrak station at 6am and rode to Filmore, Ventura, Santa Monica, Oceanside, and Solana Beach for a total of 250 miles (400k). I'd ridden this ride once before in 2010. I was riding with my daughter, Amber. We were hoping to finish in about 23 hours to catch the 6:45 train back to Simi Valley.

We started with powerful tailwinds as we headed West, then some climbing and headwinds as we headed to Filmore to the first control. Fortunately we turned around in Filmore and had strong tailwinds all the way to Ventura. From there we pretty much headed South on PCH with more tailwinds. I rode a lot of this section with Debbie and Paul.

Santa Monica beach path would have been a lot more pleasant if we'd had it to ourselves, Constantly dodging people stepping onto it without looking or wandering down the middle oblivious to everyone else got a bit stressful. Both Paul and I got a little frustrated I think. The only time I've ridden this path when it wasn't crowded was about 2am. One bright spot - I passed a young lady jogging in the same direction as me wearing a short black skirt and no underwear. Every step she flashed me. It reminded me of that famous poster of a woman playing tennis in a short white skirt with no underwear. Thank you, whoever you are.

As we exited the beach path I bonked massively. Funny thing is I did the same thing two years ago to at exactly the same place. Paul gave me half a sandwich and I had a little trail mix which got me to the 7/11 at mile 144 which was the next control. Had a tuna fish sandwich and got more gatorade. I was beginning to get sick of gatorade by now.

My energy came back strong and we continued south down PCH through Huntington Beach and made a stop at a Circle K at Newport Beach. At this point my stomach was bothering me as if food wasn't being digested. Then some homeless guy lit a foul smelling cigarette and I found myself utilizing a trash can for an unapproved purpose. My apologies to the guy who empties that trash can next. I think that tuna salad sandwich is the prime suspect. Now I just didn't want to eat or drink. Gatorade was not appealing. All I really wanted was water.

Laguna Beach (mercifully light traffic), through Dana Point, San Clemente (another control but I just didn't want to eat). Amber was getting sleepy so she had an iced coffee and I had a red bull, Interstate 5 for a few miles, then Oceanside where I finally started to think about food again. Fifty miles is a long way to ride without taking any calories in so you can imagine I'm crawling by now.

After Oceanside there's Carlsebad, Leucadia, and Encinitas. The section of PCH through Leucadia is normally one of the more dangerous sections of PCH with lots of parked cars, rough road, no shoulders and aggressive drivers. I was planning on using Vulcan if this stretch didn't feel safe but at 4am there were no issues at all.

Finally I dragged my sorry self into Solana Beach. Our official time was 22:40 which is better than my target. Lisa gave me some ginger ale which did wonders for my stomach. I must remember that trick. We showered and changed and rode back to the Amtrak station one mile up the road. Our butts did not appreciate being lowered back onto our saddles, especially as we had changed into day clothes with no padding. Thank goodness there was a cafe on the train because all of a sudden I was starving, and on the drive back, and when I got home :-)

Thursday, March 1, 2012

If I didn't live at the top of a mountain...

Don't get me wrong, I love living at the top of a mountain in a place most people don't get to see unless they're on vacation. But I work 5,000' lower than I live so commuting to work on my bicycle is not an option for me. Even if the climb home at night didn't give me a heart-attack the road is simply too dangerous to cycle on.

I see no end to the increases in gas prices. If I could cycle to work I would save $2,500 a year in gas. Of course I'd spend an extra $500 on food but I think physically, mentally, spiritually, and economically I'd be better off. Even if I could cycle, though, there's no showers here at work and no secure place to store my bicycle. My daughter works at UCLA Medical Center and they charge employees $11 a day to park. They justify that as an attempt to encourage carpooling and use of alternative transportation.

It's easy to encourage employees to reduce reliance on cars when you're making money from it. But corporations also need to provide positive encouragement too, like hours that match public transport availability, work from home, secure bike storage, showers/changing rooms, etc. I'm just not seeing enough of that part of the equation.

You don't change people's habits with all sticks and no carrots.

Sunday, February 26, 2012

The Carrot on the Stick

Sixty mile loop today down Victoria Ave to the Lucky Greek and back on the SART. It's starting to become one of my favorite local rides partially because of the route and partially because I really like the Lucky Greek. It has a Coke machine with 106 flavors. Seriously - I tried Diet Cherry and Vanilla Dr. Pepper. Amazing. Cold and foggy at the start, then the sun came out and we got a slight headwind near the turnaround. When we came out of the Greek it was nearly 70 and we had a roaring cross/tailwind. Perfect riding.

So how many of you are like me? You ride so you can indulge in a few extra calories. There's two kinds of riders - those that name their rides after the geography (We're riding Opal Canyon), and those who name their rides after the place they're going to eat at (We're doing the Farmer Boy's loop). I'm solidly in the latter camp, in fact if a ride involves geography worth naming I probably don't want to do it. Even if I do have a ride called 'the Back Bay loop' I only ride it because we eat at a fabulous French Cafe. Anyhow, bays are far less threatening than canyons.

So I'm not ashamed to admit I don't ride to conquer hills, I ride to burn calories so can enjoy my food with a little less guilt. The carrot on the stick may be obvious but it works.

Here's to the carrot - may I never lose sight of it.

Saturday, February 25, 2012

Google Maps API part 3 Elevation Profiles

As a big cyclist I live and die by elevation profiles. In part 2 of my Google Maps API blog I showed how to get recommended cycling routes from Google Maps. In this blog I will show how to get the elevation profile for that route and how to display it. We need to display the profile in a new DIV element. To make room for the element we will reduce the height of the map DIV to 80% and display the profile DIV below it. You need to have completed parts 1 and 2 of this tutorial. Find the map_canvas DIV and change the height to 80%. Then add the following HTML below. Do not use the "/>" shortcut because of a bug in IE.
<div id="elevation_chart" style="height:20%; width:100%"></div>

We will get the elevation profile after we have displayed the route. As you might expect by now this will be an asynchronous call. We start by declaring an elevationService object and a chart object to display the elevation profile in. Because the chart object will be bound to the elevation_profile DIV it can't be initialized at this point. Add the following declarations before the initialize function.
var elevationService = new google.maps.ElevationService();
var chart;

Now we need to make the call to the elevationService. We also need to store the total distance of the route. Create a global variable to store the distance by adding the following line above the initialize function.
var totalDistance = 0;

Add the following lines of code after the line "directionsRenderer.setMap(map);" in displaydirections. It tells the elevationService to calculate the elevation at 100 evenly spaced points along the path returned by the directionsService and pass the results to a function called plotElevation. It also stores the route distance to totalDistance.
var elevationOptions = {'path': result.routes[0].overview_path, 'samples': 100};
elevationService.getElevationAlongPath(elevationOptions, plotElevation);
totalDistance = result.routes[0].legs[0].distance.value;

The last thing to do is to write the plotElevation function. We will start off simple and then add more functionality later. We need to populate a datatable, pass it to the chart control, and then render the chart control. To do visualization we need to reference a new library and load a new package. Add the new library by adding the following script tag after the <head> tag.
<script type="text/javascript" src="http://www.google.com/jsapi"></script>

And then load the visualization package by adding the following line before the initialize function.
google.load("visualization", "1", { packages: ["linechart"] });

Now we can write our new function to render the results returned by the elevationService call.
function plotElevation(results, status)
{ if (status == google.maps.ElevationStatus.OK)
  { var data = new google.visualization.DataTable();
    var distance;
    data.addColumn('string', 'Distance');
    data.addColumn('number', 'Elevation');
    for (var i=0; i < results.length; i++)
    { distance = Math.round(totalDistance * i / results.length);
      data.addRow([distance.toString(), results[i].elevation]);
    }
    var chartOptions = {legend:'none',
        titleX:'Distance (m)',
        titleY:'Elevation (m)'};
    var chartDiv = document.getElementById("elevation_chart");
    chart = new google.visualization.LineChart(chartDiv);
    chart.draw(data, chartOptions);
  }
  else
    alert("Plotting elevation" + status);
}

Try selecting a route now. About 10 seconds after the route is displayed you will see the elevation profile charted below the map. It's a bit slow.

Now the most important number for any route is the total climbing ;-) Let's add some javascript to calculate and display the total distance, total ascending, and total descending. We already know the total distance and we can calculate the others while we populate the data table. In plotElevation find the line "var distance;" and insert the following lines below it.
var totalAscending = 0;
var totalDescending = 0;

Now in the same function, after the line "data.addRow..." add the following code.
if (i > 0)
{ if (results[i-1].elevation < results[i].elevation)
    totalAscending += results[i].elevation - results[i-1].elevation;
  else
    totalDescending += results[i-1].elevation - results[i].elevation;
}

And finally we will show the user this information by inserting the following code after the line "chart.draw..."
window.status='Total Distance: ' + Math.round(totalDistance) + 'm, ' +
      'Total Ascending: ' + Math.round(totalAscending) + 'm, ' +
      'Total Descending: ' + Math.round(totalDescending) + 'm';

Google Maps API part 2 Bicycle Routing

My daughter rescheduled today's ride to tomorrow so I decided to spend more time looking at the Google Maps API. I found that routing and elevation profiles are easy too. If you have completed yesterday's tutorial, take a look at this.

I want to be able to click on two locations on the map and have the recommended cycling route displayed. To do this we need to define two map marker objects to show the start and end of the route and a directionsService object to get the route. Add the following variable declarations before the initialize function.
var directionsService = new google.maps.DirectionsService();
var startMarker, endMarker;

Now the click event handler we wrote in the previous tutorial needs to be extended. The first time we click the startMarker will be null so we will create it at the click location. The second time we click the startMarker will not be null so we will create the endMarker at the click location and then calculate the route. Like geocoding, routing is also asynchronous so we will make the request and tell Google Maps where to send the results. Add the following code to the end of the showaddress function (ideally we would rename it at this point but for simplicity we won't).
if (startMarker != null && endMarker != null)
{ // Clear the existing route, if any
  startMarker=null;
  endMarker=null;
  directionsRenderer.setMap(null);
}

if (startMarker == null)
{ // No markers so create the startMarker
  var markerOptions={position:event.latLng, map:map, title:"Start"};
  startMarker = new google.maps.Marker(markerOptions);
}
else if (endMarker == null)
{ // Start marker exists so create end marker and request route
  var markerOptions={position:event.latLng, map:map, title:"End"};
  endMarker = new google.maps.Marker(markerOptions);
  var DirectionsRequest = { origin: startMarker.position,
     destination: endMarker.position,
     travelMode: google.maps.TravelMode.BICYCLING,
     unitSystem: google.maps.UnitSystem.METRIC,
     avoidHighways: true,
     avoidTolls: true };
  directionsService.route(DirectionsRequest, displaydirections);
}

Now we need to add the routing callback function for Google Maps to pass the results to. It will use a directions rendering object to draw the route. Add the following declaration below the directionsService declaration.
var directionsRenderer = new google.maps.DirectionsRenderer();

Add the following function below the showaddress function.
function displaydirections(result, status)
{ if (status == google.maps.DirectionsStatus.OK)
  { startMarker.setMap(null); // the renderer displays its own markers
    endMarker.setMap(null);
    directionsRenderer.setDirections(result);
    directionsRenderer.setMap(map);
  }
  else
    alert("Plotting route:" + status);
}

Run the page and click on two locations. The recommended route between those locations is shown. Note how the map redisplays with the cycling layer displayed because we specified TravelMode.BYCYCLING. It would be nice if the map originally displayed in cycling mode. Bicycling mode is added as a layer. Add the following code to the end of the initialize function.
var bikeLayer = new google.maps.BicyclingLayer();
bikeLayer.setMap(map);