First ever triathlon (or how to check your ego)

Trying to change it up a bit and take a break from pounding pavement for 26.2 miles, it was decided to give it a go at a triathlon.  Now, while I can run until the cows come home, I can’t swim very well.  Actually, I’m like a fish… out of water… in the water.  That’s right, I flounder about never really sinking, never really moving forward, and never really doing anything in particular.  Oh, there’s a stroke and a kick here and there, but not sure if they are ever synchronized in any way.  Needless to say, this was going to be awesome!

The event picked was the Findley Lake Triathlon, consisting of an easy 400 meter swim, followed by a brisk 14.3 mile bike ride, and topped off with a swift 5k trail run.  I own a pair of Speedos, a bike, and some shoes, I was set.

Race Day

It is customary to be nervous on the day of a big event and I’m one to just need some quiet before an event to really harness my inner D.  However, for this event there was no inner D, the night before I had slept about 2 hours.  As I tossed and turned pondering what would happen if I drowned, I made a decision; the only way I was going to get out of that lake was either hauled out by a life guard or via the finish line.  Prayers were requested.

There were a total of 74 participants (this number is crucial) for this event, with probably 50 men and 30 women.  The swim was to start at 8 AM with the men and around 5-10 minutes later with the women.  It was an in-water start, which I enjoyed, with all of us lined up ready to start about 20 yards from the lake shore.  As the gun goes off, I hold on to the starting line and wait for the stronger swimmers to go out.  My strategy being that I would try to make a not too shallow parabola around the half way point, this would cause me to swim a bit more, but would also allow me the most flexibility if I were to stray too far or too close from the course.

I began my swim feeling pretty good and confident this would be over sooner than expected.  I began with a good steady free style stroke just to try and get as far along the course as possible while I was still fresh.  In my mind I’m sure I’m a quarter of the way there and it’s time to take a bit of a break.  I look up and notice I’m barely 10 meters in… yes, in what felt like ages and a great stroke, I advanced a mere 10 meters.  I switch it up a bit and go with a breast stroke to get some good breaths.  I look back and about 5 meters behind me there’s another male doing, what seemed to be, the doggie paddle.  I looked over a few more times and he seemed to be dedicated to this stroke and seemed intend on going the whole way using this stroke, I was not going to be passed by the doggie paddler.

I get to the half way point and the doggie paddler has made a wide turn around the bend, but is pretty much neck and neck with me.  At this time the first two women swimmers catch up and even stopped for a second to figure out which way to go around me.  They were the strong swimmers and I was the flounderer, they were going to need to go around me and did.  At this point I look to my left and see the doggie paddler getting ahead of me and realized this was going worst than expected.  However, hope was not lost.  I had made it to the half way point and knew that if there was a current it should take me to the shore.  I also knew that if there was a current in a lake, it would take days for me to wash up, so it was up to me to get to the finish line before the day’s end.  I begin a combination of doggie paddle and back strokes to ensure I keep my head above water as much as possible.  I’m sucking wind like it’s going out of style and my chest feels like it weights a thousand pounds.  I try to ignore the multitude of women passing me by and try to focus on what’s ahead, solid ground.

I take a break to try and get my bearings and realize that I’m about 15 meters away, this is it.  I will not be hauled away by a life guard.  I began a mad back stroke dash.  I bumped the finish line with my head and try to reach for the bottom of the lake.  I’m about chest deep in water and I begin to walk my way out of the water.  The smart thing to have done is to swim until you’re only tight deep in water and run the rest of the way, but I was so exhausted and so eager to use my legs that I didn’t care about one more stroke.  At this point I don’t notice anyone else in the water ahead of me and don’t dare look behind me to see if I’m last.  My objective was ahead and that’s all that mattered.

I get out of the water and get hosed down to clean up some of the grime from the lake.  Put on some shorts over my speedos and slide on some shoes and walk out of the transition 1 area with the bike next to me.  At this point I’m thinking I will make up some of the lost ground on the bike and on the run.  As I get on the open road I spot the first other person ahead of me.  I can tell it’s a female biker and she doesn’t seem to be going too fast.  In my mind I think, “first victim, here we go.”  I never caught up to her.  Actually, I was passed by 3 other people and lost sight of my first “victim”.  About half way through the bike ride I catch up to a 13 year old boy on a non-road bike; given it his all.  I told him good job as I passed him and thought to myself that kid will beat me in a year or two.

