Tuesday, September 30, 2014

Models and whatnot

I'm gaining momentum down the slippery slope of developing the application at this point. To date:

  •  I've registered a domain
  • worked out the code for the API
  • built the database model
  • started mocking up the UI
  • figured out how to tie the web app to a mobile app (hooray for phonegap!)
  • tapped into strava and mapmyfitness
  • made contact with Suunto
  • tied in the handicap system code
The difficult piece I'm wrestling with is how to make this simple for athletes. The concepts are a little more complex than what the average athlete would be interested in. The target user:
  • Is an active athlete, participating in any of swim, bike, and run
  • Trains often - at least 3 times a week
  • Has a data collection device, ie Garmin, Powertap, etc.
  • Doesn't have, want, or can't afford a coach
  • Wants to improve using quantitative planning
I saw once (and now can't find) that TrainingPeaks said they have 500,000 users - which sounds like a lot, but I suspect is inflated substantially by the number of free accounts that were started and not actively used, duplicated accounts created by coaches for athletes, etc. I'll aim really small - 5,000 users. That would be a sustaining amount of users from which the site could easily stay afloat and be a full time pursuit, allowing changes and improvements to be made over time to enhance the experience.

The user experience should be quick and easy:
  • Create a trial account
  • Enter the amount of time in hours they want to train a week
  • Import data from Strava, MapMyFitness, or ideally Garmin\Suunto\Polar, etc. 
    • note- there should be a very easy and current How-to on syncing data into Strava and MapMyFitness to allow this to be done using the free providers

  • From the data, gather their FTPs, with the ability to override
  • Create a work week: create days, roughly at first, with the ability to fine tune.
  • Create a schedule of work weeks 
  • See where their work will lead them over time

That's it. The extensions come from being able to create work weeks - linking to authors, coaches, etc who can help them build workouts. Guest workouts. Group workouts. Tracking friends. Entering race reports. The Handicap system host. Sync to calendars. 

I'd like to provide options - set at a user level - for which models people use for calculating their training levels. The Coggan model is one, the Skiba enhancements are another, Bannister is another, etc. Why not let people pick? I have long suspected the decay factor in CTL and ATL in the WKO+ model is too aggressive (42 days to complete evaporation, 7 days for acute gain) for decay functions, and I have experienced that less aggressively. I'm not in a position to call any of the models out, but it seems like they are variables, and should be treated as such. 

Friday, September 26, 2014

Suunto, Garmin, and Polar, oh my!

Being a bit of a nerd, I'm more data driven when it comes to decisions and time management, and how I sort out my training is no different. Last season I cooked up a spreadsheet that allowed me to 'assign' myself training weeks based on TSS, and track my actual results accordingly. I used the same TSS calculation that Dr. Andrew Coggan uses, as well as my own variant for Run and Swim TSS. The prescribed training load was based on hour segments at 70% of critical power\pace, and I rolled a PMC (Performance Management Chart) that showed actual vs expected. It all worked pretty well, I must say. I used it as I prepared for my first ultra distance (I've lately come to loathe WTC, so I won't use any 'metal' terms for the distance) and found it did an accurate job of representing my fatigue and form, as well as quantifying the gains I made. Sort of a poor man's Training Peaks, really. Well, no, that's exactly what it was. There aren't many features I left out.

I'm preparing for another training season and jumped into the world of data collection devices to see what, if anything, has changed since last year at this time when I last looked. For training, I use a Garmin Forerunner 305, a Swimovate Poolmate, and TrainerRoad. I could also collect data with the Powertap Joule, but it would be redundant to TrainerRoad. My wishlist is simple, really; I want to collect data directly into the spreadsheet automatically. I'm a developer by trade, and have no issues turning the spreadsheet into an application, but the 'collect data directly' bit is something I'm on the hunt for. So what's out there?


Above the 305 I already have, Garmin offer the 310XT and 910XT, as well as the Garmin Swim. The 310XT is effectively the same as the 305 for my purposes - the only thing it offers me I don't already have is the ability to capture power data into Garmin Connect. That isn't worth anything to me - I can import anything I need out of TrainerRoad and into either CycleOps' PowerAgent or Golden Cheetah if I need to get medieval on any data. The 910XT is interesting to me, but really only for two features; one is major, and that's the swim capability. It does everything the Swim does, as well as the second, open water swim tracking. However, if I'm perfectly honest I don't care that much about the open water swim metrics, because I don't\won't wear a watch in the water on race day. Period. I'm not going to look at it while I'm swimming, and my splits are whatever the results say they are. So to that end, I can continue using the 305 for tracking open water swims just fine (Ray at dcrainmaker.com perfectly explains this here, so I won't repeat any of it). Since I'm already being perfectly honest, that means the only thing I'm really looking at the 910XT for is what the Garmin Swim does. Compare the Swim ($149 MSRP) vs the 910XT ($399 MSRP) and it isn't even close.

From a data perspective though, things here are good, but not great. The Garmin Connect site on its own is great, but in order to get my own data off the site, I have to either
1) export it, then import to my spreadsheet\app
2) sync it to Strava, then connect to Strava's api to get it
3) pay $5000 to get an api from Garmin to do it all in one fell swoop.

