Category: Musing

Note: my experience below happened in February of 2013, I’m just super late in publishing it.

There’s been a growing trend in the way corporations approach customer service. In industries that have become largely undifferentiated in the products or services they offer, the thing companies are trying to do is put forth the best possible customer experience. Which is great, you should always treat your customers well. But a recent experience has made me wish some of them would take a page out of the big book of common sense.

I recently had to contact Apple for technical support. As a very technical person, I don’t look forward to having to talk to tech support. I have to invest a certain amount of time going through the standard menu of questions about my problem. Sometimes the level 1 person can solve my issue, but often they can’t and things have to be escalated. Only they don’t always know (or are allowed?) to do that.

My Apple problem was strange and unexpected: I tried to buy an iTunes e-gift card for my mom’s birthday. I’m 99% positive I’ve made this kind of purchase before but it’s been a while. I hadn’t upgraded to iTunes 11 yet so that was the first thing I did. When I tried to complete the purchase I got a message saying it couldn’t be completed and that I’d need to contact Apple for assistance. So that’s fine. Only it was very not-fine.

I went to and filled out a request for support. I got a lengthy e-mail reply that started out with the words ‘A wonderful day to you!’ Why, thank you! The person indicated they were working on my problem, that I would get an e-mail after the matter has been investigated, etc. A day goes by and I get another reply, in which the same person says sorry but ‘my account is not authorized to obtain content from the U.S. iTunes Store. For this, we are unable to provide further information, but I strongly suggest you to review the iTunes Store Terms and conditions.’ Whaaa? That made no sense at all, and was entirely too cryptic.

My first thought was that they think I’m doing something fraudulent. I know all about Mat Honan’s experience and I’m sure Apple is still feeling some paranoia from that. And I did notice that the credit card I had on file in iTunes had expired when I went to make my purchase. I updated my payment info, but maybe they still weren’t sure things were on the level. That’s understandable.

I replied back saying that doesn’t seem right, I’ve bought a lot of stuff over the years through the iTunes store, could they escalate my ticket. What proceeded was two weeks of back and forth over why they wouldn’t let me give them money, and why they wouldn’t tell me what was really wrong. I don’t expect them to tell me every little detail about what’s in their records or their processes for customer disputes. But at least give me the overall reason, like ‘the payment info we got from you appears bogus’. More information is usually better than less. Instead in each e-mail they kept using phrases like ‘I acknowledge that you want to have an explanation for this’, apologizing profusely, thanking me for being a customer, and giving me a link where I could leave feedback.

Eventually they flipped whatever switch would allow me to purchase an e-gift card via iTunes, but by then the birthday I was buying it for had passed and I had already gone with Amazon. So sorry Apple, but I may need to look elsewhere for my MP3-buying needs in the future. My suggestion is you try to be more open and forthright when helping customers, rather than include so many nice platitudes in your e-mails.


Adobe uses a novel though hardly unique approach to distributing certain software. If you want to install say, Acrobat Reader onto your Windows machine, you go to their web site and download an installer. Only you don’t download an installer, you download a bootstrapper that downloads the right thing for you, based on your OS version, language, and platform. More and more vendors have adopted this approach over the years as different version of Windows have proliferated, 64-bit has became more widespread, and they have wanted to make the process easier on the user.

What Adobe does that is unique and unbelievable on Windows is once you launch the bootstrapper, it deletes the file. The program is running in memory but the actual executable file is gone. This means if something goes wrong during the download of the real installer or the subsequent installation, you can’t just restart it. You have to re-download the bootstrapper. Needless to say, this completely sucks and shouldn’t be necessary.

The Acrobat Reader bootstrapper has been like this for years and after recently rebuilding my laptop and installing it, I started to wonder if there was perhaps some technical reason, however outlandish, for that behavior. Is it because it needs to be chained together with other installers, or maybe bundled with some other completely different one? It needs to run silently and can’t leave any footprint on disk? They are trying to keep your machine clean??

Apparently Adobe has a direct download page that doesn’t try to detect the specifics of your machine, and will let you download a full installer that doesn’t have this behavior. A quick Google search reveals that several people have noticed this and none of them like it. Maybe Adobe should put a link on the Acrobat Reader download page in big type that says something like ‘Why we delete this file after you launch it’, which takes you to a page with an explanation. That would be nice.


It’s been over a year since I last touched my bookmark browser, and it needed some attention. There were a couple of outstanding bugs to deal with, plus it seemed like a good time to update the various libraries it uses.

