While it’s admittedly a very close competition, I lean heavily toward making the HD2 my next mobile experience. Not just because of price; because of the hardware. The HD2 provides a visceral experience that even the iPhone can’t match. Don’t believe me?
Check the HD2 vs. Nexus One video at Wirefly. The video is fairly well-balanced look at both cell phones. If you’re opposed to Windows Mobile, the HD2 isn’t for you. But, kudos to Wirefly for the unbiased look.
The HD2 is on sale everywhere tomorrow with pricing ranging from $99 to $149. Shop wisely.
March 23rd, 2010
If you live in Boulder and work in Denver or vice versa and have a bike then you should consider riding to Denver. It’ll be good for you and the environment
Before I sold my software business to NewsGator (based in Denver), the thought of working in Denver never ever crossed my mind. As an avid cyclist and climber I was pretty content with living, working, and playing in Boulder. But the opportunity to work at the hottest software startup in Colorado was too enticing, so I did it!
One of the pacts I made to myself after accepting the offer was that I would not drive my car to Denver… ever. I think I drove under 10 times over two years. Not bad. BTW, here’s a little tip that will make this care free transition easier… sell your car or have a mechanical problem and don’t get it fixed. In my case, my brakes needed some major love so I intentionally left it alone. I simply started the car once a week and drove around the block cuz that seemed like a good thing to do. But having bad brakes prevented me from getting in a warm car on a zero degree January morning and forced me to hop on the bike instead.
So back to the Boulder/Denver ride…. I would ride one way depending on if I wanted to get up at 5:30 am and the weather. On a snowy day, it was better to ride after work; the roads would usually a bit better and at least there would be plenty of car tracks to ride in. Then I would ride the bus the other direction. This works great. Get a gym membership so you can shower and stretch and with a cross bike you can do this year round. The two years I rode (’06 and ’07) were heavy snow years but I still was able to pull it off.
Figuring out the route was kind of tricky. There was no good beta online, so my only friend was Google maps. Google’s satellite view was great for finding bike paths and stitching the ride together. It took several attempts to dial in the ride, and I have been asked a BUNCH about the ride deets. So here goes…

The route is great from Boulder to 100th and Wadsworth – then it is okay. The stretch on Wadsworth is loaded with cars and they go fast, but there is a good shoulder for most of it. Then there is a section of Lowell that is sketchy; there is no shoulder (but light traffic) and you may need to dodge a shopping cart or two (or a thief). One day I almost got trampled by an officer, with weapon drawn, chasing a dude across the road into an alley. It’s not a great neighborhood around here for sure, but other than that one run in I had no incidents. Just keep your head down and ride.
All in all, it is a good ride, a great way to stay in shape, and a way to keep the stress low by staying out of your car… the environment will be happy too.
You can see the details here.
Enjoy!
February 20th, 2009
I’ve been watching bits of the Tour of California this week… what a great race. And what Lance Armstrong is doing is pretty amazing. To be riding at that level after a few years away… and after battling cancer is inspiring.
The fact that Lance is doing this to promote Livestrong makes this even more special… the other day, a user asked me to add UI themes to Tiny Twitter, my mobile Twitter client. So, I thought I would do that and my first theme would fly the Livestrong colors.
Now, I don’t have a fraction of the visibility and reach that Lance has, but if some Tiny Twitter users like @Wirefly get to proudly show their support for Livestrong, then that is better than nothing.
So here is what the Tiny Twitter Livestrong theme looks like:

If you want to try Tiny Twitter Livestrong style on your mobile go to http://m.ttwt.at and when you run the application go into General Settings to set the Livestroing theme.
Enjoy!
Thanks to Wirefly.
February 19th, 2009
While I worked at NewsGator for two years (2006 to 2008), I rode my bike in to or out of Boulder/Denver about 90% of the time. Wow, that was a fun – great company, great people, and the ride was nice! Since then I have been asked countless times about the best bike route from Boulder to Denver. I’ve tried to describe the route, but honestly it’s a bit convoluted and hard to convey verbally.
I tried to plot the route by hand in Google maps using their tools but it was a big pain in the ass. Ever try doing something like that? It is brutal. Well, I have a meeting in Denver tomorrow, will ride my bike in, and got a bright idea this evening. Why not use my phone, which has GPS, and write an application to breadcrumb the route and then post the data to some mapping service.
There was one catch; I was only going to give myself one hour to do it. I could have probably found an app to do it for me, but that would be no fun. So I started coding it up at 9 pm tonight – beats watching tv or going to hapa w/ danny, heather, and micah, ok scratch that one maybe.
The first choice was the technology stack. I chose Microsoft for several reasons:
1. My phone is a WinMobile
2. I code all day in either Ruby or Java so change is good
3. The MSFT/.NET stack is actually quite excellent – if you think not, you either haven’t tried or are not open minded
4. MSFT gets little love in the Web 2.0 world, so I am here to spread some love 
So, my objective was simple. Record GPS data on my mobile, output to a .gpx file, and import into maps.live.com. The undertaking was a success, I think, and I finished at 9:42. It only took 42 minutes – sweet. The app is ready, the bike is ready… I will post the results tomorrow some time.
So, here is what I did:
1. Created a new Windows Mobile 6 project in Visual Studio 2005 – some code below and project files here
2. Added a label to give me some feedback and three menu options to the main form (Start, Stop, and Exit) – start to get the GPS going and stop to close the GPS and write out the data
3. Here is the first cool trick that made this oh so easy. Studio has a great tool for generating classes from XML schema definition files. So, I grabbed the schema file http://www.topografix.com/GPX/1/1/gpx.xsd and voila in 2 seconds had a fully blown out managed class based on the schema. How sweet is that? Here is what you do:
a. Using the Visual Studio 2005 Command Prompt I ran the following in my projects root directory – xsd gps.xsd /classes /language:cs /namespace:gpx
b. Added the class to my project – sweetness
4. Then added a reference to the GPS Intermediate Driver, managed wrapper. The Windows Mobile 5 SDK and the Windows MObile 6 SDK ship with sample code that provides a managed wrapper around that native GPS and can be found in C:\Program Files\Windows Mobile 6 SDK\Samples\Smartphone\CS\GPS or C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Samples\Cs\Gps (on my machine anyway)
5. Then wrote just a handful of lines of code to make it all work (see code below):
a. Read the GPS data on a reasonable interval – all the hard work is done in the managed assembly, thanks
b. Hydrate the GPX class instance (from step 3) – again all the hard work was done by the xsd tool all I did was stuff in some data
c. Stop reading GPS data and write out the gpx file – all the hard work done by xml serializer and the xsd tool. This is just too easy.
6. Upload the gpx file from your mobile to live.com – all the hard work is done by maps.live.com
a. http://maps.live.com – Collections | Open your collections | Import
b. That’s all!
So, in under an hour I was able to build a useful application (for me anyway)… this is clearly not indicative of my coding skills bit of the great tools (in this case the .NET framework and live.com) that we developers have at our disposal today.
Like I said, I’ll update when I gen a map tomorrow.
Happy coding.
——————->>>>>>>> CODE STUFF
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Xml.Serialization;
using Microsoft.WindowsMobile.Samples.Location;
namespace GPS
{
public partial class FrmGPS : Form
{
private EventHandler updateDeviceHandler;
private EventHandler updateDataHandler;
GpsDeviceState device = null;
GpsPosition position = null;
Gps gps = new Gps();
List waypoints = new List();
DateTime lastCapture = System.DateTime.MinValue;
int iterator = 0;
public FrmGPS()
{
InitializeComponent();
}
private void FrmGPS_Load(object sender, EventArgs e)
{
updateDataHandler = new EventHandler(UpdateData);
updateDeviceHandler = new EventHandler(UpdateDevice);
gps.DeviceStateChanged += new DeviceStateChangedEventHandler(gps_DeviceStateChanged);
gps.LocationChanged += new LocationChangedEventHandler(gps_LocationChanged);
}
private void mnuStartGPS_Click(object sender, EventArgs e)
{
try
{
if (!gps.Opened)
{
lblStatus.Text = string.Empty;
gps.Open();
}
}
catch (Exception ex)
{
Cursor.Current = Cursors.Default;
MessageBox.Show(ex.Message + “\r\n\r\nMake sure you have the GPS intermediate driver enabled.”,
“GPS Failed”,
MessageBoxButtons.OK,
MessageBoxIcon.Hand,
MessageBoxDefaultButton.Button1);
}
}
private void mnuStopGPS_Click(object sender, EventArgs e)
{
try
{
if (MessageBox.Show(“You sure you want to stop acquiring GPS data?”, “Stop”, MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{
if (gps.Opened)
{
lblStatus.Text = “GPS device closed.”;
gps.Close();
}
XmlSerializer serializer = new XmlSerializer(typeof(gpx.wptType));
TextWriter writer = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), “kcbigring.gpx”));
gpx.gpxType data = new gpx.gpxType();
data.wpt = new gpx.wptType[waypoints.Count];
int i = 0;
foreach (gpx.wptType wp in waypoints)
{
data.wpt[i] = wp;
i++;
}
serializer.Serialize(writer, data);
writer.Close();
}
}
catch (Exception ex)
{
Cursor.Current = Cursors.Default;
MessageBox.Show(ex.Message,
“GPS Failed”,
MessageBoxButtons.OK,
MessageBoxIcon.Hand,
MessageBoxDefaultButton.Button1);
}
}
protected void gps_LocationChanged(object sender, LocationChangedEventArgs args)
{
position = args.Position;
// call the UpdateData method via the updateDataHandler so that we
// update the UI on the UI thread
Invoke(updateDataHandler);
}
void gps_DeviceStateChanged(object sender, DeviceStateChangedEventArgs args)
{
device = args.DeviceState;
Invoke(updateDeviceHandler);
}
void UpdateDevice(object sender, System.EventArgs args)
{
if (device != null)
{
lblStatus.Text = device.FriendlyName + ” acquiring signal…”;
}
}
void UpdateData(object sender, System.EventArgs args)
{
if (position != null)
{
if (position.LatitudeValid && position.LongitudeValid)
{
string tempLat = position.Latitude.ToString();
string tempLon = position.Longitude.ToString();
// Write some data?
TimeSpan span = DateTime.Now – lastCapture;
if (span.TotalSeconds > 4)
{
lblStatus.Text = iterator.ToString() + “: ” + tempLat + ” ” + tempLon;
lastCapture = DateTime.Now;
gpx.wptType wp = new gpx.wptType();
wp.lat = System.Convert.ToDecimal(tempLat);
wp.lon = System.Convert.ToDecimal(tempLon);
wp.time = System.DateTime.Now;
wp.name = iterator.ToString();
waypoints.Add(wp);
iterator++;
}
}
}
}
}
}
November 13th, 2008
Is blogging really dying? Is TechCrunch headed to the dead pool? That seems to be a vibe that has been circulating lately.
According to my feed reader, NewsGator’s awesome FeedDemon, I am certainly seeing what appears to be less activity and a bunch of repetition in my subscriptions. So, does that mean blogging is going into the can or is something else going on here?
I decided to do some investigation on my own to get to the bottom of this… I think one of the strongest indicators of blogging’s health is the amount of comments that are posted. So, I went Geraldo style and wrote a script (see script at bottom) to scrape the number of comments from the popular tech blog, TechCrunch, over the last three years.
As you can see from the chart below (piped the script output -> Excel), the number of comments on TC is steadily increasing. TechCrunch is definitely not headed underground; it is doing very well! Blogging is not dying… yippee, but it is most definitely changing.

So, what is going on? Well, I think blogging is just turning into another channel for the same type of media it was supposed to replace. Blogs are rolling up, trusted authorities are rising to the top, and the rest is just noise or repetition or gone bye bye. We already have too much going on in our lives, so it is only natural that this organic filtering would occur.
Here is the Ruby script if you want to see for yourself:
require ‘rubygems’
require ‘open-uri’
require ‘hpricot’
@url_base = “http://www.techcrunch.com/”
@response = ”
begin
File.open(“comments.txt”, “w”) do |file|
2008.downto(2005) do |year|
12.downto(1) do |month|
url = “#{@url_base}#{year}/#{month}”
begin
open(url) { |f|
@response = f.read
doc = Hpricot(@response)
(doc/”div/div/div[3]/ul/li/div”).each do |comment|
post = comment.innerHTML.split(‘,’)
file.write “#{post[0].strip},#{post[1].strip}\t#{post[2].split(” “)[0].strip.sub(“No”, “0″)}\r\n”
end
}
rescue Exception => e
print e, “\n”
end
end
end
end
rescue Exception => e
print e, “\n”
end
October 25th, 2008