Friday, November 20, 2015

Half Marathon? Half Marathon

My darling wife likes to remind me that I'm not very good at hobbies. To be fair, I did tell her this some time ago. Of course, I also told her that only crazy people run farther than 6.2 miles, and that I am not crazy.

Way back in July, when I was running pretty fast 5K's on a business trip in England (because really, 3 weeks abroad is too long, and one can only drink so much beer), I had a conversation with a local Windsor gentleman about good runs in the area. He told me about Dorney Lake, where the Olympic rowing competitions had occurred in 2012. He said it was only about 4 miles from my hotel, which put a round-trip run decidedly into crazy-person range, but I figured it was a nice day, and there was nothing saying I had to run all the way.

So I charged up the iPod and headed out. The run was great for a while. The banks of the Thames river in July make for some fantastic scenery, and the boat traffic made a perfect backdrop to the day. So perfect, in fact, that I completely missed the mile-long lake on my right. By the time I realized my mistake, I had already run 7 miles, including a mile of doubling-back to find a way around a canal lock. That meant I was 6 miles from the hotel with only a river to guide me back home, and with storm clouds closing in, I was not interested in walking that 6 miles. Think of the poor iPod!

So I kept running. And running. And beginning to question my rules about crazy people. At 10 miles I convinced myself to sign up for a half marathon, if only for the humor of it. Let me be perfectly clear: what seems funny after 10 miles of running does not seem funny under normal circumstances. This was not rational thought.

At 11 miles I'd had enough. My legs were screaming, and even though I'd backed way off my usual pace (like way, way off), I knew I was in for some pain if I kept pushing.

But the seed had been planted. I needed to do a half marathon.

And as soon as I got back stateside, I signed up...and quit running.

Bikes had taken over my focus almost completely, and I'd already signed up for 3 races before I even bought my first road bike. Again--hobbies? Not really my strong suit. I bought a road bike in late August and put 500 miles on it over the course of 30 days, including a few rides in the 50 - 75 mile range.

Then I bought a winter bike for commuting and put another 400 miles on that in the next 30 days, all the while thinking that I might want to train for that half marathon at some point.

Once the last bike race was run, I realized I had only 2 weeks before the Richmond Marathon, my chosen event. I hastily rushed to the treadmill and bonked after only 2 miles. Two days later I made it 4.25 miles before begging myself not to puke all over the floor.

With exactly 7 days to the event, I decided to go all-in and do a 10-mile run outside. Once again I backed my pace down and made it 6.22 miles before my legs seized. And I mean seized. I couldn't run at all, and walking looked...interesting. I was 4 miles from home without a phone, so the only real option was to walk. I made it a mile before my legs loosened up enough to run tentatively. I managed to eke out another 5K at a really careful pace, and figured my plan for the half marathon would be:

run 10K
walk 1K
run 5K
walk 1K
run 5K

I didn't run another step for the next 6 days, and only jumped on the bike once for a short ride to test some repairs, so the plan to end with vomit looked really solid.

As did the alternate plan to stay home and play video games, instead.