One bug that occasionally cropped up is logging in for the first time and changing to the bookmark page, but having nothing show up. If I did a full refresh of the page then everything would be fine. I never quite figured out what was going on, until now. I assumed there was something I wasn’t doing right with Knockout, so I tried moving the code that does the bindings from the PageBeforeShow event for the bookmark page to right after the AJAX call that gets the data. But that didn’t help. Turns out it was something simple: the bookmark container is initially hidden, and I was never showing it after the first successful login, assuming the app was started in a logged-out state. The solution was showing the container right after the bindings were applied.

And speaking of content not showing right, it suddenly became necessary to add an explicit jQuery Mobile refresh call on the list that holds the bookmark data, like this:

Without such a call none of the jQuery Mobile styles would be applied unless I did a full page refresh. Not sure why, but whatever. The latest version did resolve a weird style issue with the bookmark menu list showing a double border around each list item, so that’s good.


I’ve been waiting to upgrade my iPhone 4S to iOS 6 until there was a maps app available other than the new native one that Apple built. And by ‘other’ I really mean one from Google. I only use maps for directions about half the time; the other half is spent searching, which is precisely where the Apple app falls down hard. So it was with great pleasure that I installed the official Google native maps app shortly after it was released. It’s beautiful, and definitely works as well as the pre-iOS 6 one. A couple days after loading it I pulled the iOS 6 trigger. Everything I used on a regular basis was working great…or so I thought.

I use my bookmark browser every day. It has an option to refresh bookmark data each time you start a new session, but I’m not using it at the moment. That means I must manually refresh the data, which I do every week or so. But after the OS upgrade the refresh process started acting weird. Normally it takes a few seconds to get the data from Mozilla Sync. Once the data is downloaded the last refresh timestamp is updated along with the total bookmark count. What was happening is the refresh seemed to happen instantly. It would update the timestamp but the count never changed. I knew this was not right because I happened to do a bunch of bookmark organizing and the number should have been very different.

I found that clearing all website data for Safari would allow the refresh to work properly. But that blows away any data from other web sites, which is bad. I finally got annoyed enough that I opened up the code to see if maybe I was doing something wrong. My investigation lead to the cause of the problem: Apple had messed up again.

Here is what seems to be happening, based on this really popular question at Stack Overflow: Apple is servicing POST requests from its cache rather than sending them to the server if no cache-control header is included and the request data is unchanged. It appears to be a bug. The AJAX call the bookmark browser makes to the server uses the same parameters each time: username, password and key. So the browser was basically not making the call to the server, and my post-request code was executing as if it had.

The solution was to set the ‘cache-control’ header in the POST to ‘no-cache’. It seems to have solved the problem. The good news is an official fix is supposed to be in the up-and-coming iOS 6.1. It seems like version 6 is on track to be the most problematic iOS release yet.


As I was putting the final touches on my Bookmark browser project, I came across this:

That’s delicious, because I strongly suspected Mozilla wasn’t interested in improving Home or fixing any issues with it. Yet another reason I wanted to build a replacement. They have published the iOS Sync client source code that Home was built upon at GitHub. It would be fun to use that code and learn Objective-C while building a new app, but first I need to get a Mac. Maybe next year…

It seems a developer has taken that ball and run with it. He posted a new app in the app store that is essentially the same as Home. I’ll be giving it a try.

Later update
OK, this is lame. He basically took the Firefox Home source code, removed all references to Mozilla, slapped on a new name, and submitted it to the App Store. All the same flaws are there, including the re-arrangement bug that I hate.


In 2004 I was working at a job which involved projects that made heavy use of VBA; from an Access application that would literally build an entire PowerPoint presentation from scratch, to Excel workbooks that would do all sorts of things that Excel was probably never designed to do. None of them would have been possible without the very thorough and extensive COM-based API that Microsoft makes available for all its Office applications.

The one place where the Office API falls down though is in web applications. Being single threaded, the code does not play nice in that kind of environment, and it is not officially supported by Microsoft (though it is not strictly impossible to use it that way). Recently I needed to have an ASP.NET web application of mine open an Excel template and add some data. I figured I would need to do something like build a separate web service to handle the Excel processing, using the same API I know and sort of love. Then I discovered Microsoft had published an SDK specifically for interacting with the XML-based default file formats introduced in Office 2007. And to my delight, they provided a managed DLL that would integrate nicely with ASP.NET. Life was good.