I've had a poke at Strava, and while it's a stop on the highway that I want to exist between my application and Garmin Connect, it will work. Garmin now offers automatic synchronization with Strava whenever you sync a new activity, or if you create a manual activity (like a swim if I don't have a Garmin Swim, or weights, etc), you can use tapiriik.com to sync everything. I consider that a solution. One way or another I'll have to upload my  tcx files to *something*, so if it's Strava or Garmin Connect (or both in this case), it's fine to me.

Suunto's main offerings aimed at me are the Ambit2, 2s, and 3. The 3 is not compatible with Ant+, which is what almost all power meters, heart rate monitors, foot pods, etc communicate on. To me, this was a ludicrous choice, but one they made regardless. At that price, I'm not interested in going Bluetooth, but I would be at a lower price. For now, that leaves the 2 and 2s. The 2s only has one strike against it - battery life of 7 hours on 1 second GPS collection. To me, that's not a dealbreaker. If I ever do an ultra distance, I won't race on the bike with the watch regardless - you simply can't comfortably or safely monitor the watch while riding in aero. So I'll continue to use my Joule, meaning unless I run a 7 hour marathon, I really don't care. The 2s also has a slightly smaller profile, which appeals to me.

Again from a data perspective, we're not great. Actually, we're not even good. After poking around on Movesconnect (Suunto's answer to Garmin Connect):
1) Exporting data doesn't appear to work for manual entries
2) sync to Strava only works for synchronized activities, and even then only for GPS activities *
3) I have had no response on usage of their api.  I was told I can't use the api. Bummer.
4) I discovered the only way to import tcx files that don't come from Garmin (like TrainerRoad!) is to import them to Garmin and then use some flimsy third party tool to import to Movescount.

* This matters to me because I swim in a pool for 7-8 months of the year. If I can't get that data, it's useless.

IF I hear from Suunto that I can use their API, this gets categorized to great, because I won't have to deal with Strava, which would be a pit stop tool.  If I don't hear from them, then this is a deal breaker, because I wouldn't be able to get my data for any of my swims.  The site doesn't export or import reliably, and that's the entire point for me - access to data. For my development purposes, data is the entire point,  and I need to be able to get it out. It's a shame, because I think the Suunto watch looks great, has great reviews for what it does, and could have been a solution. I think the Ambit 2S hangs directly with the 910xt on nearly every count, and trades punches on the things it doesn't.


Oh, how I'd hoped this was something I could love. But between being another BlueTooth only device and having less than Garmin-quality satellite reception (I didn't think you could get worse....) this one is a non starter. Oh, and they haven't even enabled power meters or open water swim data collection yet. Really? Stunning. Also, Polar's web site is an absolute toy.

