Monday, November 28, 2011

This “UPS My Choice” Thing is Actually Pretty Neat

Does anyone remember using eBay before the whole “My eBay” thing existed? No? You may find it hard to believe, but when eBay launched (a looonnnng time ago) they’d email you confirmations of your activity (bids, sales, etc.) and you’d use those emails to keep track of that was going. It wasn’t until years later that eBay offered a centralized “my account” page with that information.

It’s insane to imagine today that it used to work that way but I swear it did!

And yet UPS doesn’t even work that well for most people today. You order something and if you’re lucky, the vendor gives you a tracking number which you constantly monitor to see where your widgets are and when they’ll arrive. Some vendors and shippers added the ability to subscribe to email notification for specific tracking numbers, which helped, but that wasn’t a great solution either.

Then, when I started tracking a package last month, I somehow ended up at UPS’s My Choice system. At first I thought this was just a reinvented notification engine. It didn’t really make sense to me initially because it seemed like the nice features were hiding behind the premium version. And I was really tired.

I scoffed at the notion that I’d have to pay some annual fee to get trivial functionality out of a shipping company and forgot about it.

Then, a couple weeks later I got this in my email:


It took me a couple seconds to realize what had happened. I apparently wasn’t paying attention to the sign up process because what UPS is doing is notifying me (automatically) whenever anyone ships me a package. It matches packages by address and name (multiple names allowed) and lets me know when they’re on their way, if they are delayed, and when they’ve arrived.

This is more than I expected and it turns out to be pretty much exactly what I want. In the weeks since, the emails keep coming:


These emails take you to the UPS version of “My eBay”, which does exactly what you’d hope.

They still offer completely unhelpful delivery windows, like this:


Which means it’ll get here sometime between 7:30 am and 7:30 pm. Or later. Maybe.

But To their credit, allegedly the paid version of “My Choice” improves this by giving you a two-hour delivery window, among other things for $40/year.

This is one of those things that is hard to understand why it hasn’t existed all along. Thanks, UPS, I love it!

Your move, FedEx. I’d call out USPS, too, but their tracking is so laughable that the notion of them implementing anything serious is ridiculous.

Wednesday, November 23, 2011

I Vote To Close This Meeting

So my company is doing this cool thing: they're giving every employee a tablet.

The idea is that we're a tech company and can probably figure how to use them to improve efficiency or blah blah blah, and they're cool and will make us happy. Yay!

So aside from making our existing tools work well on mobile and surfing the top apps/games lists in the AppStore, here's a problem I want an app for:

Unproductive meetings

I'm talking about meetings where people keep talking in circles, refusing to converge to a decision. Or meetings where the chit chat is getting out of hand and some of us have actual work to do.

I'm guilty of this, too. Really.

Most people are too polite or non-confrontational to do anything so we need something that allows people to say, "hey let's refocus here because this is all an epic waste of time" without actually saying it.

Imagine everyone sitting around the conference room table with their tablets blathering on. Now suppose everyone had an app running with the following features:

- the meeting agenda
- a place for minutes/action items
- a timer showing how much time is left
- a timer indicating how much money has been spent (labor) since the meeting began
- a reminder tone very 25% of the duration of the meeting

Those are all highly collaborative with shared workspaces, etc. But these features are really just an excuse to deploy this:

- anonymous voting buttons that allow anyone to make a statement