Or so I thought. Turns out the new API is not as nice as the COM-based original. The main issue I had is it takes a very XML-centric approach to doing things, which made it hard to implement the specific Excel things I wanted, like cell formatting, copying rows, etc. The old API was much more closely aligned with the individual Office apps, making it fairly straightforward to utilize whatever document features you wanted via code. Fortunately I wasn’t the first to feel like the new way was harder than it had to be. I recently came across ClosedXML, which is a .NET wrapper around the new API that makes doing Excel-specific things so much easier. Many thanks to MDeLeon for his excellent creation.


There are a million to-do list applications out there, both rich client and web-based. I never found one that did everything I wanted it to, which led me to consider writing my own. But then I discovered Todoist and now life is so very good.

Todoist is a web app that gives you a standard list of projects and tasks. Projects can be color-coded, and tasks can have a priority, labels, notes, a due date, etc. Both can be reordered manually or in the case of tasks by priority. You can further query by label or due date, and move tasks easily between projects. The killer feature for me was you can create subtasks below a main task, which show as indented and can be marked as completed individually while keeping the main task active.

They decided to use very a Gmail-like approach to the user interface. Clicking on one of the gear icons next to each project and task activates a context menu similar to the ones in Gmail. It’s fairly minimalistic in the overall layout of the page, making it feel very snappy. Plus it has a bunch of keyboard shortcuts and there is not only an iOS app but a Firefox extension for it as well.

They offer a base set of features for free, or you can get the premium version for $3 a month or $24 for a year, which gives you the advanced query capabilities and some other stuff. It was well worth it.


Recently I was trolling through my collection of lesser-read developer blogs when I came across this September, 2010 post from James Senior on jQuery templates, and from there to this one by Stephen Walther. The big news at the time was that Microsoft was going to start contributing code to the jQuery project.

One their first projects was a templating plugin. The idea is you can embed a chunk of markup in a page that contains placeholders for data. Then you call the plugin, pass it some data, and it merges everything into the template, producing markup that is ready for rendering. It looked like just the kind of thing I’d want to start using in production, today. Turns out that would have been a bad idea.

After I downloaded the code and some samples, I surfed around a bit more on the subject and learned that they are no longer actively maintaining the jQuery template plugin. They have decided to go in a new direction. Which is fine, but woe are the people who decided to invest heavily in the plugin during those first few months and are now stuck with a dead-end tool.

The rate of change of web technologies and tools is getting scary fast, and it makes me subconsciously shy away from the latest new stuff because it could all be replaced in 6 months. That might not be the best approach for a professional developer to take, but neither is having such instability in the LOB applications you have to write and maintain.


Over the last couple of years there’s been a lot of debate over how web authentication should work. On the one hand you have traditional web sites where you have to register before you can use them, which involve selecting a user name and password, and then you have recent open standards for authentication like OpenID that allow you to authenticate using a common, predefined set of credentials.

The OpenID approach never really excited me like some others. I have never had a problem with multiple web site accounts, since I have a scheme for selecting user names and passwords that seems to work fairly well. The problem is for some sites it’s not feasible to outsource the authentication to a third party provider. Things like the site for managing your retirement account, or your bank’s web site. Unfortunately the biggest issue I keep seeing with these types of sites is most of them have very strange, very bad password requirements.

Case in point: forcing you to select a password that is no more than 8 characters, or cannot contain non-alphanumerics. That’s just insane. The best way to create a strong password is to make it long and include a variety of characters types (letters, numbers, symbols, etc). I find it hard to believe these institutions are so strapped for space on their database server/mainframe that they can’t afford a few more characters per password. Likewise, what modern RDBMS doesn’t support the standard non-alphas that people tend to use?

It boggles the mind.


I’ve been a fan of Google since 1999 or so, back when nobody knew who they were. I loved the simplicity of their site and how well their search techniques worked. And while they are still my go-to search engine, they recently added a feature that can only be described as horrible. I’m talking ‘I completely hate this, do I need to switch to Blekko now?’ kind of horrible.

I’m talking about instant preview, the snapshot of a given search result that pops up when you hover the mouse over it, or click the magnifying glass next to it. I didn’t mind the instant search feature they rolled out earlier this year. I used it for a couple of weeks until the constant screen updates as I edited the search box got annoying. And then I simply turned it off. For instant preview it’s not so simple. Oh you can sort of turn it off by closing the popup box, but as soon as you (inadvertently) click the screen near a search result, the popup returns.

I did some cursory searching and lots of people don’t like this feature, and they all wanted to know how to turn it off permanently. Google apparently hasn’t given users a clear way to do that, which makes me wonder what the heck is going on over there.

But there is hope if you are a Firefox user and have AdBlock Plus installed. You can add these three filters to stop instant preview for good:

They are working well so far. I shudder to think what new stuff is in the works.