The 910XT and Swim from Garmin really look like the  best options for me. I don't need either the bike features for the 910XT nor the run stuff, I have better solutions there, and the only thing it offers me is having them all in one place. With a lighter wallet, no less. So it's the Garmin Swim. *Update* Since I first wrote this the 920XT is official, and officially $500. Yikes. There are a lot of things in it, and it has a great slim form factor, but it's wicked expensive to replace what I have. If anything, it validates the Swim purchase. I also think it's interesting that the 920 'introduces' third party apps, although Suunto has had these for years. I still wish I could get at that data!!! The 305 I have is now 3 years old and still works flawlessly, even if it takes a couple minutes to find a satellite. It IS after all, a training tool, though. I can afford to wait. The data from race day is to me, the least important data of all. It's a recital, not an audition. The decisions one makes on race day shouldn't be data driven. The data can't make or break you, it's too late. You know what to do, you do your best, you go home.

It looks like I subsidize my purchase with the sale of the Poolmate on eBay, so I can ultimately get one for around $80 of new cash all said and done. I'd love to see Garmin open their API up to individuals over time, but considering they JUST closed it, I can't see that happening. Maybe they will acquiesce, though, who knows. That they are now open to Strava is a positive, however. ConnectStats was\is an application that was set down this route, but wasn't planning on data warehousing as I was, so they were more reliant on Strava as a store, which I couldn't care about.

I'll continue developing the application as a web app, and if it gets snappy I'll consider publishing it as an iPhone app. The only issue then would be going head to head with TrainingPeaks, but I'm nowhere near that point yet.

Sunday, September 14, 2014

Race Report: HITS Hunter half iron

I got up at 4:30 for a 7:00 am start, had my packet already, just needed to get there (15 min away, I stayed locally) and set up. I downed a protein bar and a Clif bar with some Gatorade, vowing not to eat again until the race to give my stomach a break. I'd also eaten an early and light dinner of a sandwich the night before, really didn't want GI Joe showing up uninvited.

It was a frosty 42 degrees at transition, and I mulled around in jeans and a hoodie to stay warm. I gave the power meter one last try to pair to the Joule, but it seems I was out of batteries on the PowerTap and it wasn't going to happen. Bummer, so much for the power plan, have to ride on feel. I'd seen the course by car the day before and knew it was pretty much down a screamer, then up the same, which I'm used to on the commute course to work. I felt like if I kept it going hard on the downhills, I could pace the rollers and ascents fine.

Swim time! The water was comparably warm, and perfect for racing. The RD (a great guy) led a prayer on the beach, and off we went. I had what felt like a 90% great swim, there were a couple of points where I lost form, but I gained it back. We lost probably a good 2 minutes on the funkiness of the course - get out after the first lap, run down the beach and go back in navigating over some nasty large and jagged rocks. Once swimming, all is well. Popped out and heard 9th out...which was great. Granted, this was a small field, but I knew I had swam well. A guy who had been tickling my feet the whole time thanked me and commented how powerful my kick was, and thought that was a great swim time. Again, I'll take it! Thanks buddy, way to hang behind that two beater! Up the hill and over the mat, I put the swim at about 30 minutes less the weirdness, which is perfect. The buddy's watch confirmed the pace later. Sweet!

Arm warmers on and dried off as much as possible to prepare for a freezefest. I was concerned that I hadn't been able to find my flat kit and was just praying nothing would flat or my day would be over. Fortunately, no bad luck. However, it was COLD. And then the wind started. Oh the wind. It blew in your face on the way up the starter hill, to the side on the way down it, then in your face again (what?) on the way back up. The side wind made me chuck my plan to hammer on the way down, it just didn't feel stable enough. I passed and then was passed by the eventual 2nd place finisher, and given the wind I didn't feel I could chase him down without burning matches I didn't have for the run. I really wanted to nail the run to the wall. I hunted down a rider in Plattsville town, and chatted with him a bunch, another benefit of a lonely ride - no refs. He had the same plan, nail the run. Nice guy. We finished the bike within seconds of each other and left for the run. His brother shouted at him to run a 1:25, which I fessed up immediately was not in my wheelhouse. I told him to take off.