I finish the bike portion and switch shoes and get to running.  Here’s my bread and butter.  I had hoped for a decently flat course and wasn’t sure what to expect on this trail run.  I should have known better.  The trail run consisted of muddy areas, some very steep valleys and climbs and a lot of roots.  It was slow moving, painful descents due to bad knees, and a couple of twisted ankles.  I saw two other runners and was pretty sure I would cross the finish line and everyone would be gone.

Results

 

——- 1/4M Swim ——-

T1

——- 16M Bike ——-

T2

——- 5K Run ——-

Time

Total

Place

Name

Bib No

Age

Gender

Rnk

Time

Pace

Time

Rnk

Time

Rate

Time

Rnk

Time

Pace

Back

Time

59

David Macias

55

31

M

73

17:47.3

71:08

2:05.4

61

1:04:31.9

14.9

1:20.2

33

32:10.7

10:23

43:47.0

1:57:55.7


Yes, that’s second to the last place in the swim, with a staggering pace of 71 minutes per mile.  I improved to 61st place in the bike stage and 33rd place in the run with an overall place of 59th.

Aftermath

I will do another triathlon.  I will do another one and not be second to the last in the swim.  I will also get a swim coach to improve my atrocious so-called-stroke.  It was an absolutely great experience.  It’s amazing the level of athleticism a lot of these participants display and while I might never get there competing along side makes me feel good.  It’s incredible how fit these people are, specially when you compare them to marathon runners.  It’s a whole different breed of people.

~dmacias

The Rapture of Canaan – Sheri Reynolds

This book was recommended by a friend when we were talking about post-apocalyptic books like Alas, Babylon or The Road.  However, after reading the book I don’t know why he would recommend it as it really didn’t have much to do about the end of the world.  Regardless, it was an excellent read and I recommend everyone read it.

Two quotes that stood out were:

I started to wonder if James was really James or if James was really Jesus answering me with James’ face.  Then I wondered if that’s all God ever is – somebody who loves you enough to come back from the dead to visit every now and again.  Or if that’s all other people ever are – different faces of God walking around.

“Grudges are bad things, Ninah",” she said at last.  “There’s only so much room in one heart.  You can fill it up with love or you can fill it with resentment.  But every bit of resentment you hold takes space away from the love.  And the resentment don’t do no good noway, but look what love can do.”

~david

Android Development: Clickable TextView Relative Layout Using Tables

I’ve been playing around with the Google Android SDK, since there are a couple of mobile application ideas I’ve been tossing around.  However, since it’s been longer than 10 years since I’ve done any real Java development I’m taking it pretty slow and just getting used to the tools available for Android development.

The very first thing is to go through the tutorials that Google has put together, they will give you a very quick understanding on how Android is put together and what all the pieces do in order to construct an application.

Next, appearance is everything, so you need to get familiar with layouts and DroidDraw is the best tool available for understanding how things align.  Use the DroidDraw generated code as a template and play around accordingly.

Finally, play around.

The first application I wanted to create was a gym schedule for my local gym and I will be updating the world as I move along.  The first thing I’ve created is the layout and basic functionality of the application.  This will consist of a couple of rows with the pertinent information as well as a clickable text area which will provide more information about the class.  Notice that all data is static as this is just a framework for what I hope the final application to look like.

Here’s the final product as of this point:

image

The breakdown of the code is as follows:

colors.xml

   1: <;?xml version="1.0" encoding="UTF-8"?>

   2: <;resources>

   3:         <;color name="grey">#C0C0C0</color>

   4:         <;color name="black">#000000</color>

   5:         <;color name="light_grey">#A8A8A8</color>

   6: <;/resources>

