Blog

A (not quite) Epic Trip to Alaska

So this winter was a strange snow year in the Pacific Northwest.  After a slow start, it seemed like most weekends involved some fresh snow somewhere, and we had it pretty well.  Our big trip of the year was a week in Girdwood, AK for the first week of March.  Well - unfortunately Alaska was having a pretty poor snow year - and it rained a few days before we arrived.  However, we made the most of it with some carving, some ski touring, and some heli skiing! Plus, I was able to play with my new GoPro camera...

A video summary of a recent week-long ski trip in Girdwood, Alaska. Heli footage starts at 2:40!

Add a comment

Fall Races and the Transition to Ski Season

So it's been a few months since Ironman Canada and things have stayed fairly busy. I was worried about "Post Ironman" depression, where people often feel a letdown shortly after completing their Ironman (or any other major race for that matter). Well, I happened to see a few different articles in triathlete magazines/articles/etc so I was prepared, plus I was getting excited for the next season - fall running races!

First up, the Aluminum Man Olympic Triathlon in The Dalles, Oregon.  Nothing too much of note, except that I was able to out-sprint another person in my age group to earn the 3rd place age group medal :)

Next up, the Indian Summer Half 5k.  Having not run a standalone 5k since April (21:30), I was excited to see how much speed I've gained over the summer.  Turns out, quite a bit - I ran a 19:21, a new personal record by far and 4th place overall.  Three weeks later I ran my first every stand-alone 10k and it went really, really well.  After running in 4th place most of the race, I passed 3rd place with about 1 mile to go, and then entered a sprint finish with 2nd place, coming out ahead of him by a few seconds to earn my first ever top-2 placement with a time of 39:03 (6:18/mile pace).  I was only hoping to break 40 minutes, so I was really really pleased.  Another 5k one-quarter of a marathon as part of a relay team, and soon enough it's November and snow is starting to fall!

1391796_10102937518760788_1985730850_n
Second place overall in the BLS Fall Fest 10k!

602107_10104077994133884_1424986823_n
Tri Cities Marathon team "MEJA" - first place in the Co-Ed division

A year ago, the wife and I headed to White Pass for some early-season ski touring before the resort opened. Well, we did the same again this year, but brought the dogs up top with us.  As we went earlier, the snow was a little shallower than last year so we had to use care, but it was still a blast. Hoping that this is the start of an excellent ski season.

Untitled
At the base of White Pass, WA

Untitled
Hiking up. The wife used snowshoes, I used my skis

Untitled
At the top

Untitled
Some really soft snow up top

Untitled
Skiing down, dog chasing after me

Untitled
A great time, looking forward to a great season!

Add a comment

Ironman Canada Race Report

Whistler, BC: August 25, 7:38pm (PA System): Eric Fahsl from Richland WA.  Eric, you are an Ironman!

Those last four words are the culmination of my summer.  An Ironman triathlon consists of a 2.4 mile swim, 112 mile bike, and 26.2 mile run.  It's really a ridiculous thing, one has to complete all three of these within 17 hours.  Not too long ago I thought it would be so cool to compete in one but I NEVER thought I’d be capable of it.  Never.  (See prior blog entry on signing up).  Well, now I am an Ironman! Let’s (briefly) walk through the weekend.

Set up 

UntitledIronman Village

As you may or may not know, Whistler is a new location for the 31st running of Ironman Canada.  I have been to Whistler five times to ski, but never in summer.  It’s still awesome and the scenery is always amazing.  Packet pickup, bike/transition bag drop off goes smoothly, and I heavily focus on my nutrition and meals on Saturday.  After semi-franticly reviewing my strategies for each of the three sports I settle in and head to bed.  

Untitled 
Swim to Bike transition area - bike setup on Saturday 

Untitled
The Finish Line