Maybe votes only activate something if two people vote...not sure. (It's really just like voting to close questions on Stack Overflow.) I want to be able, with one or two taps, notify the group that things need to move on for some canned reason.

Reasons are simple things like:
- off topic
- not relevant to the group (i.e. you two go figure it out later and report back)
- conclusion needed (i.e. what's the action item from this thread of discussion)
- other voices needed (i.e. share the podium, pal)

Does this exist? Thoughts?

(Apologies for any formatting issues or typos...I'm posting this from my phone.)

Monday, November 21, 2011

Case Sensitivity in ASP.NET

I’m personally a fan of respecting case sensitivity. Historically it seems that most programming languages are picky about “a” vs. “A”, and even most operating systems. VB, and Windows, however, are not.

This leads to some frustratingly elusive bugs on occasion because there are instances in VB where case does matter. Take for instance the following objects, commonly available while processing an ASP.NET request:

  • Request
  • Session
  • Cookies
  • Viewstate

The first three (among others) are implemented with a hash table that does case-insensitive lookups. (There’s an awesome answer over on Stackoverflow that explains why it works this way).

So after playing fast and loose with case sensitivity, it’s easy to treat the viewstate object the same way. But, as you’ve surely guessed by now, lookups in the viewstate bag are case-sensitive.

Unfortunately, I can’t find a reference that documents this at the moment, but I can confirm it works that way from personal experience. Here’s one of my recent commits:


And a flood of Google results from others affected confirms it’s not a fluke affecting just me.

Happy debugging!

Tuesday, November 15, 2011

LEDs Have Arrived!

LEDs are awesome. In exchange for tiny amounts of energy, they produce intense, bright light. Plus they are cool to the touch and very durable. In recent years they have even become affordable!

I think the age of LED lighting has finally arrived. Sure, they conquered flash lights and specialty applications years ago but I think they’ve hit a big bigger milestone this year: they have crushed the Christmas Lights market. The options you find walking down the Christmas lights aisles (yes, aisles) have been slowly moving from traditional incandescents to LED-based products. Last year I looked at the LED options but shied away because they were still too expensive.

This year was different. First off, I couldn’t even find the old bulbs at first—LEDs have nearly pushed them out completely. Second, they are now in the “yeah, that’s doable” price range. Still spendy, but not ridiculous.

And so tonight I took advantage of the warm, calm, no-wind weather to hang 225 lights.

Photo Nov 15, 8 48 43 PMPhoto Nov 15, 8 48 04 PM

Apologies for the weak photography. The resident photographer is away at the moment so I just used my phone. In the dark.

Side note: you know what’d be an awesome product? Shorter sections of lights. I need 18” to finish that top eve. What am I supposed to do…?

So how’d we do energy-wise? I’d say pretty awesome:

Photo Nov 15, 8 42 49 PM

That’s 7.5 tiny watts. At 10¢/KWH, running these for 7 hours a day will cost just…


0.5¢/day. Half a penny a day. Is that right?! Whoa.

That seems a bit lower than I expected. I just checked the box and all the lights together are rated at about 18 watts. So either that’s conservative or my meter isn’t working quite right… In any event, they are quite efficient!

If you’ve been avoiding these things, I suggest you take another look. Here’s hoping that interior lighting is the next empire to fall to the mighty LED! (I know LED bulbs exist, but $15/bulb is too much!).

A Candy Land Simulator: The Game Engine, Implemented

Note: this post is from a series on Candy Land.

We’re back again. We still have our board and cards (these are old hat now, right?):

var board = [
    { color: 'Red' },
    { color: 'Orange', bridgeTo: 59 }
    // ...

var cards = [
    'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'
    // ...

And we just added some players:

var players = [
    { name: 'Michael', isLosingATurn: false, position: -1, isWinner: false, moves = 0 },
    { name: 'Thing 1', isLosingATurn: false, position: -1, isWinner: false, moves = 0 }

So let’s get down to implementing some of the game engine we spec'd out yesterday. First, here’s the test harness:


I decided to add an option of letting players stop the game as soon as one player wins (like normal people), or to play through until everyone “wins” like my kids play. This is the main function that we run when we click the button to start the game. It loads up that option from a checkbox, and the players:

// for stats
var gamesPlayed = 0;
var totalMoves = 0;

// run this when the button is clicked
    var options = { 
        // see if the option to run until everyone wins is checked
        doRunUntilEveryoneWins: $('#all-win').is(':checked')

    // configure two players
    var players = [
        // ladies first
        { name: 'Thing 1', isLosingATurn: false, 
          position: -1, isWinner: false, moves: 0 },
        { name: 'Michael', isLosingATurn: false, 
          position: -1, isWinner: false, moves: 0 }

    // call "DoGame" to play an entire game, passing 
    // in the players array
    DoGame(options, players);
    // update stats
    totalMoves += players[0].moves + players[1].moves;
    // append another row to the table
            $('<tr/>').append( $('<td/>').text(players[0].moves) )
                      .append( $('<td/>').text(players[1].moves) )
                      .append( $('<td/>').text(players[0].moves 
                                               + players[1].moves) )

As you’ll see, I’ve taken a few other liberties during the implementation that deviate slightly from the original design. That’s normal.

So when we actually call “DoGame()”, this is called:

function DoGame(options, players){
    // initialize the board
    var board = MakeBoard();

    // initialize the deck
    var cards = MakeDeck();

    // call "DoGameLoop" (pass in the board and deck) 
    // until it returns false, which indicates the game is over
    while(DoGameLoop(options, players, board, cards));

Which calls “DoGameLoop” repeatedly until it signals that the game is over:

// return false when the game is over
function DoGameLoop(options, players, board, cards){
    // we will set this to true if someone is playing...
    var IsSomeoneStillPlaying = false; 
    // for each player: DoPlayerLoop
    for(var i = 0; i < players.length; ++i){
        var player = players[i];
        // skip this player if they've won already
        // or made 10000 moves (that would be too many)
        if(!player.isWinner && player.moves < 10000){
            // do the actual move
            DoPlayerLoop(options, player, board, cards);
            // keep track if this player has won
            IsSomeoneStillPlaying |= !player.isWinner;

            // see if we should stop when just one player wins (configurable)
            if(!options.doRunUntilEveryoneWins && player.isWinner){
                return false;
    // things went as planned, return true if some players are still playing
    return IsSomeoneStillPlaying;

That just calls “DoPlayerLoop” for each player:

function DoPlayerLoop(options, player, board, cards){
    // if we are losing a turn, turn off the "isLosingATurn" 
    // property and we're done (exit now)
        player.isLosingATurn = false;
          return true;
    // draw a card and increment the "moves" counter
    var drawnCard = DrawACard(cards);
    // we'll can play either 1 or 2 moves because we have doubles
    var currentSpace = DoMove(options, player, board, drawnCard);
    // if the player drew a double card, they move again  
    if(drawnCard.isDouble && !player.isWinner){
        DoMove(options, player, board, drawnCard ); // do it again!
        // woohoo
        return true;
    // if the space we landed on is a bridge, follow the bridge
        player.position = currentSpace.bridgeTo;
        currentSpace = board[player.position];
    // if we are now on a lose-a-turn space, turn on the 
    // "isLosingATurn" property so we know 
    // to skip our turn the next time around
        player.isLosingATurn = true;

The real workhorse in there is the call to DoMove, which actually advances the game token along the board:

function DoMove(options, player, board, card){
    // we'll cycle through the board. 
    // if we have a regular color card (or double), we'll go 
    // until we hit the color, OR reach the end of the board
    var currentSpace;
    var iterations = 0;
        // advance one space
        // if we hit the end of the board
        // we start over if we have a character card
        // or we win if we have a regular color card
        if(player.position == board.length){
                // if we have a character card and we've reached the 
                // end of the board, wrap around
                player.position = 0;
                // if your move takes you to the last square or beyond, you win 
                // set the "isWinner" property to true and exit
                player.isWinner = true;
        currentSpace = board[player.position];

        // loop until we find the space we're looking for
        // or we win
        // or we iterate 10000 times (because something must be broken)
           && currentSpace.color != card.color 
           && !player.isWinner && ++iterations < 10000);
    return currentSpace;

All this, including the source to the utility functions (e.g. DrawACard) is available in the fiddle. Here’s the working version:

In the next post I’ll do some additional testing and verification. A brief, casual comparison to other papers online reveals that my results are reasonable. I’m not saying they are correct, but I’m at least in the ball park for finding the length of an average game (around 45-50 cards).

Monday, November 14, 2011

Outlook Tip: Automatically Archive Annoying Meeting Invitation Responses

If you use Outlook’s handy meeting request feature to plan events like presentations and lunches involving a lot of people, you have probably experienced this shortly after sending out an invite:


For the unitiated, what you’re looking at is the flurry of responses that come in after the invite goes out. Outlook uses actual emails to keep track of people accepting/declining invites. And by default, they all just show up in your inbox.

Normally when something like this comes up, I just create a rule to take care of it. This case is no different but it’s not as simple as it seems. The problem is that when accepting or declining an invite, Outlook lets you add a message:


I don’t want to automatically process or hide the responses if the sender went to the trouble to actually write something inside. With that in mind, I have the following rule:


Basically, the rule executes whenever a message is sent just to me and has the telltale text in the subject. But, if the message body contains any text, leave the message in place. I couldn’t find any reasonable way to check if the body contains any text, so I had to resort to the hack of just checking for vowels. I guess you could add all the letters of the alphabet…but that’d just be silly.

Here’s the rule if you just want to import it (and update the move-to folder). If that makes you nervous (it should!), it’s not hard to recreate from the above screenshot.

Once in place, your inbox should be nice and clean again…or at least not cluttered by empty RSVPs.

Saturday, November 12, 2011

A Candy Land Simulator: The Game Engine

Note: this post is from a series on Candy Land.

Last time we captured the board and the card deck into Javascript objects that look like this:

var board = [
    { color: 'Red' },
    { color: 'Orange', bridgeTo: 59 }
    // ...

var cards = [
    'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'
    // ...


Now we need to simply draw cards and keep track of a player through the game. I guess we should come up with some simple way to track that. Players will have a name and a position on the board. We also need to know if the player is losing a turn because they stepped on a licorice space. This should do it:

var players = [
    { name: 'Michael', isLosingATurn: false, position: -1 },
    { name: 'Thing 1', isLosingATurn: false, position: -1 },

As we design the rest of the engine, we’ll add to that as necessary.

OK, now we need to create a game loop. A game loop basically covers all the actions that happen in one cycle of the game. Since Candy Land players don’t affect each other (except for a shared deck of cards), all the interesting stuff happens in the player loop, with alternating players.

Here’s a first pass of what we need:

var players = [
    { name: 'Michael', isLosingATurn: false, position: -1, isWinner: false, moves: 0 },
    { name: 'Thing 1', isLosingATurn: false, position: -1, isWinner: false, moves: 0 }

// call "DoGame" to play an entire game, passing in the players array
function DoGame(players){
    // initialize the board
    // initialize the deck

    // call "DoGameLoop" (pass in the board and deck) until it returns false, 
// which indicates the game is over
// when the game is over print out summary stats (e.g move counts) and exit } function DoGameLoop(players, board, cards){ // if all players have finished (yes, my kids insist that the game continues // until everyone finishes :/) exit, the game is over (return false) // for each player: DoPlayerLoop // things went as planned, return true } function DoPlayerLoop(player, board, cards){ // if we are lose a turn, turn off the "isLosingATurn" property and we're done (exit now) // draw a card and increment the "moves" counter // find the next space to move to based on the card // if your move takes you to the last square or beyond, you win // set the "isWinner" property to true and exit // if the space we landed on is a bridge, follow the bridge // if we are now on a lose-a-turn space, turn
// on the "isLosingATurn" property so we know
// to skip our turn the next time around } function DrawACard(cards){ // if there are no cards left in the deck they must have all been played so // reshuffle them! Boom, now there are cards in the deck // remove a card and return it } function MakeDeck(){ // return a new, shuffled deck } function MakBoard(){ // return a new board }

That should read pretty easily from top to bottom (you may have to use your imagination a little bit). We’ll implement some of these in the next post.

Thursday, November 10, 2011

A Candy Land Simulator: Overview and Data Representations

Note: this post is from a series on Candy Land.

As I was playing Candy Land with Thing 1, it occurred to me how much I dislike the game. As I blindly turned card after card I wondered what the typical number of moves looks like. And then I wondered what the distribution looks like. Really my brain just wanted to know how long it would be suffering, and how confident it should be about that answer.

I guess the driving force behind these questions is my insatiable desire to finish this game so I can banish it to the bookshelf for another night and redirect the kiddos to other, less torturous activities.

This is not a novel thing to wonder. In fact, apparently it’s pretty straight forward to approximate mathematically with a Markov chain. I’m not interested (or knowledgeable) in any of that, though. Instead, I want to simply build a test apparatus that yields the same kinds of answers from generated experimental data instead of fancy mathematics.

But that’s been done, too. I already had this idea festering as I enjoyed a friendly match of the worst game ever invented so I’m going to do it anyway. Come along for the ride—here we go!

My primary goal is to figure out the average number of moves required to end a game of Candy Land between my daughter and me, experimentally. Along the way, we’ll do these too:

  • Create a simulator that can run through a whole game of Candy Land unattended
  • Produce some output with different variables (e.g. number of players)
  • Make some fancy tables and charts

We might pile some more on as we go, of course. Throughout the whole process, I will try to make everything accessible to novice or aspiring programmers. This might mean I’m far more verbose and explicit about things than I normally would be; experienced programmers will just have to play along.

We’ll use Javascript as much as possible. Let’s get started.

First, we need to represent the game elements. We’ll start with something crude and then adjust it as needed. I transcribed the board into a Google Doc (you can steal that if you like) and from that we’ll extract some JSON (that’s in the spreadsheet, too).

If JSON (Javascript object notation) is unfamiliar to you, check it out. It’s pretty important.

The board looks like this in JSON:

var board = [
    // ...
    { color: 'Purple' },
    { color: 'Yellow', bridgeTo: 45 },
    { color: 'Blue' },
    // ...
    { color: 'Green' },
    { color: 'Red', loseTurn: true },
    { color: 'Purple' },
    { color: 'Yellow' }
    // ...

Here’s the full board. Basically we have an array of hashes. Each hash represents a square on the board and has the following properties:

  • color (or character), required
  • loseTurn, only present if true
  • bridgeTo, if present this indicates where the bridge leads to

Next we need the deck of cards:

var cards = [
    'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   , 'Red'   ,
    'Purple', 'Purple', 'Purple', 'Purple', 'Purple', 'Purple', 'Purple', 'Purple',
    'Yellow', 'Yellow', 'Yellow', 'Yellow', 'Yellow', 'Yellow', 'Yellow', 'Yellow',
    'Blue'  , 'Blue'  , 'Blue'  , 'Blue'  , 'Blue'  , 'Blue'  , 'Blue'  , 'Blue'  ,
    'Orange', 'Orange', 'Orange', 'Orange', 'Orange', 'Orange', 'Orange', 'Orange',
    'Green' , 'Green' , 'Green' , 'Green' , 'Green' , 'Green' , 'Green' , 'Green' ,
    '2Red', '2Blue', '2Purple', '2Orange', '2Yellow', '2Green',
    '2Red', '2Blue', '2Purple', '2Orange', '2Yellow', '2Green' ,
    'Gingerbread Man', 'Candy Cane', 'Gum Drop', 'Peanut', 'Lolly Pop', 'Ice Cream Cone'

With those in place, we can now do simple things like counting spaces:


Or counting cards:


Or peeking at a random card from the deck:

var cardCount = cards.length;
var randomIndex = Math.floor(Math.random() * cardCount);
var randomCard = cards[randomIndex];

I haven’t decided how to simulate shuffling yet (shuffle first, or draw randomly)—we’ll talk about that and do it tomorrow.

You can run what we have so far by hitting the little “play” triangle in this fiddle:

Now that we have our structures in place, we should start thinking about how we’re going to use the cards to navigate the board. I’ll start on that tomorrow, too… :)

Wednesday, November 9, 2011

Please Ignore Me While I Gush Over My New Laptop

We're a Dell shop and that's worked out well for us. I'm serious about hardware, but not pathologically so. I have a single laptop that I take very good care of and I try to time my upgrades strategically to get the most bang for my (company's) buck. Here's my recent history.

  • I had a trusty D505 for a couple years. It was OK, but not stellar
  • Then I upgrade to the dual-core awesomeness of the D520. I waited for the gen 2
  • Two years ago I got a shiny SSD (Intel X25M). I waited for the gen 2. 
  • And last month, my disk almost full, my screen getting flaky, and my VM usage increasing, I upgraded again. Now I have a Dell Latitude E6520 (with gen 2 i7qm).

Here's my brief review.

Things I love
The screen is great. We don't skimp on screens so this baby is full hd. It took me a few days to get used to the widescreen format, and the tiny text, but I like it now. It's bright and crisp with oodles of pixels.

The performance is incredible. Getting an SSD two years ago was insane--the best upgrade ever--but moving to a modern processor (with four hyper-threaded cores) is a close second. Of course I moved my SSD over to this new machine so I really have a killer workhorse of a machine now.

I was surprised to find lots of things that I assumed were network-bound are faster now. I guess my assumption was wrong. Subversion updates and checkins are noticeably faster. Chrome is much snappier. Even fast sites like Stackoverflow are noticeably faster. I keep finding myself clicking on things and then beginning to move my attention away, only to have whatever I clicked on be ready before I can. I have to train my expectations for the new, more responsive experience.

I love the back-lit keyboard. I work in the dark often (while the kiddos fall asleep, usually) and being able to actually see the keys is pretty helpful. It is attractive, not too bright, and has quickly become something I always want in a laptop.

I like that I finally have a built-in webcam. I rarely use it but when I need one, it's hard to beat the convenience of having it built-in, ready to go. The quality is much better than whatever Logitech cheap thing I used to use, too.

I like this E-media bay thing, also known as that spot where the disc drive falls out of. Right now I have a huge second harddrive in there instead of a disc drive (that's the part I like). It's very nice considering how small SSDs tend to be. Now I have tons of scratch space to complement my lightning fast, but scarce SSD. The first thing I'll use it for is to set up regular backups since SSDs aren't widely known for their longevity.

Things that could be better
The form factor is large. It's not awkward for day to day use, or lugging around the office, but using it on a plane would be difficult. It's probably too large for a non-automobile commute.

It's not too heavy, and it works for me, but I could see some improvement here. I do like the new finish and style of the machine, but as far as simple size and weight, it's your typical Windows Laptop.

Coming from an aging system with a weak, 1-hour battery, I am thrilled to get 3-4 hours out of this thing. On the other hand, other systems do much better. Battery life wasn't a huge priority for me, but if it is for you you might want to keep looking.

Regarding the keyboard, I'm sure few will share this complaint, but I miss my context menu key. My old lappy had one and I used it often. But now it's gone :(. I guess the full 10-key numpad makes up for it. Almost.

While I do like having proper page up/down buttons, the layout is weird. My intuition has me hitting the wrong one, thinking that they should be reversed. Or really, they should be somewhere else. I wish I could order this thing with a standard arrow/nav arrangement instead of the 10-key. That'd be awesome.

The track pad is fine, but the track pad scroll support leaves a little to be desired. I find it jumps around when I try to scroll. The experience is hard to describe, so you'll just have to take my word for it: it's a bit jarring. I assume it's a software issue so maybe it'll go away with a driver update or by tweaking a bunch of random settings.

I am overwhelmingly thrilled with this thing. It's fast and reliable. It seems to run much cooler than my D520, and am typing this in the dark, comfortably.

I don't know how meaningful these things are but I've become quite obsessed with my Windows Experience Index scores. Here's my old machine, just before I moved its hard drive over.:

And my new one:

That's a big leap, and I can feel it.

Installing/Upgrading Memory in a Dell Latitude 6520 (aka MOAR GBs!)

I just got a new machine! It's amazing. Our awesome IT guy got an 8gb memory upgrade, too. It came in while he was on vacation so what was I supposed to do? Let it taunt me like a fool? No, I can do this.

Upgrading the memory in my sweet new laptop turned out to be easy, but I had to just guess how to do it because I couldn't find any documentation on how exactly I was supposed to do it. Fortunately, it was very easy. Not MacBook easy, but easy enough.

Short and sweet:
  1. Disconnect power, remove battery
  2. Remove all the "D"-labeled Phillips-head screws from the bottom
  3. Pop off the bottom plastic
  4. Install the memory
  5. Put it all back together
In pictures:

Take out the screws (be mindful of the HD screws because they're different than the others)

There's the tiny chip we're replacing

Just a gentle push on the silver clips and the stick will pop up.

The instructions are brief, and *behind* the chips. Nice.

One in, one to go

The stick should slide in easily at the right angle (it's higher than you think it should be). When it feels right, give it a firm push into the socket, then gently swing it into place.

All set. Now put it all back together!
Boot...and it works!

For $60, 8gb seems like a no-brainer upgrade if your laptop supports it. And now, I can finally reap the rewards of choosing to go with Windows 7 x64 two years ago. Yay!

Tuesday, November 8, 2011

Jim, The Pony Taxi, Who Sounds A Lot Like an Engineer

By request, 600 words on ponies.

There once was a clever pony named Jim. He was a fine steed who loved solving the world's transportation problems, one trip at a time. When asked what he did for a living, Jim would often answer succinctly, "I make traveling easier."

And so Jim went about his days improving trip performance and finding new ways to help his customers. All the while though, a particular calling bubbled to the surface: more than anything, he really wanted his riders to be happy. Unfortunately, like most ponies, Jim wasn't just directed to wherever his customers wanted to go, but also how to get there.

The problem, Jim realized, was that he often knew how to better serve his customers than they did. It wasn't that he didn't respect his customers--certainly their destinations were important. But he felt that his years of experience in the shipping business (as the ponies refer to it) made him better qualified to plan the route.

Initially Jim marketed this idea to much interest. "Of course!" his customers exclaimed, "why should we bother ourselves with such trivial matters when we can just let the horse handle it?" Sensing their condescension, Jim didn't begin his next trip with much optimism. As he set out from Point A to Point B with a carefully planned route in mind, optimized for not just for speed but also for safety and general passenger comfort he felt confident but guarded.

His intuition was proved correct as he went left at the fork where others often went right. "Whoa there, buddy, what's going on? Let's keep with what we've always done, ok?"

"But sir," Jim suggested to the passenger, "I have considered many variables, and after a great deal of work I have planned a new, better path. Can I show you what I had in mind?"

"Not today, Jim," the passenger dismissed, "I don't want to approach the idea of changing anything at this point in the journey. We don't like surprises."

And so, dejected from resigning himself to an inferior course for no real reason or purpose, Jim backed up and continued to Point B as directed.

It wasn't long before the streets became crowded. "Why are we slowing down?" the passenger demanded.

"This old path isn't well maintained these days and with all the new traffic that's been added over the years it's become quite difficult to pass through," Jim explained.

"The new bypass I wanted to use is much quicker and smoother," he mumbled to no one in particular.

After a stressful maneuver down the old path, Jim had completed the trip. His customer thanked him and went on his way. While refreshing himself at a local gathering place of other like-minded ponies, Jim struck up a conversation with a pleasant man.

"I need to get up to Point A quick," the man said.

"I'm heading up there now," Jim replied. "Let's go. Do you want the path or the bypass?"

"You're the expert--lead the way," the passenger instructed.

"You got it."

Filled with a new sense of purpose and respect, Jim carefully merged onto the bypass and the trip to Point A went smoothly and efficiently.

"Thanks for the lift," the customer said, stepping down. "I haven't taken that route before--I liked it! Very scenic! And fast!"

"My pleasure," Jim beamed, casually passing his card, "give me a call the next time I can help."

Jim had achieved his ultimate goal of making his customers happy through modern travel. With an extra bounce in his step, exuding confidence and skill, Jim couldn't go two paces without running into a new fare. It was looking to be a busy day.

Monday, November 7, 2011

How To Give Better Technical Presentations

I give technical presentations at work occasionally and I actually enjoy it. I’m talking about spending an hour talking to 15-20 coworkers about something neat like the latest developments in databases, web technology, etc., with time included for Q&A.

I get a lot of great feedback each time, which make it very rewarding. I must be doing a good job if I've convinced people I’m an expert on any of what I’ve presented (I rarely am but some seem to think so!). I think the real trick is just staying two pages ahead of the audience in the proverbial textbook. I know what’s about to happen on the screen; it’s loosely scripted. I’ve chosen to present the parts I like (and understand). And most importantly, I’ve practiced the whole thing a dozen times, and the hard parts (usually programming on the spot) a dozen more times.

That’s really the only reason I look like I know what I’m doing: I prepare. A lot.

I also benefit from experience, but you have to start somewhere. Here are a few tips to motivate you to take up small speaking roles and give better presentations.

First of all, and trust me on this: it’s easier than it looksIf you have a topic you are deeply interested in, speaking on it is easy if you do the right preparation. The hard part is finding the time to actually do all that preparation.

If this is all very new to you or you're having trouble visualizing what a cool presentation might look like, my advice to you is to go watch a few stellar examples. Jump on channel 9 and poke around. Look at anything by Hanselman. Check out this neat thing from Steve Sanderson. If your presentation is less technical, and short, check out pretty much anything on TED.

Then face the facts: you are not going to be as awesome as these guys. They are pros. But aspire to greatness!

Ready to present? OK, here are a few tips to make your presentation better.

Don’t speak slowly or change how you speak. I think the age old advice to speak slowly and clearly  is bogus. Does it really make sense that we should have to aggressively alter how we speak for others to understand us? I mean, shouldn't we be pretty good at talking? Sure, you need to be heard, but otherwise I encourage you to go natural. If you are concerned that a particular part of the talk is overly complex then simplify it and repeat yourself. This is hard to do but being able to describe a complex topic elegantly and effectively is very satisfying.

Walk us through what you’re doing and why. If you’re demoing code, don’t just read aloud what you are typing (we are watching your screen, after all). Instead, narrate what’s happening in a more conversational way. Your presentation should be a story with all three parts.

Focus on interesting details, skip uninteresting minutiae. This works especially well if you make your source code available. Tell the audience up front that everything you show will be theirs so they can just follow along with you without fear of being unable to reproduce what you have later.

Don't dumb it down. Unless you are giving a beginner's guide to whatever, aim high. The 25% who know it all already will appreciate not being bored to tears simply because of the fast pace of things. The 50% who can just barely keep up will love it  because they'll find everything facsinating (and they'll learn a ton). The 25% that can't keep up wouldn't have learned much from a lower density presentation any way. Don't let the bottom quartile ruin your presentation for everyone else.

For the love of all that is holy know how to use the presentation equipment. I refuse to be that guy stuck in the front of the room fiddling with the projector and microphone for the first 15 minutes of a 60 minute talk. Don't be that guy. I usually present in the same room with the same equipment but I still show up an hour early to get everything ready to go.

Don't be afraid to let others help you. If you are supposed to record something or teleconference the talk, ask a trusted coworker or friend to oversee that stuff. You don't want to be worrying about it if you can help it. This works for simple stuff, too. You can ask someone to keep an eye out for questions in the chat room or let you know if you went too quickly through something.

"Great tips, but how do I actually put one of these together?" you ask? Unfortunately, it's a lot of work, but the more work you do to prepare, the easier the actual presentation will be. Don't skimp on preparation (your audience can tell)!

I think most presentations are terrible because the presenter wasn't honest with himself regarding what needed to be done. There’s a lot more to presenting than many realize:
  • Pick a topic
  • Identify what you want to cover in the topic
  • Make an interesting outline of everything you want to cover
  • Practice it, cutting out stuff until you’re at about 40 minutes (throwing away content is the hardest part)
  • At this point you should be very satisfied with what you’ll cover. Now you can build your assets (code, slides, etc.).
Practice, speaking out loud, everything you think you need to say and do. Leave awkward pauses where you plan to take questions and actually go through the coding exercises you plan to do. Oddly enough, I feel more ridiculous speaking aloud my talk by myself or in front of my wife than I do to a real audience. How do you know when you have 40 minutes of content? You won’t until you practice!

If you're like me, you'll find that you move much faster in front of a crowd (it's probably just all the preparation kicking in!). This presents a significant problem. If you prepare 40 minutes of material, and present it in 30, what are you supposed to do for the remaining time? In practice, a lively audience will double that 30 minutes into 60 by asking questions. Unfortunately, it's difficult to encourage a lively audience. This is where I think humor helps a lot. If you make the room feel small and comfortable, people will chip in to the conversation when you ask for questions.

In fact, when I first started doing tech talks I flat out bribed people to ask questions. I gave away prizes (books on the presented topic, Chipotle gift cards, etc.) to people who contributed. I don't need to do that any more but initially I think it really helped teach the audience that I was serious about interacting with them.

But of course there are times where the crowd is just not into it and you find yourself with a lot of dead air to fill. You need a backup plan for filling that dead air. I always prepare an extra demo or exercise just in case this happens (or some other part of my presentation fails miserably). As I near the end of the talk, I just peek at the clock and decide if "I have time for one more thing" or if "it's time to wrap up and take some questions." Having this buffer is essential when you're just getting started or when presenting to an unfamiliar audience.

And finally, solicit feedback. If you want to get better at this you need to know how you're doing now. The feedback form I pass out at the beginning of the talk has evolved to something that's blissfully easy for people to complete, while still providing me the key information I need to make a better talk. Take it and modify it to suit your needs (don't complain about the formatting...I imported it from some legacy word processing program called "Word").

Now go forth and make a fool of yourself. For science!

Profanity in Technical Presentations and Business

This post started out a little unusually. My normally scheduled blog time was interrupted by an inconvenient support call from one of my customers (DST FML) and the whole mess of digging through databases and log files really ruined my NaBloPoMo motivation.

So after struggling against writer’s block for too long, I put the call out:


And it was answered:


Crap, indeed. Then, this happened:


Who am I to deny one of my personal tech heroes, Scott Hanselman?

Profanity in Technical Presentations and Business

I think people are generally very good at tailoring their behavior (speech, language, etc.) to their surroundings. That’s probably why, after noting a few encounters with presenters who didn’t follow this social norm, Hanselman was compelled to record some excellent points on the topic.

The simple fact is that the overwhelming majority of interactions we have with each other are professional and courteous. That’s how norms are established, after all. So, is crude language appropriate in professional settings? I think it’s better to look at language as just one of many aspects of how we interact with others.

For example, my vocabulary varies with my audience. I don’t use terms like lock escalation or time complexity with my sales people. Similarly, I avoid using terms like value add and thinking cap (yes, I actually hear that one occasionally) when talking to fellow programmers. I’ve even learned to live with people calling computers hard drives and mixing up Office and Windows (hi, Mom!) because that’s the jargon that’s appropriate when talking to people (e.g. my mom) who simply don’t care about technology all that much.

If we view language on a scale, we can adjust aspects of it to suit our surroundings. When I’m in a meeting with a bunch of higher-ups, for example, my language variables look like this:


I play it safe because to do anything else would be odd and possibly counterproductive. During the work day, with my closer coworkers, the dials move up a bit:


And then after work, at a code-a-thon, or in smaller groups, things max out as I turn into a child who just learned forbidden words and can’t shut up.

My point is, normal people constantly tune these social variables. Intentionally setting them out spec is a tactic that can be employed for dramatic effect, but I rarely find it necessary to do that in the work place. About as far as I’ve gone with such things was during my last tech talk presentation. As I was doing the overview stuff I remarked on the obvious absence of anyone from management. I joked that they were too busy golfing to learn something new and removed my dress shirt to give the remainder of the talk in the geeky t-shirt I was wearing underneath. I’m so baller, I know.

I think making inappropriate jokes or using bad language is, more than anything, distracting. I’m sure it offends some people, too, but I think the bigger issue is the effect it has on your signal. If people are busy thinking about how you said something, they aren’t thinking about what you said.

I think Scott’s right to focus on language as the essence of professionalism in the work place and during presentations. In other settings it might be something else. For example, commenters on Reddit crank the normal, dispassionate language option for crudeness to 11; it’s like an f-bomb blizzard where every snowflake is some different invocation of the same hyper-flexible word. But there heads explode if someone makes a typo or uses improper grammar.

So the next time you want to build a rapport with your audience or jazz up a boring topic, do what I do: tell self-deprecating jokes until you get sympathy laughs and move on to the cool stuff everyone came to hear about. If you think you need four-letter gimmicks to earn people’s time, you’re doing it wrong.

And they were ponies the whole time.

Friday, November 4, 2011

Oh no! I have an interview today and did absolutely nothing to prepare!

My company hires a fair bit and involves its engineers in the process. When you interview with us, you’re likely to speak to 5-7 different people for 20-30 minutes each. It’s grueling.

With the experience of interviewing about 60 people under my belt, these are the tips I share with friends and family foolish enough to call me as they drive to their interviews.

If you have time to prepare, by all means, do a little searching and you’ll find a limitless supply of articles full of really great interview tips. This is meant to be a crash course.

1. Relax. If you know your stuff, then killing this interview will be easy. Conversation will flow naturally and you will be a very impressive candidate. The field is full of people who do not know their stuff so simply knowing a bit about whatever it is that got you the interview in the first place is a big +1 to you.

2. Do not be afraid to think during the interview. When asked a difficult question, take a few seconds to think of an answer. You can even share a related anecdote to get you started if it applies.

Think about it this way: if you answer a tough immediately what can I conclude? All I can really tell is that you prepared for the interview, or have recently answered that question. Preparation is definitely a plus, sure. If, however, you pause to consider the question (just as you would in any normal conversation) and come up with a decent answer, I’m impressed, too.

The risk of answering too quickly is that you might give a terrible answer and then feel like an idiot as you back pedal away from it. Take your time.

3. Think of a question or two for each person you talk to. When I finish with my questions, I’ll ask the candidates if they have any of their own. It helps if you do. Just be careful to actually focus on what the interviewer is asking you--don’t let this distract you too much.

If you’ve done preparation in advance, you should already have a few great questions that are targeted specifically to the company--these are excellent and really set you apart because almost no one does this.
If you’ve done no preparation (for shame!) generic questions are absolutely fine. One of my favorites is, “what’s a typical work day for someone in my position like?” This question helps you in several ways:

  • It gives you a break
  • If lets the interviewer hear him/herself talk (which we like)
  • You get good information (maybe you actually don’t want this job!)

4. Take notes, but only on two things: the names/emails of the people you talk to, and anything you need to do after the interview (i.e. specific questions you couldn’t answer on the spot like your exact start date, salary info, favorite color, etc). Luckily these two go well together because when you write a personalized thank-you note to each of the people you talked to (including reception, HR, etc.), you can include your answers.

If you miss a person’s name, just ask. If you forget to ask before the interviewer leaves, ask the next person you talk to who that last person was. I get this a lot and I’m happy to help you with this information.

Remember, this is just last minute advice. Do yourself a favor and do some actual preparation. Learn about the company. Practice selling yourself. Figure out what you want and go get it!

Thursday, November 3, 2011

What I Miss From My Android as a New iPhone User

If you’re just joining us, this is part two of my “OMG I just got an iPhone” series. You can read about what I love about the iPhone in the previous post. While preparing this post, I realized that I' put together a nice overview of the awesomeness of Android 14 months ago. That post is still pretty valid and worth a read. I have a great chart over there that bears repeating:

That is, whether you go with Android or iPhone or whatever, these are overwhelming amazing devices. Any critique herein is admittedly just nitpicky. We are living in a very exciting time.

(Note: “WinMo” refers to pre-WindowsPhone7 stuff. WinPhone7 was brand-spanking new back then and I have zero experience with whatever’s new these days in the Windows world. Please don’t assume that I’m knocking the MS offerings by omission or at all, I just haven’t used them.)

OK, let’s go.

What I Miss From My Android as a New iPhone User

(In no particular order.)

Identity Management

When you setup an Android phone, you have to tie a Google account to it, just like an iPhone requires an Apple ID. Where Android one-ups iPhone is by letting you use this identity to sign in to other apps. This means that I setup my Google account once, but then just say, “yep, use that one” when I launch Gmail, Reader, News, Voice, Plus, etc. without typing in my password again.

Typing passwords is really a big part of it. I feel like I have to type my login info all-the-damn-time on my iPhone. Since I have long, random passwords (thanks, LastPass!), this is a bit of a pain.

I think the next big thing in tech is going to be a ridiculously simple to use, and comprehensive approach to identity and its related attributes. The burden is just growing to be too much to put it off much longer. You hear that Microsoft? Google? Facebook? Apple? Get on it!

Fewer Password Prompts

Automatic_Updates_inlineA tad more on this, because it’s really annoying. Why do I have to enter my password to install apps? Why when I update apps? Feel free to ask for a pin or password when money’s involved, but otherwise I feel like I’m authenticating myself waaaay too much.

This is something that strikes me as a very “un-Apple” thing to do. The company that insists that two mouse buttons is too complicated doesn’t strike me as the company that ought to make updating my apps so hard. Actually, apps (optionally) update automatically on Android—I miss that.

dincA “Back” Button

Android phones typically have four buttons vs. iPhones “home” button. I’ve complained in the past about these buttons being in frustratingly inconsistent order between vendors, but I do like them. Of those buttons, I miss the back button the most. It pops the stack and takes you to whatever you were just looking at. As you pop around between apps, open links, etc., tapping back would intuitively rewind your experience.

The comparable experience on iPhone is less than ideal. It goes like this:

  • While looking at some content, click a link or a notification
  • Something else opens, do whatever you want with it
  • To return to what you were doing before clicking the link or the notification:
  • Double-tap the home button and tap the app you were using

It’s not a huge deal, but it’s three taps and a tiny bit of extra mental energy to do something that’s just one brainless tap on Android. I can’t imagine how annoying this must have been on iPhone before the multitasking stuff was released.

Google Voice Integration

This is a big one for me. I love Google Voice. I’ve used it extensively for years, to the point where I honestly have lost track of my actual phone number (I only know and share my GV number). GV integrates fully into Android and it is awesome. Texting, calling, etc. all seamlessly work through my GV number without a second thought on Android.

The iPhone experience is weak in comparison. I can dial and text, but only from the GV app. The native dialer and iMessage app don’t consider GV at all, which means that other apps that dial and text (tapping on numbers in any other app, or doing speech-driven stuff with Siri) don’t use my Google Voice number.

Apple, you can keep your visual voicemail, ok? Google Voice is way, way better and does so much more.

Related: does anyone have personal experience with better integration via jailbreaking (there’s hope!)?

Third-Party Apps as First Class Citizens

Google Voice is my token example of how Android lets third party apps really integrate well if you want them to, but the truth is, that power is available to every app. The way Android does it is pretty slick, too.

Imagine if you will, the web browser. You’ve been using it for months when suddenly, for whatever reason, you install a different one.The first time you click on a link that would normally open the default browser, you’ll see this:

You’ve been using “Browser” by default for months, but now that you have two on there, the phone knows to ask you what to do. You can choose to use either browser (and to make your selection the default). It really works great in practice and is something I miss very much.

new-android-market-feature-sharing_2.jpg (299×499)Sharing

I really like how Android handles sharing. In any app that has content you want to share with another app, you just hit “share”, and up pops a menu of places it can go. The share-to list is populated by whatever apps can accept your content so integrating with everything is really easy. On iPhone it seems like you have to either wait for Apple to build in support for sharing via individual services (e.g. Twitter), or go to the destination app first and then load the item to be shared from there.

I do admit that iPhone’s strict control over this means that the hand off is more sophisticated and little slicker, but I really miss the open-for-business approach Android takes in letting any app list itself on the share menu.

Better Google Apps

While apps in general are better in the iPhone universe, Google’s apps are the exception. I’ve found that Google not only releases more apps for Android than iPhone but they also come out more quickly and seem to be of higher quality.

Take Gmail as an obvious example. iPhone’s native email client supports Gmail, but if you do that you don’t get push notifications. Gmail gets around that by pretending to be an Exchange Server, so you can get push, but then you lose much of what makes Gmail awesome.

The Gmail app on Android is fantastic, but isn’t available on iPhone (as I write this, Google has released, and then pulled their Gmail app from the iPhone App Store—it’ll be back soon, but it’s literally years behind).

I also miss Google Talk. Are there any decent Google Talk apps for iPhone?

Oh and for star gazing, Google Sky Map is very impressive.

Better Development Experience

I don’t have a lot of experience with mobile development on either platform, but what little I do have leaves me loving Android development more than iPhone development. The objective-c stuff I played around with really melted my brain. Plus, provisioning and deployment was very tricky on iPhone. When playing around on my Droid, this stuff was easy, and without an NDA to worry about, people are much more talkative about it. All that talking means there’s a wealth of information out there to help.

To be fair, I have a lot of experience with programming that’s more similar to Android’s Java than iPhone’s Obj-C, but still. I think the fact that an industry is growing up around iPhone app development to let you build apps in anything but obj-c suggests that the iPhone platform is simply more difficult to work with.

Flash (But Just Barely)

This one almost didn’t make the list. Flash on Android is rarely a pleasant experience but there have been a few times where I wouldn’t have been able to get the info I needed without it. This is really a shame-on-you to the site owners that don’t have mobile-friendly versions of their sites, but the fact is, at least running flash was an option on my droid.

Tinkerer Friendly

I’m a life long tinkerer. One of my favorite things to do when I was little was to disassemble old electronics (phones, VCRs, computers, etc.) and then imagine how all the magical pieces inside worked. This led directly to my career in engineering (I actually know how some of that stuff works now!).

Android was very compatible with my tinkerer-inclined mind. I could dig around in the OS files, write quick and dirty apps, attach a debugger, root it, install various roms, etc. I know you can do a lot of that on iPhone, but with Android it’s all encouraged and seems much more accessible.

Cheaper/Standardized Accessories

While I do love the solid, versatile dock connector, I don’t love that everything that plugs into it costs $25. And if you do consider cheap chargers and cables, you have to wade through hundreds of one-star reviews about how a $6 piece of wire caused someone’s house to burn down and his dog to run away.

Luckily I don’t have to buy these but once! That is, unless Apple decides to change the beloved dock in such a way that all my old accessories stop working with newer devices…again :(.

Most Droids simply use a micro USB connection. This was great as it meant Wife and I could share chargers for our phones, Kindles, and Bluetooth headsets. And the chargers and cables were dirt cheap.


One of the unsung heroes of the Android OS has got to be navigation. Yes, Maps is great (another example of Google’s apps being better on Android), but Navigation is amazing. It’s, by far, the best GPS navigation implementation I have ever used.

It’s fully integrated with Google Voice Actions, too (kind of like iPhone’s Siri) so I would routinely say things like this while driving, “navigate to Target/BestBuy/Dunkin Donuts/Natatorium in Some City” and it just works.

It is beautiful, fast, intuitive, and very effective. (It does kill the phone’s battery, though…)

go homeShortcuts

Shortcuts are one of the things I bet almost nobody uses, but they are great. You can add shortcuts to you home screen for apps, sure (Android normally keeps apps in a drawer, not on the home screen), but also for common actions like navigating to a specific address (home, work, etc.), calling someone, or playing a song. Having single-tap access to common actions is pretty great.


Like I said before, having so much computing power, and so much access to information available to us at all times is pretty amazing—all modern smart phones enable that. It’s great that we have so much competition in this space, too, as it will only serve to improve each platform.

I love where these things are heading and count myself lucky to have only first world problems like these to personally blog about :)

Any other switchers out there?

How the Google Search “Do a barrel roll” Works

As a web guy I was intrigued by today’s Google easter egg. If you haven’t heard, go to Google and search for “Do a barrel roll”. If you’re using a decent browser, the entire page will do fun things.


How do they do it? I jumped into the source to see. It’s a simple CSS transition:

@-moz-keyframes roll    { 100% { -moz-transform: rotate(360deg); } } 
@-o-keyframes roll      { 100% { -o-transform: rotate(360deg); } } 
@-webkit-keyframes roll { 100% { -webkit-transform: rotate(360deg); } } 
    border: 1px solid #000;
    -moz-animation-name: roll; -moz-animation-duration: 4s; -moz-animation-iteration-count: 1; 
    -o-animation-name: roll; -o-animation-duration: 4s; -o-animation-iteration-count: 1; 
    -webkit-animation-name: roll; -webkit-animation-duration: 4s; -webkit-animation-iteration-count: 1; 
Nice and easy, eh? Now go play with this fiddle.

Wednesday, November 2, 2011

Moving A Hard Drive with Windows 7 to a New Machine

I just got a shiny new laptop (yay, thanks, Work!). In the old days (with Windows XP), I’d start fresh and clean on the new machine, slowly moving my old files over. That process would take a couple of days and I’d be back to full strength within a week.

I think Windows 7 is the first Windows OS that ages nicely enough that I don’t have to start from scratch every few years. So instead of spending 18 hours installing stuff, I physically moved my hard drive from my old machine to my new one. Here’s how:


Yes, I really moved my drive from one machine to another without reinstalling anything (except drivers). And you can, too! Don’t listen to the naysayers (but do make backups just in case).

I followed “Method One” in that guide which basically does the following:

  1. Backup your system (seriously!)
  2. Prepare your drive to be moved (sysprep)
  3. Move or duplicate your drive to your new machine
  4. Boot up and do some configuration
  5. Install all your drivers

The process took a couple of hours but was totally worth it when compared to starting from scratch. A few tips that might not be in the guide:

  • You will lose activations of Office, Windows, iTunes, and pretty much any tool that cares about your hardware. Plan accordingly
  • You will lose pretty much all Windows-specific settings like WIFI connections
  • Most user-specific stuff stays put (all your files, application settings, etc.), but oddly enough you lose your taskbar customizations. Take a screenshot of those if you are fond of them
  • Download the drivers for your new machine in advance. If you do nothing else, at least get the drivers for your network card. I luckily had the foresight to do this :)

I’m happy to report that I’m typing this post on my awesomely fast new laptop and all the above actually worked better than I expected :).

On a related note, I don’t understand why hardly anyone shares their WEI numbers. Here are my before/after numbers (Dell Latitude D520 vs. E6520) in case anyone is curious:



And side-by-side:


I’ll be getting a memory upgrade in a week or so (on order) but I don’t expect that to have much affect on these numbers. I will, however, finally reap some x64 benefits…