Sunday, October 20, 2019

MSTest Unit Tests on Visual Studio 2019 for Mac

There are several unit test options available in Visual Studio 2019, but the decision to use MSTest for a particular project was out of my hands, so this post covers getting MSTest unit tests working on Visual Studio 2019 for Mac.

The first step is to make sure you are using Visual Studio, and not confusing it with Visual Studio Code. The Visual Studio icon looks like this:

 


And the Visual Studio Code icon looks like this:

 

These instructions apply to Visual Studio (for Mac), not Visual Studio Code.

If you want to download a pre-loaded solution with a working example of an MSTest unit test, feel free to clone this GitHub repository and make any necessary changes. Replace the C# files with yours as needed (or just copy and paste contents). All of the Assert class methods can be found here; they are necessary to write other forms of unit test functions.

Important Note: If you clone the above repository, but have never added all of the NuGet testing plugins, the project will probably fail to build. The resolution is to follow the first half of the instructions below to install all of the necessary NuGet packages.

To update an existing project...

If you run into trouble, it might help to clone the example repository above and compare your solution with mine.

Some guidance instructs you to create a separate sub-project under your project's solution to contain the unit test code. I suspect those instructions work properly for Visual Studio running on Windows, but there seem to be namespace issues in Visual Studio for Mac that prevents that approach from working correctly.

The solution is to apply all of the following instructions to the solution that your source files are stored in and not create a separate sub-project to contain the unit tests.

Add the proper unit test packages via NuGet. <ctrl>-click Dependencies and select Manage NuGet Packages...


You should see a screen similar to this one:


Use the search box in the upper right of that screen to find and add the following three packages:
  • Microsoft.NET.Test.Sdk
  • MSTest.TestAdapter
  • MSTest.TestFramework

Once you have added these packages, your solution will probably be broken with the following build message:

error CS0017: Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point.

Many thanks to Andrew Lock for solving this one. His solution is geared towards xUnit, but it works in this case as well.

You should really read his incredibly detailed rundown; I did, and I learned a lot. But if you are short on time, the TL;DR is to add the following line of XML to any <PropertyGroup> section of your project's .csproj file:


<GenerateProgramFile>false</GenerateProgramFile>



And finally, to actually run the unit tests, select "Run Unit Tests" from the "Run" menu.


After you run the unit tests for the first time, you should have a button like this at the bottom of your IDE:

 

Click "Test Results" to display the test results browser and debug any test failures.

Thursday, March 08, 2018

Chasing a (possible) udev issue...

I have been chasing, what might possibly be, a problem in udev, and am using this blog post as a gathering point for evidence.

Because there is so little to be found on this issue, it is almost certainly a configuration issue in my own environment. Otherwise the Internet would be full of people seeing the same problems.

I also cannot guarantee that all of this evidence is related, nor can I be 100% certain that it is actually due to a problem with udev. All I can say for certain is that the evidence seems to be pointing towards an issue with device nodes not being created when they should be. Since udev is responsible for managing device nodes, it seems reasonable to start considering that udev may be at fault somehow.


First some background information. I am maintaining my own yocto based Linux distribution, currently working from the Pyro branch.

  • bash version - 4.3.47(1) (x86_64)
  • LVM version information:
    • LVM Version: 2.02.166(2) (2016-09-26)
    • Library Version: 1.02.135 (2016-09-26)
    • Driver Version: 4.31.0
  • udev version 232

The first problem...

When I attempt to create a new logical volume:
root@server:~# lvcreate -L1M -ntest.data vg00
Rounding up size to full physical extent 4.00 MiB
/dev/vg00/test.data: not found: device not cleared
Aborting. Failed to wipe start of new LV.
When you create a new logical volume with lvcreate, the first 4KiB needs to be zeroed out to avoid a potential hang when mounting the volume. It appears as if the device file (/dev/vg00/test.data) is not being created in time for the remaining lvcreate tasks to finish. The workaround is to use the -Zn argument to lvcreate and then do a manual zeroing with the dd command, like the following:
root@server:~# lvcreate -Zn -L1M -ntest.data vg00
Rounding up size to full physical extent 4.00 MiB
WARNING: Logical volume vg00/test.data is not zeroed.
Logical volume "test.data" created.
root@server:~# dd if=/dev/zero of=/dev/vg00/test.data bs=512 count=8
8+0 records in
8+0 records out
4096 bytes (4.1kB, 4.0 KiB) copied, 0.00415683 s, 985 kB/s

The second problem...