Race morning goes rather smoothly – no upset nerves, no nausea, I eat most of my standard pre-race breakfast of English muffin plus peanut butter and take my Clif Bar and head towards T2 in Whistler Village to get shuttled to T1. It’s 5:10am and the only people out are the other competitors.  Very little talk is going on; it’s a little eerie.  I get to my bike, check it over and fortunately there are no mechanical issues.  Even the weather is perfect – water temperature around 68 degrees, the air temperature forecasted to be a high of 70, sunny and minimal wind.  Attach my water and bento box, put on my wetsuit and head to the swim start.

Swim

IMG_7362
Prior to the swim.  Do I look nervous?

The swim is still my weak sport.  2.4 miles is a looong way.  Going in, I was pretty confident I could complete the distance, even if I had to side-stroke the whole thing – which is what I do whenever I feel anxiety during the swims.  What I wasn’t sure of is how close to the two hour and twenty minute cutoff I would be.  I was rather nervous getting into the water, swimming with 2000 other people around you is pretty intimidating.  I positioned myself towards the back, they announced 30 seconds until start, everyone whooped and cheered, and before you know it the cannon goes off and we are on our way.

IMG_7372 
2000+ swimmers getting ready to start a loooong day 

IMG_7374
Go!!!

Things start off smoothly, it’s not as crowded as I was expected – I positioned myself well.  After a few minutes I decide to side-stroke a bit and take in the scenery then alternate back to freestyle.  I look back and don’t see a ton of swim caps – a little concerning but I suppose I shouldn’t be surprised.  I continue to do this throughout the first lap and eventually I round the fourth turn to start lap two.  Well, something clicks – freestyle feels good, really good.  All of my anxiety dissipates.  I start passing people left and right and I start to really enjoy the swim.  I joke to myself “the key to reduce swim anxiety is just simply to warm up for 1.2 miles”.  About 1/3 of the way through the second lap, when things are going really well – I think to myself – This is the moment when I know I’m going to become an Ironman today.  Round the final buoys and before I know it I’m the final stretch and out of the water.

0445_04638 
Done with the swim! 

Swim Time: 1:30:31
Rank: 1710 out of 2171 (79%)
Position in Race: 1710 

Bike 

The transitions at Ironmans really are awesome – someone is there to help take your wetsuit off, people help you find your transition bags, and even apply sunscreen on you!  After a few minutes I’m on my bike for the longest bike ride I've ever done.

0445_10547 
Getting ready to mount the bike 

Things start off well going well – I see my cheering section of Alicia and Liz a few minutes in and I am taking it really easy to pace myself.  The bike course at Whistler is a lot of rolling terrain with a big climb near the beginning and a series of medium-size climbs at the end.  The crowd support the first 30-45 minutes was awesome – people are lined up on the streets, everyone cheering for you, it’s just great.  I get to the base of the first big hill and start the climb – as you may know, climbing is one of my strengths (being lightweight has its advantages), and I start passing people but yet try to go as “easy” as I can to not burn up too much energy.  Towards the top of this climb is the ski jump used in the 2010 Winter Olympics and it’s pretty awesome.  Round the turn and head downhill – wheeee!  Ludicrous speed was attained as hundreds of riders are flying down the mountain.

IMG_7438 
Towards the start of the bike 

Next up is 30 miles on Sea to Sky Highway to the town of Pemberton.  Whizzing by Whistler village the crowd support is there again – people on both sides cheering on the athletes – you feel like a rock star!  Most of this section is downhill and one can’t help but think about how is this going to feel going back the other way up hill. Again, try to hold back a little bit and save my energy for the rest of the ride.  

0445_44750
Staying aero!

0445_22848
The scenery on the bike course was like this for the entire ride.  Freaking amazing.