OK, so the run. I couldn't feel my feet, but fine, who cares. I started out. The plan was to relax - sing some Bon Iver to myself, and keep my pace low to start - around 8:30 to 9:00 even. Assuming I could settle in and not freak, start increasing the pace at 1 to 1.5 miles and then lay it down. What can I say, I did just that. I stopped at each aid station for flat coke, but quickly. A whizz at about mile 8 to notr be distracted. A brief, :30 walk over a very rocky portion of the short foot trail to not risk twisting a foot or aggravating an ITB. Other than that....I did it. My best half mary on a HIM, a 1:49. Deep bow. I coasted in what I thought was 7th overall, found out the next day it was 6th. Won my age group handily.

Again, not a deep field, but I know it was a solid effort. In a deeper field I would still have done well, not won the age group, but podiumed in it, no flukes. The run was the key. Was it because I didn't burn too many matches on the bike? Eh, not sure. I definitely took it easy on the bike to be conservative to the wind. I'm capable of better on the bike, but the balance in the performance has to be key. If I keep my bike fitness up, race weight down, and fight to maintain what I have in the other two, I will do well at this distance. I don't have a lot to improve on the swim or run, I don't have the physique or time for it. But I can destroy on the bike, and need to race accordingly. The longer the distance, the more I have to simply hold on the run, not chase people down. Shorter distances will be harder for me because I can't swim as fast. I have a feeling I'm going to plan next year's schedule around longer distances only. They are very fulfilling and speak to my strengths more.

A great way to end the season!

Thursday, September 4, 2014

Great diagram

This was too awesome not to post. My giant quads, calves, and ass break down why I insist I'm not a fast cyclist, I'm just genetically predisposed to being strong on the bike! If I worked as hard as a *real* cyclist, I could get scary!

Tuesday, September 2, 2014

Race Report: South Salem Biathlon

This race is usually the last of my season, but this year I have one more on the 13th. It's an unaffiliated, quirky race put on by friends and attended by friends, within riding distance from the house. The race centers around a roughly half mile hill at about a 9% grade - you get to bike it then run it. The rest of the bike course is highly technical and punchy, albeit short, and the run is no picnic at 4 miles including that hill and a few others. Like I said, quirky. There's an award for KOH (hill) that I was hoping for, as well as a an overall podium.

A humid day, but not oppressively so, things started out just fine. I found my way up to the front relatively. A 16 year old had taken a big gamble and jumped onto the climb and was pounding away, about a third of the way up when I started the climb. He was clearly going to summit first, but I felt I could still be in contention as his climb time could very well be the same as mine, he could have just reached the bottom faster. I put in a very solid climb and was overtaken at the timing mat on the summit - a sneaky maneuver, but a solid play nonetheless. I hadn't seen him as he climbed off my right shoulder and I was peeked off my left. Chapeau. It turned out the kid had ripped up the hill and bested both of us by :30.

All 140 pounds of him soaking wet I figured wouldn't get the job done on the descents as well as I could, so I set to hammering away. I caught the sneak who had clearly burned a few too many matches and held on to his tire for a bit, figuring to blast past him to crush some dreams on a combo of bits at the back end of the course unless he faded completely. Everything fell apart quite literally though on a 90 degree left over slick road, as I fishtailed out and dumped. I managed to spill without injury to myself or the bike, save for having to get the chain back on, but I knew it was essentially over at that point, as a few others passed by while I recovered. I got back on to finish the ride, but I was pretty upset with my luck.

I came into transition and saw I now in 7th. I didn't exactly sprint through transition, but my mind was elsewhere, I started the run without going over the mats. A few people yelled at me and I went back and did the duty, but if there was any question before, it was gone now. I made it about half a mile before my anger seethed me into a walk. I was already on brick legs, and with my asshat, I just couldn't do it. I didn't pull my head out my ass for about another mile, when I finally ran again and came in strong, simply laughing to myself that it was the only way back to my bike.

I cheered in a friend and rode home, disappointed. It's been a wacky season. I'm intolerant of mistakes, and I've made a lot this year. I'll learn from them, but they sting nonetheless. I'm lucky I wasn't hurt in the crash but there was a more conservative way to take that corner and I didn't. I need to keep the bikes up better, with newer tires and lower psi I might not have slipped, and I was ginger on the rear brake when I should have been on both. No excuse for not running harder, but I didn't feel like putting myself in a coffin just for appearances' sake. My goal was the OA, and I was out, so I took myself out. Better luck next time.