Monday, December 17, 2012

Goodbye, Hello

I'm happy to share that I've begun an entirely new volume in my career. Today is my first day at OverDrive, Inc.

The New

OverDrive does management and distribution of digital media like audio books and ebooks. If you've ever borrowed an ebook from your library, the chances are very good you've touched their technology.

They're headquartered in an amazing new office in Garfield Heights, Ohio, where I'll be working as a developer.

The Old

I am leaving behind an incredible team at RoviSys. I worked there for nearly eight years and had the pleasure of building some great software and great relationships.

If you're looking for a fun, dynamic environment with some clever, passionate people give them a shout. If you like variety in your work or love to travel why are you still here? Go call them (they're hiring all the time)!

What?! Why?

I had a pretty sweet setup at RoviSys, it's true. So why would I step out into the unknown like this? It really boiled down to the differences between consulting work and product work.

For me, consulting meant that I got to work on a variety of different things. The projects were numerous. That's good.

Product work is different. Pretty much all your effort goes to support the products of your company. Of course products are complex things with lots of moving parts, but it's a far cry from the diversity you see in consulting.

I appreciate the variety of the consulting world but I crave the razor focus of the products world. I want to polish the application until it shines. I want the user experience to be so smooth that I'm not tortured watching a new user stumble through it. Consulting doesn't work that way because it's rarely needed there.

In the consulting world things usually just need to be good enough. That's not a bad thing; the goals are just different. If a customer wants to manage some data with a mobile app, they're satisfied when they can do that. They typically are not willing to pay more to make sure it has a nice icon, comprehensive support documentation, clean URLs, good performance, etc.

Why Now?

I don't like to coast through things and I didn't like where inertia was taking me. To continue growing as an engineer I felt that I needed to travel a different path. So that's what I'm doing. I won't be using radically different tools or tackling alien problems, but I'll be building things that help millions of people. And these things I help to build will be really, really shiny.

Thank you to everyone who helped me work through this difficult decision!

Wednesday, December 12, 2012

The Real Reason They’re Taking Away Your Unlimited Data

When the wireless companies started cutting back on their unlimited data offerings last year, I was a little confused. AT&T went first, then Verizon.

Don’t worry, they said—hardly anyone goes over these new limits. It seemed strange to me that they’d go out of their way to upset so many just to catch a few heavy users.

But they did and here’s why: 4g. And the future.

Sure it’s hard to use much data with a 3g device now. Some day you’ll pick up a fancy new 4g phone or tablet. And the data will be a flowing. Once it’s easy and practical to stream Netflix on our phones, we will. And the phone carriers seem to have had the unusual foresight to position themselves accordingly.

They’re getting us to abandon our unlimited plans when it’s painless, and then a year or two from now it’ll be our fault when we start hitting our data caps and upgrading our plans accordingly.

And that sucks.

Google Analytics: Fun with Advanced Segments

I was curious about how my blog’s visitor’s tech has changed over the years. Perhaps Google Analytics can help?

The normal stats you get for your users are pretty nice:


But this doesn’t show us how they’ve changed over time. For instance, how has Internet Explorer fared over the last two years? You can do this with advanced segments.

Click the advanced segments button and add a few custom segments for the metric you’re interested in. In my case, I added one for browsers that look like IE, and browsers that don’t:



Then add those to your report:


And you get something like this:


It looks like my IE traffic has always been less than other browsers, and it’s also grown at a much slower rate leading to the huge disparity I see today.

This shows the visitor count for each month, so this shows raw growth, too. I’d prefer to look at this in percentage terms but I couldn’t figure that out. Dumping these data into a spreadsheet lets me view things the way I wanted initially:


After a little pivot table action and a chart, I have what I want:


We can see that IE popularity is dropping slowly…much more slowly than I expected. Let’s see if we can abuse visualizations a little to make this look more dramatic. Here’s the “trend” view:


I used independent scales. It’s super effective.

Google Analytics is a fun thing to turn on when a project starts and then forget about for a while. Some day later, you can come back and lose two hours exploring the trove of data you’ve collected.