Half-marathon day came, and with it the first cold weather we'd seen in some time. The temp at the start was in the upper 30's, and it maybe got to 50 that day. I rolled up in my cycling finest (Pearl Izumi's riding jackets are perfectly tailored for running, and with back pockets, I could carry my phone!) with literally seconds to spare. I even had to run about half a mile to get to the start.

And then I started. I set a goal pace of 7:45, which is not a race pace for me by any stretch, but I figured it would give me the best chance of making that first 10K. And one by one the miles melted away. The first 2 miles were occupied with passing. The next 3 were spent finding human metronomes. And once I found a guy who was banging out perfect 7:41's (seriously: 6 in a row!), I glued myself to him and stopped clock-watching.

I had decided prior to the event that I would drink water on the course, something I'd NEVER done before. I find it to be very disruptive to my tummy, but everything I'd read said I would pop at 10 miles if I didn't stay hydrated.

So I drank at every single table, but I didn't stop. Then at 8.5 miles, my metronome sped up and I went back to bad habits of watching my pace religiously.

At 10 miles I realized holy crap I'd run 10 miles. That, of course, called into question the ability to finish.

At 10.5 miles I realized I'd ignored my gel packs, and that it was probably too late.

At 10.6 miles I said "screw it" and had one on the run. Another new experience. The next mile was a mix of excruciating pain, hopelessness, and delirium. The water wouldn't go down at the water stop. My brain kept telling me "just a little over 2 miles" while simultaneously screaming "you'll never make another 2 miles feeling like this".

At 11.5 miles I realized I had it. I *was* going to make it.

At 12.1 miles I wanted to give up and walk. Came really close, too.

At 12.5 miles, when everybody on the sidelines was screaming "it's all downhill from here!", I realized that was really bad news: my legs do not like running downhill, especially after 12.x miles of NOT running downhill.

Then, as if by magic, the 13 mile sign popped up, and the downhill got so steep I just had to fly. Holding back was more painful than letting my feet slap.

And then it was done. Just like that. I heard my name and felt pretty frickin' amazing. It was only after making it through the finishers' corral, getting the hat, the medal, and the blanket, that I thought to check my time.

1:41:24. I'd gotten my pacing almost EXACTLY where I'd wanted @ 7:44, and I'd made it.

So...uh...I signed up for next year's marathon. Which is a distance only crazy people run.

Thursday, November 12, 2015

Goin' Fast Again...sorta

So I recently mentioned that I'd gotten a fancy new bike. It's a 2011 Blue Axino, hi-mod carbon/carbon tour-de-technologie dripping in fancy SRAM components. Or at least it was.

For, you see, no sooner had I gotten the bike than I rushed out and put as many miles on it as I could, racking up 499.5 before things went boom. It started simply enough, popping a spoke on a morning training ride. That took a trip to the shop, whereupon a neighboring spoke popped. They got me up and running just in time to take the bike on vacation, where I likely filled all of the moving parts full of sand.

Graveyard of the Atlantic Museum @ Cape Hatteras

Cape Hatteras Lighthouse

Then I took it out for a 64-mile ride with RABA(.org)'s Heart of Virginia Bike Festival, which was the farthest and longest I'd ever been on a bike up until that point.

RABA Heart of Virginia Metric Century

A couple weeks later saw me tackling mountain roads on a 75-mile ride with my good friend Daniel, and then the UCI World's came to town. All in all it was a fantastic time to have a really cool fancy bike in Richmond, VA.

But then a week later it all came to a grinding halt.
DoubleTap? NoTap.

The rear shift-lever snapped off one morning on a 12-mile morning warm-up ride, and nobody could fix it. Apparently, though the bike itself was a 2011, the parts were not. The previous owner must have just raided a parts bin for anything that said "SRAM Force", because the LBS said these components were circa 2006.

With no way to shift the rear cassette, the bike went from a 20-speed to a 2-speed, and parts to repair a 2x10 drivetrain were crazy expensive. Thus I decided to park the bike for winter and pick up a dedicated winter bike.

The winter bike would need to be relatively light, support panniers, be able to pull a trailer, run disc brakes (the HoVA ride was wet, and my fancy high-dollar rim brakes were all but useless), and have a semi-decent set of components for little money. That's a tall order for a bike, but I was astonished when Fuji's 2015 Sportif 1.1d checked every single tick-box for less than $1000.

Beautiful? YMMV, but visible!

Even better was the bright contrast-y red, which should not be mistaken for any flavor of weather or road condition, ever.

The bike features a Shimano 105 group-set, minus only the cranks & rings. Learning how to use it took almost 400 miles, since I'd just put 500 on a SRAM DoubleTap system, but it was so worth it. This bike weighs a full 7 lbs more than the Blue, but with naught but a saddle & seatpost change was easily 10x more comfortable. Beefier, yes, but one week after buying it I ran it in the Martin's Tour of Richmond Piccolo Fondo for 12th place overall.

I've since commuted the 22 miles to work on it several times, and have been very impressed at how capable it is. Sure, each wheel is a pound heavier than the Blue's Eastons, but I figured that would be great training for when the Blue was all fixed up. I even posted a Strava KOM on it while loaded down with 25lbs of laptops & lunch & extra clothes!

So after a few hundred miles on a Shimano drivetrain, I started worrying about switching back and forth constantly. It's hard going from one to the other--I've shifted up several times on climbs where I expected a double-shift down. And since the Fuji's new Shimano kit was smoother than the aging SRAM setup on the Blue, I bit the bullet and priced out a whole drivetrain replacement. It would be cheaper to do the whole thing (shifters, derailleurs, cassette, chain) with new components than just to get 2x10 SRAM Force shifters.

I ain't crazy, and I'm not throwing good money at bad, so I ordered basically a full Ultegra setup (minus the cranks & rings, because it came to me with a Dura-Ace 7900 crankset) and had the LBS install it. Even installed it still came up to just the price of the older SRAM shifters. Durn.

So last night, after a month of riding a 25 lb bike, I stepped onto my 18 lb beauty, and...was not impressed. The Ultegra components were amazing. Shifting was almost telepathically fast and 99% accurate, but the bike just didn't feel good under me.

You see, I spent months investigating bike sizes before buying it, and had bought a just-barely-too-large bike last year in my Giant Roam 2 hybrid. It took a lot of experimentation to get that bike to fit me...decently. With the Blue, all the sizing research said it was the perfect fit at 56cm, but everyone who saw me on a 56cm bike said I should drop to 54cm. The Fuji is 54, and it fits me like a glove.

So my shake-down ride was spent feeling like a kid on dad's bike. Some measurements of the two revealed pretty substantial differences in effective reach, and my attempts to compensate for that involved pushing the seat way too far forward. So now, in addition to all the drive-line bits, I'm throwing a crazy-short 70mm stem on it. That's a solid 40mm shorter than the one on there now, but should allow me to put the seat back where it belongs, reducing the stress on my back, and also bring the bars just a smidge closer, hopefully resulting in an overall more comfortable--and more powerful--riding position. A pro fit will follow, but given the price of a stem, it's hard not to swing at that first.

Thursday, October 08, 2015

Caution: PowerShell Nerd Alert

Yesterday morning I was asked to help with a SharePoint Online task that required identifying all personal MySites and modifying an attribute. This seems like a pretty straight-forward task for PowerShell, but it turns out there are some limitations on how SharePoint is accessible.

A check of my usual sources (Technet, Google, etc) informed me that what I was being asked to do wasn't directly possible. You can certainly make changes to individual MySites from PowerShell, but you cannot query for them without also knowing their URL's, which is ridiculous because how are you supposed to know the URL of something if you don't even know it exists?

Except it is possible.

The secret is to not query for the MySites, but rather for the users' email addresses, then to take that output and convert it into MySite format and append it to your tenant's URL configuration, and then query for the existence of that object.

It even turns out there's a convenient text conversion operator that's almost custom-tailored for the task. $_.windowsemailaddress -replace "\W","_" replaces all special characters in an email address with underscores.

And because running this without error control can result in a bajillion errors on users who haven't yet initialized their MySites, adding the try{} catch{} statement results in a clean output of your subset of users who have initialized their sites. You could modify the catch {} statement to generate a list of non-initialized users, if you felt so inclined.

Of course you could modify the whole thing to query only for licensed MSOLuser objects, too. That a cleaner implementation, but my goal was to reduce the number of installed components necessary on the system running the command.

The script assumes your userID is @*

Happy PowerShelling!

#   This script queries SharePoint Online for a list of personal MySites and their external sharing status.
#   In order for it to run properly, the machine on which it runs will need the following software installed:
#      1.  Microsoft Online Sign-In Assistant (
#      2.  SharePoint Online Management Shell (
#   Created 10/07/2015 by Adrian Amos, Synergy Technical, LLC

import-module Microsoft.Online.SharePoint.PowerShell -DisableNameChecking

#Get Admin Credential
$cred = get-credential

#Extract Tenant name from credential
$username = $cred.username
$tenant_full = $username | sls '(?<=@)(.*)' | select -expa matches | select -expa value | % {$_.trim()}
$tenant = $tenant_full.substring(0, $tenant_full.length - 16)

#Rename Powershell window to tenant name
$Host.UI.RawUI.WindowTitle = $tenant

#Connect to Exchange Online
write-host "Connecting to Exchange Online..."
$exol_session = new-pssession -configurationname Microsoft.Exchange -connectionuri "" -authentication basic -allowredirection -credential $cred
import-pssession $exol_session -disablenamechecking
write-host ""

#Connect to SharePoint Online
write-host "Connecting to SharePoint Online..."
$sharepoint_url = "https://" + $tenant + ""
Connect-SPOService -url $sharepoint_url -credential $cred

#Convert Email addresses for mailbox-enabled objects to SharePoint MySite format
write-host "Querying users..."
$email_addresses = @(get-mailbox -resultsize 2000 | select windowsemailaddress)
write-host "Converting email addresses to MySite subfolder names..."
$scrub = @(foreach ($email_address in $email_addresses) {$email_address.windowsemailaddress -replace "\W","_"})
write-host "Generating list of SharePoint MySites to query..."
$sp_mysite_list = @(foreach ($entry in $scrub) {$("https://" + $tenant + "" + $entry)})

write-host "Querying MySites..."
foreach ($sp_mysite in $sp_mysite_list) {try {get-sposite $sp_mysite | select url,sharingcapability} catch {}}