Once past Pemberton, we get to the only truly flat part of the course – 22 miles out and 22 miles back.  The views are (still) amazing.  I stay in the aero position as much as I can and settle in.  Around mile 60 I stop and apply some additional chamois cream (a wise choice) and focus on staying hydrated.  After what seems like forever, I reach the turnaround point and start my trip back.  Surprisingly – it’s not as boring going this way and I roll back through Pemberton. The return trip up to Whistler is indeed tough.  It’s hot out, my legs are tired, and now I have to deal with hills.  It seems like every time you crest a hill you go back downhill losing about a third of your elevation only to go back up – almost like going up three flights of stairs, down one flight, up three, down one, and so on.  Finally, finally I’m in the home stretch of the bike as I make the right turn off Sea to Sky and into Whistler Village.  Crowd support is there and I’m super happy to arrive to T2 and get off the damn bike!

Bike: 6:48:54
Rank: 1373/2065 (66%)
Position in Race: 1404

Run

As I’m in transition, changing my tri shorts for running shorts and I hear the announcer state that Trevor Wuertelle is the winner.  So – the winner is done and I still have to run a marathon?  Bloody hell.  My goal was to finish before sunset, which is 8:10pm.  Looking at my watch I see that it is 3:30pm – I just need to run a marathon in 4 hours and 40 minutes and I’m golden.

Leaving transition I see Alicia, Liz, and Sammy (our dog) there to cheer me on!  I’m reinvigorated and am on my way.  Immediately there is great crowd support on the run – your name is on your bib number so I’m hearing “Great job Eric”, “Way to go Eric”, and so on – again, rock star status!  I found the run course to be really great – very scenic through woods, lakes, and parts of Whistler Village.  Much of it is shaded so I elected to wear a visor but no sunglasses.  There are some hills on the course but nothing too major.

IMG_7443
Coming out of T2

0445_43200
Doing work

My strategy for the run was to try to start off around 9 minutes/mile and see how I feel, while planning to walk through all aid stations.  I’m holding a mid 8 min/mile pace and decide I need to tone it back a bit, but still never get much slower than 8:45.  After the first few hills I decide to power-walk up the hills – most of the other people were anyways.  It just seemed like so much less energy but wasn’t really that much slower.  This was also a great way to conserve energy because I found I only had one comfortable running speed, around 8 min/mile.  After a few miles I start to get hungry.  Gels aren’t cutting it so I take some of the Honey Stinger chews and to my surprise they are doing the trick.  Over the next two aid stations I consume 2 chews each, and after a little bit of walking to get myself to burp I’m ready to run.  My general strategy became – 

  • Good run form on the flats and downhills
  • Power walk (swing those arms!) on the uphills, but no more than 1 minute at a time
  • Walk through every aid station
  • Enjoy the scenery!

0445_36065
Enjoying some gravel sections of the Valley Trail

0445_53620
Scenery? Check!

After the first loop I am about 2 hours in, awesome – I still have 2 hours 40 minutes to run a half marathon and make it before sunset!  Mile after mile goes by, at aid stations I take a variety of water (x2), gel, chicken broth, or coke.  The crowd is still great – “Looking strong Eric, you’re looking REALLY strong!”.  Around mile 22 I take my fourth gel of the run and decide it’s coke from here on out.  Once I get to mile 25 I tell myself, no more walking!  I finally take the last section of the course, see Alicia and Liz, make a few turns and I’m in the finisher chute!  OMG I can’t believe I’m here already!  I’m a few hundred feet from the woman in front of me so I slow down a little bit to give both of us our own little spotlight.  Throwing my arms up in the air I cross the finish.

IMG_7447
About to head into the home stretch!

0445_59776
Finisher chute!

Run: 4:06:31
Rank: 477/1985 (24%)
Position in Race: 960 out of 1985 total finishers (48%)

Total Time: 12:38:22 

0445_49039

0445_55769

Finish Line (and Beyond)