main.xml

   1: <;?xml version="1.0" encoding="utf-8"?>

   2: <;TableLayout xmlns:android="http://schemas.android.com/apk/res/android"

   3:     android:layout_width="fill_parent"

   4:     android:layout_height="fill_parent"

   5:     android:stretchColumns="*">;

   6:     <TableRow android:background="@color/grey" >

   7:         <;TextView

   8:             android:textStyle="bold"

   9:             android:text="Monday"

  10:             android:padding="3dip" 

  11:             android:textColor="@color/black"

  12:             android:textSize="18sp"

  13:             />;

  14:     </TableRow>

  15:     <;TableRow android:background="@color/light_grey">

  16:         <;TextView android:text="Time" android:padding="3dip" 

  17:             android:textColor="@color/black" android:textStyle="bold" />;

  18:         <TextView android:text="Class" android:padding="3dip" 

  19:             android:textColor="@color/black" android:textStyle="bold" />;

  20:         <TextView android:text="Studio" android:padding="3dip" 

  21:             android:textColor="@color/black" android:textStyle="bold" />;

  22:         <TextView android:text="Instructor" android:padding="3dip" 

  23:             android:textColor="@color/black" android:textStyle="bold"/>;

  24:     </TableRow>    

  25:     <;TableRow android:background="@color/grey">

  26:         <;TextView android:id="@+id/Time" android:text="6:00 AM" android:padding="3dip" 

  27:             android:textColor="@color/black" />;

  28:         <TextView android:id="@+id/Class" android:text="Cycle" android:padding="3dip" 

  29:             android:textColor="@color/black" />;

  30:         <TextView android:id="@+id/Studio" android:text="C" android:padding="3dip" 

  31:             android:textColor="@color/black" />;

  32:         <TextView android:id="@+id/Instructor" android:text="Jamie" android:padding="3dip" 

  33:             android:textColor="@color/black"/>;

  34:     </TableRow>

  35:     <;TableRow android:background="@color/light_grey" >

  36:         <;TextView />

  37:         <;TextView />

  38:         <;TextView />

  39:         <;TextView android:id="@+id/MoreInfo" android:text="More Info >" android:padding="3dip"

  40:         android:textColor="@color/black" android:onClick="onClick" android:clickable="true"/>; 

  41:     </TableRow>

  42:         <;TableRow android:background="@color/grey">

  43:         <;TextView android:id="@+id/Time" android:text="7:00 PM" android:padding="3dip" 

  44:             android:textColor="@color/black" />;

  45:         <TextView android:id="@+id/Class" android:text="Fundamentals of Yoga" android:padding="3dip" 

  46:             android:textColor="@color/black" />;

  47:         <TextView android:id="@+id/Studio" android:text="GF" android:padding="3dip" 

  48:             android:textColor="@color/black" />;

  49:         <TextView android:id="@+id/Instructor" android:text="Eleanor" android:padding="3dip" 

  50:             android:textColor="@color/black"/>;

  51:     </TableRow>

  52:     <;TableRow android:background="@color/light_grey" >

  53:         <;TextView />

  54:         <;TextView />

  55:         <;TextView />

  56:         <;TextView android:id="@+id/MoreInfo" android:text="More Info >" android:padding="3dip"

  57:         android:textColor="@color/black" android:onClick="onClick" android:clickable="true"/>; 

  58:     </TableRow>

  59: </TableLayout>