Here’s some more stat candy if that’s what you’re in to. Watch out, BlackBerry users, you’re as popular as PS3 (#LOLWUT):


I’m pleasantly surprised to see that 1280px+-wide monitors make up more than 80% of my traffic. I’m sad for all those poor souls using the BS “HD” resolution of 1366x768, though.


Tuesday, December 11, 2012

SAP Connector: “ERROR service '?' unknown” (SOLVED)

So you’ve been using the SAP .NET Connector 3.0 for a while and it’s working great to connect your .NET application to SAP when suddenly you start getting this error:

ERROR service '?' unknown

You probably have some code like this (or you’re just trying to login or get your app to run):

Server = RfcServerManager.GetServer(serverName, rfcHandlers);

// other init...


So what happened? I’m guessing you have a new machine or recently removed some SAP-related software. I’m also guessing that if you install the SAP Logon pad, this issue will go away. But you don’t have to go to all that trouble! In my experience, all you need to do is add some configuration to the system services file. Here’s how:

  1. Open Notepad as an administrator
  2. Open this file: %windir%\system32\drivers\etc\services
  3. Look around for services starting with "sap"
  4. Assuming you don't find much, add these lines to the end:
    sapdp00  3200/tcp
    sapdp01  3201/tcp
    sapdp02  3202/tcp
    sapdp03  3203/tcp
    sapdp04  3204/tcp
    sapdp05  3205/tcp
    sapdp06  3206/tcp
    sapdp07  3207/tcp
    sapdp08  3208/tcp
    sapdp09  3209/tcp
    sapdp10  3210/tcp
    sapdp11  3211/tcp
    sapdp12  3212/tcp
    sapdp13  3213/tcp
    sapdp14  3214/tcp
    sapdp15  3215/tcp
    sapdp16  3216/tcp
    sapdp17  3217/tcp
    sapdp18  3218/tcp
    sapdp19  3219/tcp
    sapdp20  3220/tcp
    sapdp21  3221/tcp
    sapdp22  3222/tcp
    sapdp23  3223/tcp
    sapdp24  3224/tcp
    sapdp25  3225/tcp
    sapdp26  3226/tcp
    sapdp27  3227/tcp
    sapdp28  3228/tcp
    sapdp29  3229/tcp
    sapdp30  3230/tcp
    sapdp31  3231/tcp
    sapdp32  3232/tcp
    sapdp33  3233/tcp
    sapdp34  3234/tcp
    sapdp35  3235/tcp
    sapdp36  3236/tcp
    sapdp37  3237/tcp
    sapdp38  3238/tcp
    sapdp39  3239/tcp
    sapdp40  3240/tcp
    sapdp41  3241/tcp
    sapdp42  3242/tcp
    sapdp43  3243/tcp
    sapdp44  3244/tcp
    sapdp45  3245/tcp
    sapdp46  3246/tcp
    sapdp47  3247/tcp
    sapdp48  3248/tcp
    sapdp49  3249/tcp
    sapdp50  3250/tcp
    sapdp51  3251/tcp
    sapdp52  3252/tcp
    sapdp53  3253/tcp
    sapdp54  3254/tcp
    sapdp55  3255/tcp
    sapdp56  3256/tcp
    sapdp57  3257/tcp
    sapdp58  3258/tcp
    sapdp59  3259/tcp
    sapdp60  3260/tcp
    sapdp61  3261/tcp
    sapdp62  3262/tcp
    sapdp63  3263/tcp
    sapdp64  3264/tcp
    sapdp65  3265/tcp
    sapdp66  3266/tcp
    sapdp67  3267/tcp
    sapdp68  3268/tcp
    sapdp69  3269/tcp
    sapdp70  3270/tcp
    sapdp71  3271/tcp
    sapdp72  3272/tcp
    sapdp73  3273/tcp
    sapdp74  3274/tcp
    sapdp75  3275/tcp
    sapdp76  3276/tcp
    sapdp77  3277/tcp
    sapdp78  3278/tcp
    sapdp79  3279/tcp
    sapdp80  3280/tcp
    sapdp81  3281/tcp
    sapdp82  3282/tcp
    sapdp83  3283/tcp
    sapdp84  3284/tcp
    sapdp85  3285/tcp
    sapdp86  3286/tcp
    sapdp87  3287/tcp
    sapdp88  3288/tcp
    sapdp89  3289/tcp
    sapdp90  3290/tcp
    sapdp91  3291/tcp
    sapdp92  3292/tcp
    sapdp93  3293/tcp
    sapdp94  3294/tcp
    sapdp95  3295/tcp
    sapdp96  3296/tcp
    sapdp97  3297/tcp
    sapdp98  3298/tcp
    sapdp99  3299/tcp
    sapgw00  3300/tcp
    sapgw01  3301/tcp
    sapgw02  3302/tcp
    sapgw03  3303/tcp
    sapgw04  3304/tcp
    sapgw05  3305/tcp
    sapgw06  3306/tcp
    sapgw07  3307/tcp
    sapgw08  3308/tcp
    sapgw09  3309/tcp
    sapgw10  3310/tcp
    sapgw11  3311/tcp
    sapgw12  3312/tcp
    sapgw13  3313/tcp
    sapgw14  3314/tcp
    sapgw15  3315/tcp
    sapgw16  3316/tcp
    sapgw17  3317/tcp
    sapgw18  3318/tcp
    sapgw19  3319/tcp
    sapgw20  3320/tcp
    sapgw21  3321/tcp
    sapgw22  3322/tcp
    sapgw23  3323/tcp
    sapgw24  3324/tcp
    sapgw25  3325/tcp
    sapgw26  3326/tcp
    sapgw27  3327/tcp
    sapgw28  3328/tcp
    sapgw29  3329/tcp
    sapgw30  3330/tcp
    sapgw31  3331/tcp
    sapgw32  3332/tcp
    sapgw33  3333/tcp
    sapgw34  3334/tcp
    sapgw35  3335/tcp
    sapgw36  3336/tcp
    sapgw37  3337/tcp
    sapgw38  3338/tcp
    sapgw39  3339/tcp
    sapgw40  3340/tcp
    sapgw41  3341/tcp
    sapgw42  3342/tcp
    sapgw43  3343/tcp
    sapgw44  3344/tcp
    sapgw45  3345/tcp
    sapgw46  3346/tcp
    sapgw47  3347/tcp
    sapgw48  3348/tcp
    sapgw49  3349/tcp
    sapgw50  3350/tcp
    sapgw51  3351/tcp
    sapgw52  3352/tcp
    sapgw53  3353/tcp
    sapgw54  3354/tcp
    sapgw55  3355/tcp
    sapgw56  3356/tcp
    sapgw57  3357/tcp
    sapgw58  3358/tcp
    sapgw59  3359/tcp
    sapgw60  3360/tcp
    sapgw61  3361/tcp
    sapgw62  3362/tcp
    sapgw63  3363/tcp
    sapgw64  3364/tcp
    sapgw65  3365/tcp
    sapgw66  3366/tcp
    sapgw67  3367/tcp
    sapgw68  3368/tcp
    sapgw69  3369/tcp
    sapgw70  3370/tcp
    sapgw71  3371/tcp
    sapgw72  3372/tcp
    sapgw73  3373/tcp
    sapgw74  3374/tcp
    sapgw75  3375/tcp
    sapgw76  3376/tcp
    sapgw77  3377/tcp
    sapgw78  3378/tcp
    sapgw79  3379/tcp
    sapgw80  3380/tcp
    sapgw81  3381/tcp
    sapgw82  3382/tcp
    sapgw83  3383/tcp
    sapgw84  3384/tcp
    sapgw85  3385/tcp
    sapgw86  3386/tcp
    sapgw87  3387/tcp
    sapgw88  3388/tcp
    sapgw89  3389/tcp
    sapgw90  3390/tcp
    sapgw91  3391/tcp
    sapgw92  3392/tcp
    sapgw93  3393/tcp
    sapgw94  3394/tcp
    sapgw95  3395/tcp
    sapgw96  3396/tcp
    sapgw97  3397/tcp
    sapgw98  3398/tcp
    sapgw99  3399/tcp
  5. Save the file and restart your application (rebooting the machine shouldn't be required)

Strictly speaking, you should only really one or two of these—the one that corresponds to your SAP system—but I don’t think it hurts anything to have them all in there.

Other Things To Try

If that doesn’t fix it, you might also make sure you’re using a hostname (not an IP address) and that you are using the right connection for your situation (ashost/application server host vs. message server host else there is).

I also stumbled across a user reporting an issue with tabs vs. spaces. I’ve not had any trouble with spaces but your mileage may vary.

Monday, December 3, 2012

How Much Of that Sweet, Sweet Data Does Pandora Use on Your Phone?

Answer: about 30 MiB/hour.

I’ve been looking to upgrade to one of those shiny 4g phones. In doing so I’ll lose my unlimited data plan. Is that a problem? Maybe.

Verizon has a pretty neat calculator (I was surprised!) that gives you a rough idea of how much data you might you. The gist is that anything other than video/audio requires very little data:


That is: lots of email, browsing, and navigation requires well under a gigabyte a month. They helpfully indicate what numbers they’re using for these figures:

Email (text only) 10 KB
Web Access (internet and Intranet) 400 KB
Audio Streaming 60 MB/hr
Audio Track Download (3 1/2 min at 192 kbps 7 MB
3G Video Streaming 250 MB/hr
3G Verizon Video & NFL Mobile Streaming 125 MB/hr
4G Video Streaming 350 MB/hr
Digital Photo download/upload (Hi-Res) 3 MB
Navigation Turn by Turn Directions 5 MB/hr

So adding 2 hours of streaming a day blows up the data big time:


Ouch. Let’s hope you don’t want to watch a 30 minute video every day…


But are these numbers accurate? They are estimates, certainly, so I can only compare against my usage, which isn’t really fair, but it’s all I have.

I watch Hulu and listen to Pandora over the cellular network so let’s check those. I’m using my phone’s metering to record this. Here’s Pandora at t = { 5m, 10m, 11m }. (Of course letting this run for an hour would be better.). I didn’t use the phone for anything else during this test.


That is:

  • +3.5 MB after 5 minutes
  • +2.5 MB after 5 more minutes
  • +3.1 MB after 6 more minutes

Or, an average of 0.57 MB per minute. That’s about 34 MB per hour—just over half of what the Verizon calculator suggests. That’s good news! If this number is remotely correct, streaming Pandora for two hours a day will actually consume about 2 GB per month, not 3.5+ GB.

(Note: the Verizon site uses normal mebibytes but iOS doesn’t. The effect of this difference is not insignificant here.)

How does this align with what Pandora’s documentation claims?

Pandora on the Web plays 64k AAC+ for free listeners and 192k for Pandora One subscribers. All in-home devices play 128k audio, and mobile devices receive a variety of different rates depending on the capability of the device and the network they are on, but never more than 64k AAC+.

Pandora on the Web plays 64k AAC+ for free listeners and 192k for Pandora One subscribers. All in-home devices play 128k audio, and mobile devices receive a variety of different rates depending on the capability of the device and the network they are on, but never more than 64k AAC+.

OK, so let’s get that 64k stream into the units we like: MB/minute. (I’m assuming that “64k” means 64 kilobits per minute.):


So 0.47 MiB/minute. Nice. If I convert my above figures into MiB from MB, I get 0.54 MiB/minute. That’s still more than Pandora claims, but we’re in the ballpark so I’ll take their word for it1 (maybe I got some emails in the background during those 15 minutes…).

So, Pandora mobile uses just under half a megabyte per minute, or ~28 MiB per hour. The Verizon data estimator over estimates Pandora usage by over 100%. To their credit, they indicated what figures they used, and certainly other sites or services may stream music at a higher bitrate. But if you just use Pandora, this is good news.

1Huh. Now that I’ve simply confirmed Pandora’s claimed usage this whole experiement seems a bit ridiculous…

Does iOS Report Usage in Mebibytes or Megabytes?

Quick answer: megabytes (1 × 106 bytes).

With data caps being all the rage these days you might be wondering how you can check your data usage in iOS. It’s simple. Go to Settings > General > Usage > Cellular Usage:


But since I’m a computer guy, I want to know: is this measured in base-2 bytes (e.g. mebibytes) or base-10 bytes (megabytes)?

I couldn’t tell and the docs weren’t clear so I tested it. First I needed a test file. I took a video file and used 7zip to build a file that’s exactly 10 MB in size:


I chose a video file to make sure compression on the network or in the app I use to test this wouldn’t affect my results (video is already compressed so it won’t benefit from additional compression). I zipped it because that’s an easy way to slice off 10 MB of it (and it also further insures that the result is not compressible).

And that blob of 10,485,760 bytes is truly 10 mebibytes (10 × 220):


To see what affect this has, I downloaded the file to my phone with Dropbox and checked the affect on my usage. If iOS uses the binary-based definition of a megabyte (220), it should show “10.0 MB”. If it uses that other definition of a megabyte (106), it should show “10.4 MB” (or “10.5 MB” if there’s any rounding). Let’s see:

2012-11-30 15.02.202012-11-30 15.04.05

This took a few minutes. And the result:

2012-11-30 15.04.43

10.4 MB. Well there you have it: it uses the base-10 definition.

Friday, November 23, 2012

How I Discovered Amazon’s Impressive Gift Wrap Service Via a Generous Friend

I received an unexpected package today from Amazon. Hmmm…

2012-11-23 11.12.53

I opened it and started to get excited. It wasn’t what I usually get from Amazon (batteries, pink toys, etc.).

2012-11-23 11.12.59

It turns out that my friend Mark sent me a birthday present! Woot! I was very impressed by the presentation. Each item had a fancy wrapping, a fancy ribbon, and a fancy card.

2012-11-23 11.13.03

2012-11-23 11.13.37

I guess I’m known for my fruity shirts.

The gifts are perfect, and they arrived like a sir.

2012-11-23 11.15.41

2012-11-23 12.02.03

2012-11-23 12.02.08

I’m actually shocked the kids adapted so quickly to it all. Thing 1, and Uncle Chris:

2012-11-23 12.29.55

2012-11-23 11.16.14

2012-11-23 11.16.24

Thanks, Mark! I’ve got some learnin’ to do.

2012-11-23 13.40.35

Some day I’ll remember to give you your Christmas present from last year.

Thing1's Fun Run

Wife and I ran the Kent Turkey Trot again this year. She placed in the top 10 for women and I finished without dying so overall we beat our goals.

More exciting than mere survival, though was Thing1's race. She did a ~0.25 mile fun run. She was ridiculously photogenic on the way out but was moving so fast it was hard to capture her on film.

Congrats, Peanut!

Thursday, November 22, 2012

Dear Children: You Are Awesome

If you know me, you know that I can’t stop yammering about my kids. I won’t apologize for it: they’re great.

This occurs to me regularly. For instance, on Saturday I had the intimidating task of entertaining the kids by myself for the evening (Wife was busy). We had a great time. We didn’t do anything fancy—just wandered around the toys and Christmas decorations at Target and Lowes—but everyone was laughing and smiling and having fun.

08-2012-11-17 19.12.2409-2012-11-17 19.12.1410-2012-11-17 19.12.06

It helped that I remembered to feed them.

06-2012-11-16 18.35.58

“Look Daddy! A Christmas chicken!”

It’s not always so easy (we’re all cranky once in a while) but we’re having more and more good days as they get older and more independent. This is my message to new parents: it’s rough early on. But it gets better, easier, and so much more fun! Hang in there!

They start creating fun for themselves.

04-2012-11-15 07.41.33

And doing their own things.

05-2012-11-15 19.22.10

And sometimes they even like each other. Especially when they’re cold.

03-2012-11-09 21.18.39

And when we’re really, really lucky they wake up so happy that you can’t help but wake up happy, too.

01-2012-11-06 09.35.43

Happy Thanksgiving from the Harens!

02-2012-11-07 22.23.00