When I crossed the line, there were a variety of emotions going through my head.  Joy, graciousness (for no major issues), confidence, and honestly just a little bit of disappointment.  I was a kind of sad to be done.  Additionally, they say finishing an Ironman changes you - well I did not really feel any different (well, except tired).  I was confused.  After a little while I realized the change started happened the moment I decided to sign up.  It takes a lot of courage to sign up for a major event, and that marks the beginning of the transformation.  Finishing the Ironman was the final phase of that transformation.  Dotting the I, crossing the T.  All that said, I'm extremely happy with the entire Ironman experience - from the training to the venue/course (the volunteers were awesome!) to my performance that day.  It’s amazing what imagination, determination, confidence, and patience can achieve.  

0445_63115 
Finisher! 

The response I received from friends, family, and even strangers was overwhelming.  Walking back through Whistler Village with my medal on, I start hearing people cheering loudly.  After looking around I realize they’re cheering for ME!  Wow!  It was rather touching.  So what's next?  Maybe another Ironman next year :)

Finally, I have to give thanks to everyone who helped me along the way through this journey.  Most of them won’t ever see this, but THANK YOU to my friends, family, coworkers, coaches, other athletes, and especially the spouse.

Nutrition

Some people have asked me - "What/when do you eat in an Ironman?".  Well, for me, I focused on eating 6 small-ish meals the day before, totaling around a 3500 calorie intake.  During the race, I consumed the following:

  • One gel (Clif shot with 1/2 caff) just prior to swim (100 calories)
  • 5 gels consumed on the bike - one 5 minutes in, next one around 40 min in, one around mile 60, another around mile 85, and the final one about 5 minutes before getting off (500 calories)
  • 550 liquid calories consumed on the bike - 300 calories Carbo Pro, 250 Calories Herbalife 24 (+ 1.5 Nuun tablets for electrolytes)
  • 2 Clif Bars, cut up into eights. One of these bites every 10km to stave off hunger.  500 calories.
  • 4 total gels consumed on the run, approximately miles 4, 12, 18, and 22 (400 calories)
  • Various Honey Stinger chews, chicken broth, and Coke on the run course (~150 calories?)
So while exercising I consumed roughly 2200 calories over twelve and a half hours, or ~175 calories per hour.  

Some other pictures from the weekend

IMG_7475
Posing in the Olympic Square

IMG_7498
Light hiking at the top of Whistler Mountain

IMG_7483
With the spouse

IMG_7492Glaciers in the background, getting excited for ski season soon!

Add a comment

Creating an Animated Javascript Heat Map with Polymap

Creating a Javascript Animated Heat Map With Polymap


WhereShouldISki.com Powder Rating Visualization

As you may or may not know, I run a website WhereShouldISki.com – weather data-driven recommendations for skiing and snowboarding. One of the items on my to-do list was to create a season-long visualization that shows where the storms occurred in North America.

Attending conferences last year, like Strata NY, there would often be some very beautiful visuals that tell excellent stories. For work I had manually created some rough animated heat maps using HeatMap Lib and iMovie, but surely there has to be a better way to do this within a web browser, right?

After a few hours of research, no obvious answer came up – or I just missed it. There are a number of libraries that will render maps, render points on a map, etc. D3JS, Polymap, Leaflet, and others all fit the bill on this, but what about animation? Not many examples (at least that were obvious). After some experimentation with Polymap, I figured out a way to dynamically generate a “layer” of coordinates. Well – what happens if I have an array of my data points, and iterate through dynamically creating new layers of coordinates and deleting old ones? Bingo.

Below is the strategy and some walkthrough of how I used the Polymap framework to create the animation at http://whereshouldiski.com/viz/2012-2013-viz.php

Strategy

Overall, it’s not that complicated. The strategy is comprised of the four steps

1. Have the ability to create your map with a single date of data loaded dynamically

2. Set up the data as an array of single dates of data

3. Utilize the Javascript timer function to iterate through the array of data, destroying the old data and dynamically loading the new data

4. Add user controls to identify and/or change the date of the data displayed

Step 1 – Collect and Parse Data

WhereShouldISki has a rating system of 1-5 for powder, bluebird, and freezing level, stored as one JSON document per resort per day, for example:

These documents are accessed via ElasticSearch. Polymap uses the GeoJSON format, so after writing a Python script to parse through my relevant dates and data, I have a JSON object that looks something like:

{
type: "FeatureCollection",
features: [
{
  geometry: {
    type: "Point",
  coordinates: [
   -114.36,
  48.02
]
},
 type: "Feature",
id: "blacktailmountain_2012-12-20",
properties: {
count: 2
}
},

Within the array of each FeatureCollection, there is one entry for each coordinate and the weight (count in this case). So let’s build up a pretty large JSON structure to store this – an array of FeatureCollections, one per date.

Step 2 – Set up Polymap

Download Polymap and set up on your web server, whether locally or on the internet/cloud. I have had decent success with using MAMP and updating the Apache web server to my development directory.

I use the tiles at cloudmade, make sure you sign up for your own key. I thought the blue map was rather dramatic, so first let’s set up a blank map centered on the US.

var po = org.polymaps;
var map = po.map()
.container(document.getElementById("map").appendChild(po.svg("svg"))) .add(po.interact())
.add(po.hash())
.center({lat: 46.14, lon: -101.26})
.zoom(4);
map.add(po.image()
.url(po.url("http://{S}tile.cloudmade.com"
 + "YOUR KEY HERE" // http://cloudmade.com/register
 + "/999/256/{Z}/{X}/{Y}.png")
.hosts(["a.", "b.", "c.", ""])));
map.add(po.compass().pan("none"));

With this code, you should have a blank map centered on the US.

Step 3 - Add the Data

Since I am storing the data as a large JSON file, we can use JQuery’s ajax call to retrieve the data while letting the user know the data is loading.

var allDatesData = (function () {
   var allDatesData = null;
   $.ajax({
      'async': false,
      'global': false,
      'url': "allDatesData.json",
      'dataType': "json",
      'success': function (data) {
         allDatesData = data;
      }
   });
   return allDatesData;
})();

Now we have all of the JSON data stored in a variable. In order to add the points for a date onto the map, follow the example code to look something like:

jsonData = po.geoJson()
   .features(allDatesData[i]['features'])
   .on("load", load)
   .clip(false);
map.add(jsonData);

Since allDatesData is an array above, I have to specify which date to populate. Cool, so now we can populate a single date. But how do we animate?

Step 4 – Animate

Since we know Polymap deals with layers, and we have an array of all of our data, seems we just need a way to delete the old layer and add a new layer of the new date’s data. Then, we can make use of the Javascript timer to iterate through the array of data.

var dayIndex = 0;
function startAnimation() {
   myVar=setInterval(function(){refreshData(dayIndex++)},500);
}
function refreshData(i) {
   if (i < allDatesData.length) {
      if (jsonData) {
         map.remove(jsonData);
         unhighlightDate(i-1);
      }

      jsonData = po.geoJson()
         .features(allDatesData[i]['features'])
         .on("load", load)
         .clip(false);
      map.add(jsonData);

      $('#date' + i).addClass('selected');
   } else {
         stopTimer();
   }
}

For some added flair, I added an on-display calendar with a few divs and and then some Javascript to make these clickable:


//set up click actions
for (i=0; i<allDatesData.length; i++) {
   $('#date' + i).click(selectDate);
   $('#date' + i).addClass('clickable');

Now we just need some HTML elements to Start and Stop the animation:

 

 

 

 

 

 

<div id="start" onclick="startAnimation();"> START</div></p> <p><div id="stop" onclick="stopAnimation();">STOP</div></pre> <p> </p>"</p>"</p> <p>(Apologies for the weird formatting on the blog).  In theory, you'll have an animated heatmap!  Of course, many details have been left out because so much is particular to the specific dataset, which is likely where one will spend most of their time - formatting the GeoJSON object.  But if you follow the principles and after much debugging it might turn out nicely!</p>"</p>"</p>"</p>"</p>" Add a comment