.java file:

   1: package com.example.RelativeLayout;

   2: 

   3: import android.app.Activity;

   4: import android.os.Bundle;

   5: import android.view.View;

   6: import android.widget.Toast;

   7: 

   8: public class RelativeLayout extends Activity {

   9:     /** Called when the activity is first created. */

  10:     @Override

  11:     public void onCreate(Bundle savedInstanceState) {

  12:         super.onCreate(savedInstanceState);

  13:         setContentView(R.layout.main);

  14:     }

  15:     public void onClick(View v){

  16:         Toast toast = Toast.makeText(getApplicationContext(), 

  17: "Cycle/Spinning – Stationary bike cardio workout in a 

  18: group setting. Water bottles and a towel required 

  19: for attendance.", Toast.LENGTH_LONG);

  20:         toast.show();

  21:     }

  22: }

  23:  

~david

Playing around with Twitter API using Tweepy

Yes, this is the kind of stuff I find myself doing when I’m bored.  Just a quick tutorial on using the Twitter python library called Tweepy.  Examples include authentication, print your statuses, and print your mentions.

First, you need to authenticate using OAuth as simple authentication has been disabled by Twitter.  I will not repeat what has already been done, so this is the best way to do it.  If you have no problems with that example, then at the end you will have a simple python script which allows you to update your status via the command line.  However, the most important piece is the authentication:

   1:  #!/usr/bin/env python
   2:   
   3:  import sys
   4:  import tweepy
   5:   
   6:  CONSUMER_KEY = 'Your stuff'
   7:  CONSUMER_SECRET = 'Your stuff'
   8:  ACCESS_KEY = 'Your stuff'
   9:  ACCESS_SECRET = 'Your stuff'
  10:   
  11:  auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
  12:  auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
  13:  api = tweepy.API(auth)

This will allow you to authenticate against Twitter and be able to work with the API.  Now you can add to your python script the code below.

How about printing your status updates?

   1:  statuses = tweepy.Cursor(api.user_timeline).items()
   2:   
   3:  for status in statuses:
   4:          print " "
   5:          print status.text

How about printing your mentions?

   1:  mymentions= tweepy.Cursor(api.mentions).items()
   2:   
   3:  for status in mymentions:
   4:          print " "
   5:          print status.text

 

The Tweepy API reference has a ton of great information.  As well as the Twitter API wiki.

~david

mRemote and Cisco’s AnyConnect Client Issues

I love mRemote.  Makes keeping track of all the different connections (RDP, VNC, SSH, etc.) a breeze.  However, I’ve recently noticed that after I installed Cisco’s AnyConnect client I could no longer open my existing connections or create new connections.  Upon startup I would receive the following window:

mRemoteSecurityPassword

What I ended up having to do is remove AnyConnect and then disable FIPS encryption following this link http://support.microsoft.com/kb/811770.

WindowsPolicy

Works like a charm now.  More than likely you don’t have to remove AnyConnect, however I don’t use it that much and rather just remove it all together.

~david

PS: The mRemote project is dead at version 1.5, there’s a fork out there called mRemoteNG which I’m trying out check it out here http://www.mremoteng.org/.

Create Hyperlinks to Worksheets with Excel VBA

This took me a couple of hours to get working, which means that one of two things happened.  I am very rusty in my VB or nothing I found online made sense.  I’m going with a little bit of the former and a lot of the latter.

The problem I was facing is that I wanted to create an Excel dashboard which linked worksheets in the file.  I wanted to do this dynamically using VBA in order to be able to get a snapshot of the whole workbook without having to go sheet by sheet.

The final code looks like this:

   1:  LinkToSheet = "'" & Sheets(i).Name & "'!A1"
   2:  NewSheet.Hyperlinks.Add Anchor:=NewSheet.Cells(10 + c, 6), Address:="", 
   3:  SubAddress:=LinkToSheet, ScreenTip:="", TextToDisplay:=""
 

Now to break it down a bit for those of us who need a little help with VB.  This part of the code dictates the worksheet where the hyperlink will go, in this case I have a variable called NewSheet:

   1:  NewSheet.Hyperlinks.Add
 

The Anchor property is the location of where to put the hyperlink.  In my case it’s dynamic, but for most people it might be a static location (e.g. F2) like this:

 
   1:  NewSheet.Hyperlinks.Add Anchor:=F2
 

The Address property needs to be blank if you’re linking to other worksheets, you use this if you’re linking to other files or URLs.  The LinkToSheet variable is used because some of the worksheet names I use have spaces, so I need to be able to format my worksheet as ‘WorkSheet Name’!A1.  Finally, the last two properties are more adornments than anything else in case you have to have a hover tip or display different text than the name of the worksheet.

~david

The 2010 Columbus Marathon Experience

This past weekend I ran the 2010 Columbus Marathon.  It was my 2nd marathon ever and while I felt a little more comfortable while running, it was still a grueling task.  Like usual, I really only trained during the weekends and had very little mid week runs.  So, like anything else, you get out what you put in.  One of the main reasons for running this race is the fact that it’s supposed to be a very “friendly” course (e.g. fairly flat and fast).  While I did improve my time by around 15 minutes, my dream of breaking 4 hours will have to be postponed for another race.

A couple of notes about the event itself.  First, the goody bag really didn’t have any goodies.  The Pittsburgh and Akron races had some cool stuff like free food samples, socks, etc.  While Columbus didn’t really have much besides the shirt.  Second, the shirt is nice, but I heard a lot of females complain about the color choices.  All black for both male and female marathoners; pink and blue for female and male half marathoners respectively.  Third, the bands along the way were a great experience.  There drum lines, rock bands, even a guy who played the keyboards while riding his bike… that is talent!  Finally, I felt that the overall runners were not as friendly as in my first marathon, Akron.  Perhaps, it was the fact that a marathon wasn’t new to me.  However, I have a feeling that since the Akron course is so brutal, it forms a much stronger bond among the runners or in other words, misery loves company.  Either way I was full of pithy comments for any runner so unlucky to be around me as I tried to be funny.

Finally, this race did provide some interesting analytics, which I’ve posted below.  It is nice to see a breakdown of your progress, but it is also pretty sad to see how bad my second half was when compared to my first half.

My overtime and splits:

image

 

 

 

 

 

 

 

 

From the start to the 10K mark, I’m kicking ass and taking names.  All 482 of them:

image

I am still feeling pretty good and looking forward to the 2nd half as it’s the easy half:

image

Someone lied to me, this half was not easy:

image

I am struggling, knees feel like Jell-O, legs feel like Swiss cheese, and I want my mommy:

image

Would I do it again?  More than likely, as I think I have a shot of breaking 4 hours on this course.

~david

Cisco UCCE Outbound Option Find Query Rule for Dialed Record

Here’s a simple query using an inner join to find out which query rule added a certain record to the dialer.  This is pretty useful when you’re trying to figure out why a record was dialed which went to the wrong skill group.  The only challenge here is joining two different tables in two different databases, in this case the HDS and AW databases.

 

SELECT [DateTime]
      ,[CustomerTimeZone] AS CustTimeZone
      ,[CampaignID]
      ,[CallResult]
      ,[CallStatusZone1]
      ,[CallStatusZone2]
      ,[asp_awdb].[dbo].[t_Query_Rule].QueryRuleName
      ,[DialingListID]
      ,[Phone]
      ,[SkillGroupSkillTargetID] AS SGID
      ,[AgentPeripheralNumber] AS AgentExt
      ,[PeripheralCallKey]
      ,[CallDuration]
      ,[AccountNumber]
      ,[FirstName]
      ,[LastName]
      ,[CallbackPhone]
      ,[CallbackDateTime]
      ,[DialingMode]
      ,[DialerID]
      ,[ImportRuleDateTime]
  FROM [dam_hds].[dbo].[t_Dialer_Detail]
INNER JOIN [dam_awdb].[dbo].[t_Query_Rule] on [dam_hds].[dbo].[t_Dialer_Detail].QueryRuleID = [dam_awdb].[dbo].[t_Query_Rule].QueryRuleID
WHERE DateTime > ’10/01/2010′
ORDER BY DateTime DESC

Presto!

~david

Sprint’s HTC EVO

I decided to put my Windows HTC Touch Pro 2 out in the pasture and go for the much hyped “first ever 4g phone”, the HTC EVO.  Best decision ever concerning a phone!

First and foremost, this is the best phone I’ve ever had.  The software is great, the responsiveness is amazing, and it has all sorts of randomly cool features.

The Pros:

  • Great screen.
  • Integration with Google products is flawless.
  • Turn by turn navigation with Google maps.
  • FM radio.
  • Sprint TV, great during the world cup.
  • Apps like Swype, NYT, Google Voice, Google Voice Search.

The Cons:

  • Dealing with Exchange invitations, not as clean as with Windows.
  • No unified inbox like WebOS.
  • Battery hog, but all smart phones are, will need to charge it after a few hours of heavy use.
  • Not enough widgets for shortcuts and displaying vital information on the screen.

 

~david