This one happens when I attempt to use bash process substitution. What I expect to see is something like the following:
root@server:~# echo <(true)
/dev/fd/63
What I actually see is the following:
root@server:~# echo <(true)
-sh: syntax error near unexpected token `('
The characters are absolutely identical in both cases - I have copied and pasted them in every way I know how. I have also tried the same command in a multitude of bash interpreters of various versions and it always works as expected.

Because bash process substitution depends on device nodes being created on the fly, this seems like it would be related to the LVM problem above.

Conclusions...

As I mentioned at the top, I am not 100% certain that this is all related, but it seems pretty suspicious. Two instances that rely on device files to be created on the fly, both seem to fail. Conversely, the boot process, which creates a lot of device nodes, seems to work just fine. I am also not able to find any smoking guns (or even faint whiffs) in the logs.

More to come...

Saturday, March 26, 2016

Converting global temperature change to energy...

TL;DR: Over the last 100 years, every 41 days the amount of energy we generated in 2013 gets "stuck" in the atmosphere.

The details...

I like reading Cliff Mass' blog because he takes such an even handed approach to the science of climate change. He is very careful with his assertions and takes on media outlets for being too sensational about what the data does and does not say.

recent post of his did a fantastic job of putting the affect of climate change into context with natural variability. The punchline is that climate change only enhances what is already natural variability. If it was going to be hot, it will be just a little bit hotter. If it was going to be cold, it will be slightly less cold. If you were going to get a hurricane, it will be a bit more energetic. And so on...

Or to put it in different terms, you cannot blame anything directly on climate change. If you are experiencing it, it was probably going to happen whether or not humans were on the Earth. You are just going to have a more intense experience.

So I applied some High School level math to figure out exactly what that means...

Mass of the Earth's Atmosphere: 5x1018 kg
Average atmospheric specific heat: 1005 j/kg/K
Current average temperature change: About 1 degree Kelvin (which is the same as 1 degree Celsius)
Global yearly energy generation in 2013: 5.67x1020 joules

Note: I assume energy consumption is equivalent to energy generation. While they may not be exactly equal in reality, it is certainly true that consumption could not be less than generation. I am also using 2013 energy consumption numbers. The numbers are most certainly higher in 2016.

So given the basic heat equation: Q = mcΔT

Q = Joules of energy required to cause a temperature change.
m = Mass (in kilograms) of the matter you are heating up.
c = A constant representing how difficult it is to change the temperature of the matter.
ΔT = The actual temperature change.

Using the above numbers we get:

Q = 5x1018 kg * 1005 j/kg/K * 1 = 5.025x1021 joules

So that means it takes 5.025x1021 joules of energy to raise the average temperature of the Earth one degree Celsius. But 5.025x1021 joules is a really big number that is hard to put into terms that anyone can understand, so let us look at how this compares to how much energy we actually generate on the Earth...

As I mentioned above, in 2013 we generated about 5.67x1020 joules of energy. If we divide the amount of energy it took to raise the atmosphere by 1 degree Celsius, by the amount of energy we generated in 2013, we get:

5.025x1021 joules  / 5.67x1020 joules = 8.86

So this means we have 8.86 times the energy we generated in 2013 currently trapped in the atmosphere. But this number is still not very interesting because it says nothing about the rate at which this is happening.

The industrial era has been going on for about 100 years now which is about 36,525 days. In that amount of time, we have managed to alter the atmosphere so that 8.86 times the 2013 energy generating capacity of the earth is stuck in it.

Averaging over that 36,525 days:

5.025x1021 joules / 36,525 days = 1.38x1017 joules stuck in the atmosphere per day

Which means that the atmosphere has been retaining an average of 1.38x1017 joules of energy every single day.

So how does that compare to the 2013 energy generating capacity?

1.38x1017 joules per day / 5.67x1020 joules in 2013 = 0.00024 * 100% = 0.024% of energy generated in 2013

So that means, for every single day in the last 100 years, the atmosphere has retained about 0.024% of the equivalent of the 2013 energy generating capacity. Or to flip that around, every 41 days the amount of energy we generated in 2013 gets "stuck" in the atmosphere.

Wednesday, December 03, 2014

IRONMAN Arizona Trip Report Part II

[Note: I wrote this mostly as a reminder for myself, but I think it might be helpful to other triathletes as well. I recognize that it may seem overly detailed, but triathlons are complicated affairs that require some trial and error to get right.]

This is part II of my IRONMAN Arizona 2014 trip report. It concerns all the stuff that happened on race day. The details leading up to race day can be found in Part I.

I was up by 0400hrs on Sunday morning. Actually, I was up a bit before that but I did not feel tired at all, nor was I really that nervous. This is an endurance event, not a test of skill, so there is really nothing to be nervous about. I think my body was just readying itself for the task ahead.

The first order of business was to follow my usual morning routine. One of the golden rules of triathlon is to never do anything out of the ordinary before a race, so I still took a shower even though I was about to go swimming and then sweat for another 12 hours. I finished up by putting on the heart rate monitor, tri-suit, timing chip, and finally my street clothes.

I hung out in the hotel room for a bit reading the news and checking the weather. I was disappointed to discover that the winds on the race course were expected to be 25 knots after being nearly dead calm for the last few weeks. It was only after the race that I found that that this was a gross under-prediction. The actual winds were a sustained 40 knots, gusting to ludicrous speeds...

I was down at the hotel breakfast by about 0500hrs. I had a little coffee and a bowl of cereal, but that was about all I could get down. I would have loved to be able to send a thousand calorie breakfast down the pipe for some insurance, but it was just not possible. Fueling in an IRONMAN is called the "fourth discipline" for a reason - it is very difficult to get right. No one has the kind of built in reserves to last an entire race, and your digestive system is carefully evolved to come to a screaming halt during athletic endeavors. You have to take on calories as you go and stay ahead of the reaper, but you have to be careful about how you do it. I saw more than a few athletes "praying to the dusty ground" during this race. I was not too worried about the slim breakfast though because I had a well tested fueling plan for the race.

I was back at the hotel room at 0515hrs to pick up my Orange and Black special needs bags, as well as my Green "morning clothes" bag. I put all of my swim gear in my Green bag the night before, and planned on swapping it all out for my morning clothes once I got suited up for the swim. The wife and I jumped into the rental car and made it close enough to the starting line by 0530hrs. She took the obligatory "before" picture, gave me a kiss, and then headed back to the hotel to get the boy up.

I walked among the rapidly growing crowd of athletes as we made our way into the transition area for final race preparations. The first order of business was to drop off my Orange and Black special needs bags. Then I made my way back to the Red and Blue transition bags. I added some hydration to each, and put my athlete tracker into the Blue bike transition bag. Finally, I put my bike computer on my bike, and then got suited up for the swim.

I should probably expand on my swim "uniform". I wear a Tyr Hurricane Cat 3 wetsuit in size Large, a Tyr wrinkle free swim cap, then my goggles, and then the required IRONMAN swim cap. Sandwiching your goggles between two swim caps is a great way to keep them from being knocked off during the mass swim, and also affords you a bit more head insulation. I also wear some silicone ear plugs to prevent from getting dizzy during the swim. I am not normally prone to inner ear issues when I swim, but on rare occasions strange stuff happens.

After packing all of my morning clothes into my Green bag, I handed it over to one of the morning clothes bag volunteers and then headed over to the long lineup of athletes waiting to get into the water. The actual swim start is about 200 metres from the swim entrance, so you have a nice non competitive warm-up swim to the start line.

The pro-men entered the water first and started their race at 0645hrs. The pro-women enter second, and start their race five minutes later. While all of that was going on, the race volunteers do their best to get over 3000 age group athletes in the water as quickly as possible. Whether you are in the water or not, your race starts at 0700hrs so there is a lot of effort to keep that line moving. The line looked incredibly long, but I am pretty sure everyone was in the water on time.

I figure I was somewhere in the first third of age groupers waiting to get into the water. Tempe Town Lake was a lot lower this year so they had to continuously warn people to be careful when they got in the water. Despite that, somehow the top of my left foot scraped the bottom and I lost a nice chunk of skin - none of which I felt at the time, probably thanks to the adrenaline...

The water was not nearly as cold as I remember it being at the practice swim, but I did require a few minutes to acclimate before I felt comfortable putting my face in and swimming normally. The race officials told us the temperature was about 68F, which felt about right to me. I took my time making my way to the starting line, occasionally looking back and waving to the spectators on the bridges above. All things considered, it was the perfect warmup.

I took a spot about 20 metres back from the starting line on the far left side, closest to the buoys. This has the advantage of swimming the shortest distance, while still being far enough back that you do not get mowed over by faster swimmers. I treaded water while Mike "The Voice of IRONMAN" Reilly got the crowd excited. A few minutes before the starting gun, they played the Star Spangled Banner, which ended with a roaring crowd and more than a few athletes yelling "Play Ball!".

Once the gun went off it was down to business. I am not a fast swimmer, so my plan was to draft as much as possible and make it out of the water sometime between 1:20 and 1:30. The early parts of the swim reminded me of what it would probably be like to be a member of a zombie horde. You really cannot see or hear much, and everyone just stumbles along more or less in the same direction.

In general I just plodded along doing my best to keep clear water in front of me and sighting from one buoy to the next. I forgot to make a count of the buoys before the swim started, so I settled into a sustainable groove and kept following the yellow buoys until that gorgeous red turnaround buoy appeared in the distance. The way back is easier to swim because the field of swimmers is a lot more spread out and you can judge your remaining distance by sighting the two bridges just before the swim exit.

As for complications, I barely ran into any at all. Until you get past the turn buoy, the big struggle is to find clear water and avoid athletes who suddenly stop. If you feel like you need to stop during a mass swim, please turn backwards to face oncoming traffic. Most swimmers are more focused on buoy sighting, so there is little chance that they will see you in time.

Other than that, the other big thing to watch out for is swimmers who converge into you. Shortly after the start you are more or less in a pod of people going about the same speed, but not exactly the same direction. The challenge is to "de-couple" once you find yourself converging with another swimmer. Your strokes tend to become synchronized and you have to work at making sure there is enough spacing between you. If there is clear water, you can adjust pretty easily. Otherwise you just have to accept that you are going to bump into someone a few times while you get things sorted out. Most people are cooperative and do their best to make room, although a small minority seemed to want to hold their line at all costs.

All told I got hit in the face twice, and had a few additional bumps here and there. Otherwise everything was fine. I heard some stories of people taking a foot to the face, but none of them appeared to have suffered any real injury. Another athlete told me stories of people swimming over the top of him, but nothing like that happened to me. The best way to avoid anything like that is to be realistic about your swimming abilities and start a bit further back than you think you should.

As you cross under the two bridges near the end of the swim, you can really hear Mike Reilly and the crowds cheering the athletes on. The crowd noise and the image of the swim exit as you round that last corner were really motivating and it made that last leg of the swim a lot of fun. I have to admit that I was a little sad for that part of the race to be over - and trust me, I am no big fan of swimming.

Since the water was so low this year, the bottom step of the swim exit was above the water level. This required some effort to actually get out of the water. The idea was to put your back to the exit and hoist yourself up into a sitting position on the bottom step. Then you twist around, and use the rail to pull yourself to your feet. A volunteer is there to help, but I was surprisingly stable getting out of the water and did not need any help.

The first order of business was to raise my goggles to my forehead and strip my wetsuit down to my waist in one graceful motion - all while walk-running with a large pack of athletes who are doing more or less the same thing. Next you encounter the wetsuit strippers who have you lay down so they can get the rest of you out of your wetsuit in about 3.5 nanoseconds.

Once I had my wetsuit off, I made my way over to the changing tent while stripping off my swim caps, goggles, and ear plugs. I passed by the Blue bike transition bag area, yelled out my number and my bike transition bag magically appeared in my hand courtesy of a very helpful volunteer. Since I finished the swim in 1:25, the most average time imaginable, it was prime time in the changing tent.

I managed to find an open chair, and used it to hold my swim gear while I rummaged through my bag for my bike gear. Contrary to what you would imagine, you really do not need a towel in T1. You may be a bit wet, but it dries off incredibly fast, and even putting on socks is not that hard by the time you get to the changing tent. The only issue I encountered was all of the dried grass that sticks to your feet - I was still picking it out of my luggage after we got home. For that reason alone, I will probably bring a small towel next time to get the gunk off of my feet before I put my socks on.

Some of the athletes were doing a full change of clothes, I opted to remain in my tri-suit for the bike - which turned out to be a good idea. Once I was ready to ride, I stuffed my swim gear into my Blue bike bag, handed it off to a volunteer, and then went over to the Sunscreen volunteers to get all of my pasty white Irish skin covered. From there I headed over to my numbered bike location, shoved my cleat covers into my saddle bag, and walked my bike out of the transition area and to the bicycle mount line.

Once I crossed the bicycle mount line, I was officially out of T1 and on to the bike portion of the race. My target speed of 18.8 mph has me through the bike course in just under 6 hours and leaves me with plenty of "juice" to run the marathon. On a flat course with relatively calm winds, this translates to around 175 watts, well under 80% of my FTP (Functional Threshold Power) of 267 watts. If I went all out, I could probably do the course in under five hours, but I would have absolutely nothing left for the run.

Like my old Chief Engineer used to say, no plan withstands first contact with the enemy. The winds turned out to be a sustained 40 knot headwind on the climbing portion of the course. I later found out that they were the strongest in the 11 year history of the race. This makes it all the more amazing that someone broke the course record this year - two time Olympian, Brent McMahon finished in 7 hours 55 minutes!

Despite the wind I was still able to complete the first lap exactly on schedule. I took stock of my situation after that, and realized there was no way I was going to have anything left if I kept the same pace for the remaining two laps. I dialed it down quite a bit and did my best to make up time on the downwind side of the course. I lost 15 minutes on the second lap and 30 minutes on the third lap. I think I could have done better, but after my complete meltdown on the run at IRONMAN St. George, I was trying to be as cautious as possible.

Another issue on the bike was my fueling plan. Originally it called for a mix of Honey Stinger gels and mixed nuts - something I had tested throughout my training. Unfortunately my stomach completely shut down just after the beginning of the ride, and I had to abandon all forms of solid food and stick to gels (one every ten miles). This was not nearly enough calories to get me through the race, but it was better than nothing. I put a can of Red Bull in my special needs bag and downed it during my second lap and that helped immensely. About five minutes after drinking it the world got brighter and AC/DC poured forth from the skies! I have a lot of work to do on my fueling plan for next year, but I am fairly certain that more Red Bull will be part of it.

One thing I did get right was to not waste any weight carrying my own hydration. The volunteers have stations set up every ten miles with a variety of drinks and food, including water bottles with pop tops that fit perfectly in your bike cage.

As I got closer to the bike leg finish, I was quite ready to get off the bike. A tri-suit does not have the usual amount of padding, and riding in a hunched over "semi-aero" position takes its toll after a while. Aside from the positioning issues, I came into the bike transition feeling really good. About a mile out I started loosening my shoes, and by the dismount line I was able to pull my feet out and leave the shoes attached to the pedals. A volunteer took my bike while I trotted over to the run transition bag area. I yelled out my number, a volunteer handed me my bag, and I was on my way into the changing tent once again.

The changing tent was still chaotic, but not nearly as much as during the T1 transition. I found a seat and got to work switching out my bike gear for my run gear. Instead of doing the Marathon in my tri-suit, I opted to change into traditional running gear. It took me an extra few minutes, but it added a lot of comfort to a very long run. Also, in future races I may try doing the bike ride without any socks. I do not believe the socks helped me at all, and I ended up changing into a new pair for the run.

I noticed in the changing tent that my right eye was very cloudy. I thought my contact lens had gotten "gunked" up, but my right eye was still cloudy after removing the lens that night. I have no idea what it was, but the cloudiness was gone when I woke up the next morning.

Once I was ready to go I stuffed all of my bike gear into my run transition bag, handed it off to a volunteer, and hit the sunblock station. I should note that I was surprised at how little the sun seemed to affect me until I noticed a very red silver dollar sized area on my back the day after the race. The sunblock applicators missed a small spot and I had a very ominous demonstration of just how bad I would have been burned had I not been so diligent about being covered.

Looking back at IRONMAN St. George 70.3 in May, 2013, I remember feeling like death when I left T2. 13.1 miles seemed like a lot at the time, but I was incredibly grateful to not have a whole marathon ahead of me. Much of my training since then has focused on making sure that never happens again. I learned to budget my energy on the bike better, and I did a lot of bike to run training to get used to the feel of running after a bike ride. It seemed to pay off this time because I felt amazing once I started running. Truth be told, I felt like I had not even ridden a bike at all. Granted, this feeling did not last very long, but I felt very happy knowing that I had made some major progress on one of my biggest problems.

My first mile was a respectable 9:17, and the next six averaged just over ten. From there my average settled in at 12:32 per mile. This was actually a slower overall pace than IRONMAN St. George, but the distances were much longer and I felt a lot better. All things considered, I feel like it was a major improvement. For comparison, when running fresh, I can easily lay down 8 minute miles for a half marathon, and I just did my first ever sub-20 minute 5k.

Once again my digestive system completely shut down, and I was not able to take anything in but water. This happened shortly after the first mile, and did not let up for the next five miles. I felt certain that I was going to puke a few times during that period, especially after forcing myself to down a gel at mile three, but nothing happened and the feeling slowly passed.

I have no idea why all of these digestive issues happened to me, but I will be looking into it as part of my 2015 training plan. After the sixth mile, I started drinking watered down Coke with some ice in it at every aid station, and added cups of warm chicken broth once they started making them available after sundown. My body tolerated all of that quite well. Ultimately my performance is going to be limited if I do not solve this fueling problem...

I managed to run the first six miles, only walking briefly through the aid stations. After mile seven my quads really started to hurt and my walk through the aid stations took longer and longer. By mile 15 I met up with another racer who was going my speed, and we started a pattern of walking a quarter mile and running three quarters of a mile. It was painful, but doable. We also had some great conversations that did a lot for our mental focus.

By mile 24 you can really hear Mike Reilly and the crowds in the distance. We hit the last aid station at mile 25 and did a little extra walking so we could hit the finish strong. At the last 0.2 miles, the road bends to the right and goes up a slight incline. This is where the crowds start to line up, and they get thicker and thicker as you enter the finish area. As we approached the corner I felt like it was time to put what energy I had left into the final run to the finish. I thought my running partner was going to come with me, but as I picked up speed, he wished me well. I told him I would see him at the finish line and took off. It felt good to pick up speed like that, but I knew I could not sustain it for very long.

The finish was an absolute blur. All I remember seeing through my cloudy vision was a lot of flashes and the approximate location of the finish line. I vaguely remember hearing my name called and the title of IRONMAN conferred on me by Mike Reilly, as well as the cheering crowd noise in the background. I also remembered to not touch my Garmin watch until well after I crossed the finish line. They warn you about this in the race packet. Apparently a lot of athletes cross the finish line with their head down and their hand pressing buttons on their watch. It makes for a terrible picture as you cross the finish line.

As soon as I crossed the finish line I stopped running and nearly fell over. One of the volunteer catchers grabbed me and held me upright while another volunteer removed my timing chip and gave me a foil blanket. My catcher walked me over to get my finisher medal, hat, and t-shirt, and then took me to the picture station to get my finisher picture taken. Finally, she brought me over to the food tent, put me in a chair, and got me some of the best tasting cold pizza in the whole freaking world. Right next to the food tent was a free massage area, which I took full advantage of. I am not sure if it was the 13+ hour effort, or the magic hands on my masseuse, but that massage felt amazing.

Other than finding it hard to walk, the only real issue after finishing was that I could not regulate my own body temperature. I am not sure what I would have done without that foil blanket.

The whole area from the finish chute on back to the rest area is for athletes only, so the wife and the boy had to greet me from the fence. I was really happy to see them, but could barely get out of the chair to give them a hug. It turns out they had already gotten my bike out of the transition area and turned it in to the TriBike Transport people. They also picked up my transition bags and were ready to go as soon as I was rested enough to walk out of there. Since they ended up parking a mile away from the finish line, we took a bike taxi to the rental car. Normally I would never pay for something like that, but this time it was worth every penny - plus the guy had some killer tunes playing on his sound system.

We got back to the hotel where I had a nice soak in the tub to wash the stink off, and then hit the sack feeling very satisfied. I lounged around the hotel the whole next day while the wife and boy went to do some college campus tours and check out Sedona. I was really sore for the next few days, but by the second day after the race, I felt good enough to race the boy up several flights of stairs - which I won quite handily.

I want to save the final words in this post for the amazing volunteers. At every station and situation, the volunteers were well trained, highly enthusiastic, and ready to help in any way possible. I did not suffer a moment of confusion, or unnecessary discomfort thanks to them. They did their best to energetically support all of the athletes from sunrise to long after sunset and I have nothing but effusive praise for them. I wish all of the volunteers the very best and give them my sincere thanks for their time and energy!

Swim Gear
  • Body Glide (Makes it easier to get into the wetsuit)
  • Wetsuit
  • Base swim cap
  • Goggles
  • Top swim cap
  • Defogger (I never ended up using this because my goggles were still fairly new)
  • Ear plugs
  • Garmin 910xt


Blue Bag (T1 - Swim to Bike)
  • 220 Calorie bottle of Ensure (Ended up drinking this)
  • Can of Red Bull (Cannot remember if I drank this)
  • Water bottle with plain water in it (Took a few swings of this)
  • Chamois Butt'r (I used tons of this in the morning, so none was needed)
  • Mole skin (I used this for a spot on my foot that tends to chafe a lot)
  • Socks (I wore these, but may not do so again at the next race)
  • Bike shoes
  • Helmet
  • Sunglasses
  • Athlete Tracker


Orange Bag (Bike Special Needs)
  • Red Bull (I ended up drinking this)
  • Snickers (Never ate it)
  • Chamois Butt'r
  • Fruit snacks (Never ate 'em)
  • Moleskins (Did not need them)


Red Bag (T2 - Bike to Run)
  • Amphipod with mixed nuts (Did not end up using this)
  • Fuel belt with race number and 10x Honey Stingers (Only used one Honey Stinger)
  • Small towel (Used to clear sweat out of my eyes; only needed it once on the run)
  • Chamois Butt'r
  • Socks (Definitely used these)
  • Moleskin (Had to re-apply because the first one came off with my bike socks)
  • Running Shoes
  • White running cap (Very helpful in all conditions)
  • Bottle of water (Took a few swigs from this)
  • Running shorts and tech shirt (Changed into these in the changing tent)
  • Tube of salt pills and some chewable Pepto (Took all of it)


Black Bag (Run Special Needs - I never used any of this)
  • Tube of salt pills and some chewable Pepto
  • Moleskins
  • Chamois Butt'r
  • Pro Bar
  • Red Bull
  • Snickers
  • Beef Jerkey
  • Fruit Snacks


Other stuff I packed in my giant duffle bag...
  • Bicycle Pump (Came in very handy)
  • Garmin 910xt charger
  • Garmin 800 (So I could read my stats on the bike without looking at my watch)
  • Garmin 800 charger
  • Pedal Wrench (Did not need it)
  • Cassette Socket (Did not need it)
  • Torque Wrench (Used it, but could have left it at home)
  • Socket Set (Used it, but could have left it at home)
  • Crank Tightener (Did not need it)
  • Chain link tool (Did not need it)
  • Precision driver set (Handy for changing batteries in the hear rate monitor, etc)
  • Scissors (Surprisingly handy)
  • Bike mounted fuel pouch (Very handy for storing gel wrappers, and solid food)
  • 4x Bike bottles (I used three of these)
  • Spare CR2032 batteries (I did not need any, but was glad to have them)
  • 2x Spare tubes (Thankfully did not need these)
  • Di2 charger (Did not need it)
  • Electrical Tape (Fantastically useful for mounting gels to bike top tube)
  • Clear plastic tape (I forget why I had this...)
  • Safety pins (Very useful for double securing race chip)
  • Sunblock (I should have used more of this, I got a light sunburn on Thursday...)

And last but not least, my official race results:

Swim
  • Distance: 2.4 miles
  • Split Time: 1:25:26
  • Race Time: 1:25:26
  • Pace: 2:12/100m
  • Division Rank: 238 of 502
  • Gender Rank: 1112 of 2270
  • Overall Rank: 1427 of 3202

T1: 00:08:32


Bike
  • Distance: 112 miles
  • Split Time: 06:41:31
  • Race Time: 08:15:29
  • Pace: 16.74 mph
  • Division Rank: 246 of 502
  • Gender Rank: 1098 of 2270
  • Overall Rank: 1366 of 3202

T2: 00:07:49


Run
  • Distance: 26.2 miles
  • Split Time: 05:24:09
  • Race Time: 13:47:27
  • Pace: 12:22/mi
  • Division Rank: 244 of 502
  • Gender Rank: 1062 of 2270
  • Overall Rank: 1358 of 3202

Finisher Breakdown
  • 2390 finishers out of 3202 signed up.
  • 1696 male finishers out of 2270 signed up.
  • 378 male 40-44 finishers out of 502 signed up.
  • 2639 registered participants started the race.
  • 563 registered participants had a DNS (Did Not Start)
  • 241 registered participants had a DNF (Did Not Finish)
  • 8 registered participants had a DQ (Disqualified)

My Overall Percentiles
  • Male 40-44: 51st percentile (registrants), 35th percentile (finishers)
  • Male: 53rd percentile (registrants), 37th percentile (finishers)
  • Overall: 57th percentile (registrants), 43rd percentile (finishers)

Tuesday, December 02, 2014

IRONMAN Arizona Trip Report Part I

[Note: I wrote this mostly as a reminder for myself, but I think it might be helpful to other triathletes as well. I recognize that it may seem overly detailed, but triathlons are complicated affairs that require some trial and error to get right.]

I participated in IRONMAN Arizona 2014 on Sunday, November 16, and 
this is Part I of my trip report. If you are bored by detailed rundowns of packet pickup, and practice swims, you can jump directly to Part II for the race day action.

This trip really started back in November of 2013. IRONMAN Arizona is so popular that the only way to ensure a spot is to volunteer for a race. This gives you the right to register on-site Monday after the race. The lineup for volunteer registration seemed to start around 0300hrs for a 0800hrs registration. I got in line around 0430hrs and, despite being pretty far back, had no trouble getting a spot on the 2014 roster.

After volunteers, the general public can register onsite, and finally registration is opened online. In 2014, I heard that online registration ended five minutes after it opened. I just checked on the 2015 race and there was no online registration. The race filled up from onsite registration alone! If you are willing to pay double ($1,450), at the time of this writing there are some IRONMAN Foundation slots still open for the 2015 race.

One of the benefits of getting into the race is the right to sign up for the next year's race during packet pickup. If you plan to do this race multiple times, it is a real benefit. I have some specific goals in mind that are going to take a few years to reach, so it was worth it for me to invest in the volunteer trip.

Volunteering for the previous year's race also had some benefits that went way beyond assuring a spot. If you have never done a long course (140.6) triathlon before, it really helps to watch how things go at the event before participating. It was also useful to get to know the town of Tempe as well. All of that made for significantly less stress when I did the race this year.

This year's race schedule started on Thursday. You could arrive as late as Friday, but there is so much to do prior to one of these races that arriving on Friday might make things uncomfortably busy. I wanted arrive even before Thursday to get better acclimated to the desert environment, but work and other responsibilities did not allow for it.

My plane landed around noon on Thursday and by 1300hrs I had my rental car and was on my way to Tempe Beach Park. By 1330hrs I was parked in downtown Tempe (downtown Tempe has tons of parking), and headed into the registration tent to pick up my race packet.

The first step was to show my driver's license. In return I got a card with my race number printed on it, a liability waiver, and a medical release waiver. I went to a table in the back corner to read the waivers and then sign and date both. The medical release waiver permits IRONMAN to release medical information to your family if something happens to you during the race, and the liability waiver is the standard legalese to remind you that you race at your own risk.

Once read and signed, you go to the second table to turn in your forms and receive your wristband. Your wristband is your ticket to all of the athlete areas - and trust me, security is pretty tight, they will check it a lot. It has your athlete number printed on it, and it cannot be removed without destroying it.

After receiving your wristband, you are directed to the packet pickup table. You hand them the race number card that you got at the first table, and in return you get your race envelope with your race stickers, your race bib, and your colored swim cap (green for males, pink for females, white for IRONMAN Foundation racers, and I believe grey for pros). A volunteer writes your number on your swim cap, answers any questions you may have, and then directs you to the next table to pick up some SWAG.

I passed on most of the SWAG because none of it looked that interesting to me - I have no use for posters and flashy brochures. I did pick up some spiffy baggage tags though. They are made of very durable plastic and come in handy when you want a nice label for your luggage.

The last table in the registration tent is the timing chip. They check the race number on your wristband and then program that into a chip. You can verify they have the right race number programmed into the chip because your name shows up on the computer screen when you hear that satisfying *beep* that signifies your chip is ready to go. The chip comes with an ankle holder that attaches via velcro. Despite being bulletproof and virtually impossible to fall off, purely out of paranoia, I weave a safety pin into both sides of the velcro. I also wear the chip facing the inside of my leg, out of concern that it may clip something if it is on the outside.

After completing the registration tent, they direct you to the merchandising tent to pick up your backpack and athlete bags. While it is possible that they do it this way to get you into the merchandising tent, judging by how crowded the registration tent is, it seems more likely that they simply ran out of room. I took a break before I went over to the merchandising tent to listen to the remainder of the mandatory athlete meeting.

The athlete meeting goes over a lot of what is in the athlete manual (published on the website), other details that may not be obvious, and they take questions from the athletes. I have done shorter triathlons and I always find these meetings useful, so I made it a point to attend. I ended up missing the first quarter of the meeting while I was in the registration tent, so I attended a repeat meeting on Saturday.

Back at the merchandising tent, I picked up my backpack and athlete bags. The backpack is a rather nice gift, and the athlete bags are part of your equipment to complete the race. Each bag is a different color and serves a different purpose.
  • Green - Morning Clothes
  • Blue - Bike Gear
  • Red - Run Gear
  • Orange - Bike Special Needs
  • Black - Run Special Needs

Most of that should be self explanatory, but I will briefly go over each one. All of the stuff you will need in T1 (transition from swim to bike) goes in the blue bag. All of the stuff you need in T2 (transition from bike to run) goes in the red bag. Your street clothes that you wear to the race in the morning go into the green bag. If you need anything to help you through the bike or the run, you can put those in the orange and black special needs bags. The special needs bags are made available to athletes at a designated location on the bike and run courses. I ended up using my bike special needs bag, but not my run special needs bag. I have placed a list of the contents of all my bags, and what worked and did not work, at the bottom of the Part II post.

Now that I was all checked in, my last stop was to the TriBike Transport tent to pick up my bike. This is my second event with TriBike Transport, and I have nothing but praise for them. They save me a *TON* of trouble by making sure my bike gets to the event and back safely. The alternative is to buy an expensive bike box, disassemble my bike, pack it in the box, pay extra to check it on the airplane, and hope that it arrives in one piece. TriBike has a vested interest in getting bikes to events without so much as a scratch on them. And the best part is that I get to hand my bike back to them, all sticky and nasty, right after the event. A few days later I get an email when it arrives back in Seattle.

At this point, I grabbed some dinner at an outdoor pub, loaded everything up into my rental car, and checked into my hotel.

I spent nearly all of Friday unpacking and organizing my race gear. Once I got things squared away, I filled my gear bags to get them ready for gear check-in on Saturday. This was also the time I spent mentally going over my race plan to make sure I was not missing anything. I am not sure how other people do this, but it took up a fair bit of space in the hotel room to accomplish this whole process.

Saturday was the practice swim and gear check-in. It is illegal to swim in Tempe Town Lake unless you have a permit, so the practice swim was the only time to "test the waters". I treated it just like the actual event swim and wore my wetsuit. They also require you to wear your racing chip so they can chip you in and out of the water. The line to get into the swim was pretty long, so I recommend getting there closer to when it opens. The practice swim course was an 800 metre version of the actual event swim. They gave you the option of swimming all or part of it, or perhaps even going further. I opted to just swim the practice course, which took me about 20 minutes and ultimately registered 0.63 miles on my Garmin watch. The water felt surprisingly cold, even though it was tested to be 68F. I guess I am too used to swimming in the 80F water at my local pool.

The practice swim had an athlete gear storage area just outside of the swim entry. There was no privacy, just a fenced off area with stakes in the ground marking athlete number ranges. As long as you wore your bathing suit under your street clothes, you could change into your wetsuit right there and drop off your gear in your numbered area. When your practice swim is over you do the reverse. I also opted to hang my wetsuit on the fence so that it would dry in the sun. By the time I picked it up after gear check-in, it was nearly completely dry.

I took my swim gear (minus the wetsuit) back to the car and traded them for my bike, run gear bag, and bike gear bag. Overall the check-in process was extremely straightforward. I rolled my bike into the T1 transition area, found my race number and racked my bike on the bike holder. I then went over to the bike and run gear bag areas and placed my bag near the section that contained my race number. I have to admit that their race numbering was a bit hard to read, but they had volunteers helping us get our bags in the right place. After gear check-in closed the volunteers did a thorough check to ensure the bags were in the right order.

I ended Saturday's activities by attending the last athlete meeting to pick up whatever I missed in the first athlete meeting.

Continue on to part II...

Sunday, November 02, 2014

Purple Stride 5K

The boy and I ran the Purple Strider 5K today. It was a great race for a great cause!

I managed to nail a personal best time of 19:53, and the boy came in at around 24:30.

Sunday, September 14, 2014

Another Sprint Triathlon

The boy and I did another Sprint triathlon today. This one was a 0.5 mile swim, 11 mile bike, and 2.8 mile run. As usual, the boy smoked me on the swim, but I managed to catch up to him on the bike at the 2.3 mile point. Here are the results (out of 123 finishers):

The Boy:
  • Place Overall: 37
  • Overall Time: 1:22:43
  • Division Place: 1
  • Swim Rank / Time: 14 / 00:13:52
  • T1: 2:59
  • Bike Rank / Time: 66 / 00:38:57
  • T2: ??
  • Run Rank / Time: 80 / 00:26:54


Me:
  • Place Overall: 11
  • Overall Time: 1:14:54
  • Division Place: 3
  • Swim Rank / Time: 33 / 00:15:38
  • T1: 2:52
  • Bike Rank / Time: 10 / 00:32:17
  • T2: 1:31
  • Run Rank / Time: 29 / 00:22:36

Saturday, June 28, 2014

Sprint Triathlon

The Boy and I did a sprint triathlon today (0.25 mile swim, 14 mile bike, 3.1 mile run). He smoked me on the swim, but I cleaned up on the rest. Here are our results (out of 154 finishers):


The Boy
  • Place Overall: 103 
  • Division Place: 3rd (15-19) 
  • Swim Rank/Time: 18 / 0:06:38.0 
  • T1: 0:02:15.6 
  • Bike Rank / Time / Speed: 101 / 0:49:07.2 / 17.1MPH 
  • T2: 0:01:06.8 
  • Run Rank / Time / Speed: 126 / 0:28:28.6 / 9:11/M 
  • Overall Time: 1:27:36.2


Me:
  • Place Overall: 38 
  • Division Place: 7th (40-44) 
  • Swim Rank/Time: 79 / 0:08:36.4 
  • T1: 0:01:21.7 
  • Bike Rank / Time / Speed: 31 / 0:39:15.1 / 21.4MPH 
  • T2: 0:01:07.3 
  • Run Rank / Time / Speed: 61 / 0:23:11.4 7:29/M 
  • Overall Time: 1:13:31.9

Downloading FIT files manually from a Garmin 910xt

When Garmin switched from their ANT agent to Garmin Express, the first version(s) of Garmin Express would not save the FIT files on your machine after it sync'd with Garmin Connect. The switch from the ANT agent to Garmin Express also broke connectivity with Strava and any other website that relied on the Garmin web browser plugin.

The workaround was (is) to upload FIT files directly to any site that got their plugin connectivity broken. Since the FIT files were deleted with earlier versions of Garmin Express, they could not be found to upload (catch-22). The fix is to extract the files manually with the 
Garmin-Forerunner-610-Extractor tool - yes, it works on the Garmin 910xt despite the name.

Here are detailed instructions for installing and running the manual extraction tool on an Apple machine running OSX Mavericks or later (and probably Linux). I have no idea how to do this on a win-tel machine. Also note that this how I personally got things working. Your mileage may vary, and I am not responsible for any problems that arise out of the use of these instructions. If you have problems, feel free to post a detailed explanation of what went wrong, and I will try to help.

In your web browser go to http://www.libusb.org/ and click on the link to "Download the latest release tarball" of libusb (Currently libusb-1.0.18).


[Note: A few people have missed the capital "D" in "Development" and "Documents". The OS X HFS+ filesystem is case sensitive, so you must be sure to get the case correct.]
  1. Open the terminal (You can find this by opening the finder and selecting "Applications" and then "Utilities". Double click on "Terminal"). 
  2. Type the following command in the Terminal: mkdir -p ~/Documents/Development && cd ~/Documents/Development 
  3. Type the following command in the Terminal: git clone https://github.com/Tigge/Garmin-Forerunner-610-Extractor 
  4. Type the following command in the Terminal: cd ~/Documents/Development/Garmin-Forerunner-610-Extractor/ 
  5. Type the following command in the Terminal: sudo easy_install pyusb 
  6. Type the following command in the Terminal: cp ~/Downloads/libusb* ~/Documents/Development/Garmin-Forerunner-610-Extractor/ 
  7. Type the following command in the Terminal: tar -zxvf libusb-* 
  8. Type the following command in the Terminal: cd libusb* 
  9. Type the following command in the Terminal: ./configure && make && sudo make install 
  10. Type the following command in the Terminal: cd .. 
  11. Turn on your Garmin device. Once it is fully started, plug in your ANT USB stick. 
  12. Type the following command in the Terminal: sudo python ~/Documents/Development/Garmin-Forerunner-610-Extractor/garmin.py 
  13. If this is the first time you have done this, your Garmin 910xt should ask if you want to pair with the Garmin Extractor device. Select "Yes" with the arrow button and press the "Enter" button. 
  14. The FIT files will now start downloading (including those that Garmin Express and the ANT Agent will not download). 
  15. When the download is complete, you can find them in ~/.config/garmin-extractor/$NUMBER/activities ($NUMBER is unique to your device, it should be the only numbered directory in ~/.config/garmin-extractor). This is the directory you will select files from when you need to upload them to sites like Strava. 
Repeat steps 1, and 12 - 16 for subsequent extractions.


Update:

When running step 12, if you get an error similar to the following, it is probably because you have some other program accessing the ANT USB stick, like Garmin Express, or the old ANT Agent. Simply shut down the program in question, reinsert the ANT USB stick, and attempt step 12 again.

Driver available: [, ] - Using: ant.base.driver.USB2DriverTraceback (most recent call last):  File "garmin.py", line 336, in main    g = Garmin(options.upload)  File "garmin.py", line 137, in __init__    Application.__init__(self)  File "/Users/chuckwolber/Documents/Development/Garmin-Forerunner-610-Extractor/ant/fs/manager.py", line 82, in __init__    self._node = Node()  File "/Users/chuckwolber/Documents/Development/Garmin-Forerunner-610-Extractor/ant/easy/node.py", line 48, in __init__    self.ant = Ant()  File "/Users/chuckwolber/Documents/Development/Garmin-Forerunner-610-Extractor/ant/base/ant.py", line 59, in __init__    self._driver.open()  File "/Users/chuckwolber/Documents/Development/Garmin-Forerunner-610-Extractor/ant/base/driver.py", line 180, in open    dev.set_configuration()  File "build/bdist.macosx-10.9-intel/egg/usb/core.py", line 559, in set_configuration    self._ctx.managed_set_configuration(self, configuration)  File "build/bdist.macosx-10.9-intel/egg/usb/core.py", line 92, in managed_set_configuration    self.backend.set_configuration(self.handle, cfg.bConfigurationValue)  File "build/bdist.macosx-10.9-intel/egg/usb/backend/libusb1.py", line 741, in set_configuration    _check(self.lib.libusb_set_configuration(dev_handle.handle, config_value))  File "build/bdist.macosx-10.9-intel/egg/usb/backend/libusb1.py", line 571, in _check    raise USBError(_str_error[ret], ret, _libusb_errno[ret])USBError: [Errno 19] No such device (it may have been disconnected)Interrupted: [Errno 19] No such device (it may have been disconnected)


Update 20Nov2014:

I tested this with a Garmin FR60 and it worked great.


Update 02Jul2015:

If you get the following, error or something like it:

can't open file '/Users/Aaron/documents/development/garmin-forerunner-610-extractor/garmin.py': [Errno 2] No such file or directory

You probably neglected to capitalize the "D" in Documents and/or the "D" in Development. Look through the execution path carefully for "Documents" and "Development" and make sure you capitalize the "D".

Thursday, November 28, 2013

Juniper Network Connect and Mac OS

I run a Macbook Pro to do a lot of my software development. When I work from home I have to connect to the company VPN to push code updates to the repository server - which is done with the Juniper Network Connect client. Occasionally the VPN client will connect and then disconnect after five seconds with a message that begins with, "Your computer's routing table has changed...". There is some discussion of this on the 'tubes, but no one seems to have a solution in hand. I managed to solve it on my own.

The error message is correct, something is updating my machine's routing tables after the VPN connection is made. The simplest way to figure out what is doing this is to start killing processes until the VPN connection starts working - which you do with the "Activity Monitor" application (Macintosh HD -> Applications -> Utilities -> Activity Monitor).

After some experimentation, it appears as if VMWare Fusion may be the culprit. I say "may" because I ended up killing several other processes at the same time, so I cannot be certain that VMWare Fusion was the right one. However, in reading forum posts from others who have had this problem, VMWare Fusion seems to pop up quite often during the discussion.

Also, two other issues of note:

Running the VPN client from within a VMWare instance seems to work all of the time. Even when this is happening within the base Mac OS.

YMMV, but I usually have really messed up DNS settings once the VPN client disconnects. This can be solved by issuing the following two commands in the terminal:

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

sudo launchctl load /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

Tuesday, October 01, 2013

Chrome Annoyance

I am writing some code that involves the use of embedded Jetty 9 (Jetty as a POJO). To start with, I was doing some basic testing with a handler that would print a message to the console and then do a Thread.sleep(10000). The idea was to get it sleep long enough for me to kick off a bunch of requests (web browser tabs to start, eventually graduating to a curl script) to see how well Jetty 9 handled simultaneous requests.

No matter what I seemed to do, I could not get my code to respond to simultaneous requests. The requests always seemed to pass through serially. To make things worse, I just happened to be doing this development on a Windows 7 machine - which makes it pretty much impossible to sniff traffic on the localhost interface (yes, I know there are some possible ways to do that, but they are unreliable). So I was working in the blind and nothing seemed to be working...

Finally I managed to find the answer here. The problem was not my code, it was the Chrome Browser. Apparently you cannot open the same URL on multiple tabs at the same time. I fired up Firefox (pun intended) and everything worked like a champ.

So ah... What is the deal Google?

Thursday, September 19, 2013

PRP Therapy

I was diagnosed with a split tear in my left Peroneal Brevis. My guess is that it was an old Soccer injury that got lit up by all of the training. My options were surgery, or something a bit newer called PRP Therapy. Surgery was the least preferable because it leaves me unable to train for six months. PRP - which stands for Platelet Rich Plasma, enables the body to heal the split on its own. It is about 70% effective and is far less invasive, enabling me to get back to training in weeks rather than months.

The key problem with Tendons is that they have limited blood flow, which makes repair unlikely when damage exceeds certain limits. The lack of blood flow means that injuries do not get the benefit of the rich set of growth factors found in blood Platelets. PRP fixes that problem by injecting your own blood Platelets into the damaged area. The Platelets rapidly differentiate into growth factors that build a Collagen matrix. That Collagen matrix goes through a bunch of changes from one type of Collagen to another, eventually leaving you with a fully repaired Tendon.

In practice, PRP is pretty simple stuff. They draw a small vial of your blood and spin it down in a centrifuge. The bottom layer is all of your red and white blood cells, and the top layer is a yellowish substance that contains all of the Platelets and other stuff that your body uses to heal itself on a regular basis. When they showed me my vial of centrifuged blood, it appeared as if nearly half of the vial was Platelet "goo". The doctor mixed some of the Platelet solution with Calcium Carbonate fluid, to prevent clotting, and then injected it into the split. She was guided to the split by a Sonogram (made by Sonosite - that apparently costs $60,000).

Interestingly, the doctor was able to clearly see the injury with the sonogram, which made me wonder why I had to get an MRI for this injury in the first place. She told me that it was because the Sonogram device was very expensive, and it takes a lot of skill to use it in this manner. But she also agreed that things probably needed to change simply from a cost standpoint. An MRI costs $2000 ($1000 with insurance discounts), and a Sonogram is only about $150. She also indicated that they are training all of their new Fellows to diagnose injuries with a Sonogram.

I had the injection today, and am now in an air cast boot for the next two weeks while the first phase of healing happens. I will not lie, the injection stung a little. They used Lidocaine at the injection site, but I later found out that Lidocaine can inhibit the Platelet action, so they do not anesthetize the Tendon itself. Normally the only painful part of most procedures is the initial stick of Lidocaine. The secondary sting took me by surprise. Had I known it was coming I would have been able to ignore it - it really was not that bad.

Once the first phase of healing is complete, the next phase involves swimming, or light bike riding, in addition to the normal daily walking around. The second phase is supposed to last about two weeks and helps the collagen matrix go from a disorganized bunch of new cells, to a carefully aligned set of cells that will eventually heal into full fledged tendon material. At the four week point I can ease back into some cardio work with the Elliptical, and then the doctor sees me again at the six week point. If all goes well, I should be able to ease back into running after six or so weeks.

Not exactly the way I wanted to spend the Fall, but it sure does beat being out of commission for six months...


Air cast boot being inspected by Cisco...


Sunday, June 17, 2012

Dura Ace Di2 - Failure to Downshift

If you have a Dura Ace Di2 electronic shifter and you find that it cannot shift the rear cassette to a larger gear (downshift), you might have forgotten to put your rear wheel back on in the same gear in which it was taken off. The Dura Ace Di2 rear cassette electronic shifter does not appear to sense its position. My guess is that it has absolute locations for shift positions, and you can confuse it by putting the derailleur back on at a different position.

But wait! If you return your wheel to a different gear it should automatically find the gear it was previously on, simply because the derailleur  is in that position. For whatever reason, that may not always be the case with the Dura Ace Di2 electronic shifting system. I have had it happen both ways. Sometimes the chain moves to the right place on the rear cassette, sometimes it does not.

In my case, I solved this by removing the rear wheel and shifting all the way to the outermost gear. When I put the wheel back on, I made sure that the chain was on the outermost gear.

Thursday, December 15, 2011

Thank you Mr. Hitchens

In October of 2011 I attended the Texas Freethought Convention and got to see Christopher Hitchens receive the Richard Dawkins Award. During the question and answer period an eight year old girl asked Christopher what authors she should be reading. Christopher considered it for a moment and then told the girl that he would meet her in the hallway after the talk and give her a list. True to his word Christopher met the girl in the hallway and gave her his undivided attention. What follows are the pictures I took of Christopher talking with the young girl. The pictures were taken with my HTC EVO 8 megapixel cellphone camera.










Thursday, October 06, 2011

Benefits of Exercise... Need more proof?

I like to do the timed race up the Columbia Tower in Seattle. In the 2008 I did it in 13:28.25 and 2009 my time was 12:55.55. Both were done without any training and each time I knew that I could have done better. I missed the 2010 race altogether.

Sometime in September of 2010 I started training for the 2011 race. I managed to shave 30 seconds off of my 2009 time with only a few months of training and decided to push it even harder for the 2012 race. I also picked up a heart rate monitor a few months ago in order to get a more detailed understanding of how my body was responding.

As your aerobic capacity increases, your heart gets physically bigger and is able to pump more blood during every cycle. This causes your RHR (Resting Heart Rate) to slow down, which is a good way to track your progress. I got my heart rate monitor on 17Aug2011 and strapped it on for the night while I was sleeping. I added a daily run to my training and strapped on the monitor again last night (05Oct2011) to check my progress.

The results speak for themselves - the blue graph is my August data and the pink represents the current state of affairs.


(Click to embiggen...)

From a subjective standpoint, I feel a lot calmer and more relaxed. The little things do not bug me as much as they used to, and on nights where I cannot get in enough sleep, I feel perfectly fine the next day.

To be sure, the data is not perfect (you are not perfectly at rest while sleeping) and last night could have been an anomaly. I will continue to track this on a monthly basis and see if a true trend is developing. I like what I see so far though.

Monday, September 19, 2011

A lot of good that did...

Then: "I, Rick Perry, Governor of Texas, under the authority vested in me by the Constitution and Statutes of the State of Texas, do hereby proclaim the three-day period from Friday, April 22, 2011, to Sunday, April 24, 2011, as Days of Prayer for Rain in the State of Texas."

Now: "In the past seven days Texas Forest Service has responded to 176 fires for 126,844 acres."


Functional Evaluation

I have some iPad development to do in the near future and I need to learn Objective C. Since Objective C is a super-set of the C programming language, I figured I would finally work my way through the KnR C book. I taught myself how to program in C, which means I most certainly have some gaps in my knowledge that could be filled.

This is one of those embarrassing gaps that falls into the "everyone probably knew this but me" file...

 Somewhere at the end of chapter 2 it says:

"C, like most languages, does not specify the order in which the operands of an operator are evaluated. (The exceptions are &&, ||, ?:, and ',' .) For example in a statement like x = f( ) + g( ); f may be evaluated before g or vice versa; thus if either f or g alters a variable on which the other depends, x can depend on the order of the evaluation." 

This whole time I had naively assumed that evaluation was always done from left to right...

Friday, July 01, 2011

Military Grade Security

Quick back of the napkin guess about the government's current ability to crack passwords... There are probably a lot of flaws in reasoning. Feel free to point them out and I will adjust accordingly.

In 1998 the EFF built a machine called Deep Crack for about $250,000. It was capable of checking 90 Billion 56 bit DES encryption keys per second which means the whole keyspace could be searched in about nine days.

Speculation begins here...

Assumption 1: Moore's Law holds when it comes to dedicated decryption hardware. If you could check 90 Billion 56 bit keys per second in 1998 for $250,000, and there are (rounding up) seven doublings over the ensuing 13 years, then you could check 2^7 * 90,000,000,000 = 11,520,000,000,000 56 bit keys per second in late 2011 for $250,000.

Assumption 2: You can check 2 AES keys (regardless of size) in the time you can check one 56 bit DES key. This puts the late 2011 capability at 23,040,000,000,000 keys per second for $250,000 dollars.

Assumption 3: The federal government can afford a lot more than $250,000 for a password cracking rig. I figure $10 Billion is an entry level price before it starts to attract attention, so that ups the capability by about 40,000 times to 921,600,000,000,000,000 keys per second.

That puts us at about 913 quadrillion keys per second capability in late 2011... Or about 92,160,000 keys per second per dollar spent...

Monday, June 27, 2011

Camp Quest Ohio

Just got back from a camp counselor gig at Camp Quest Ohio. Easily the most amazing week of my life. The kids were incredible and the program went off like a well oiled machine. Many thanks to August Brunsman and his crew for running such a great camp.

I cannot wait to do it again and am especially excited about our efforts to do the same thing with Camp Quest NorthWest. I also have it on good authority that I have been missing out on a great experience over at Skepticon, so I plan to register for that at some point too.

Monday, June 13, 2011

Camp Quest NorthWest

Working a lot lately on setting up a Washington chapter of Camp Quest called Camp Quest NorthWest. Our rough goal is to have a full week camp going by 2013 with a type of weekend activity in 2012. It remains to be seen how close to that we land, but we are trying. Drop me a line if you are interested in volunteering, or simply think it might be fun to send your kid to a fun and interesting camp experience.