(Ad) War and (Ad Blocker) Peace

It’s hard not to fall into the ‘war and peace’ clichés when consider ad blocking and the ad blocking ‘wars’. There have been many articles written about this and there will be many more. Of course there isn’t any blood spilled (thank G-d). There’s panic and the ‘you are going to put us out of business’ accusations that are being volleyed back and forth. It’s a weak first-world version of CNN news during wars – focusing the graphic pictures and the things that will raise viewership regardless of any sort of viewer scarring.

I’ve been using ad blockers on and off somewhat haphazardly. A few weeks ago my co-worker asked me for advice related to ad/tracking blockers for her home machine. Her daughter had reached the pre-teen stage and besides the typical drama my co-worker wondered how to prevent or at least minimize the tracking that her daughter encountered on the web without the use of a cyber-nanny type of program.

My immediate recommendation was Ghostery. I told her “just block everything, and then whitelist the sites that you trust for your daughter.” Was this good advice? I don’t know. It was advice that made sense at the time and to me it still makes sense even now.

I had been using Ghostery for a while and I really liked. The interaction with my co-worker occurred just before iOS 9 was released with purchase-able content blockers for iOS’s Safari browser.

I was about to purchase a content blocker named Peace by one of my favorite iOS developers. I was about to purchase the blocker but I held off because I realized that I did relatively little reading through mobile Safari relegating any long web reading to Instapaper and getting most news through RSS feeds or private Twitter lists that I created.

Right after my purchase hesitation, Marco Arment pulled Peace off Apple’s app store and the Twittersphere went ape sh*t over his decision vilifying him as a pariah that was charging $2.99 from his loyal followers only to yank the ‘app’ rug from underneath them.

Most of the folks beating up on Marco would not hesitate to buy a $3 cup of Starbucks coffee. In fact, they would probably buy a more expensive cup (Grande anyone?). And if they walked out of Starbucks, got into their car and started driving to say work. Lets also say that the Latte they’re drinking had bad milk. How many of these people would turn the car around and bitch the barista out? How many would scream expletives if they did indeed go back. Or would they humbly say “sir – my latte seems to have some bad milk”?

I’m probably biased when it comes to Marco because I appreciate his humanity and his willingness to put himself out there – in the public eye. Heck – he was even willing to explain his Peace related actions and motivations on his podcast (starting around the 18th minute).

Of course Marco isn’t the only developer in the ad blocker spotlight. There’s also Dean Murphy’s Crystal ad blocker and his recent decision to allow certain advertisers through in terms of Crystal’s default settings.

This whole thing made me consider the whole issue of ad blocking. It’s far from a black and white issue. There’s lots and lots of gray in there.

The players seem to be:

  • Content creators: these are the so called ‘publishers’ on the web. The bigger the site, the more obtrusive ad infestation, the greater the complaint about content blockers and how it was ‘the end of publishing as we know it’. It’s as if an iOS 9 content blocker will suddenly transport everyone to the stone age.
  • Advertisers: These are the companies that are paying for ads. They’re also paying for tracking and the magical voodoo known as analytics. They want to get as much data …as much ‘big data’ about their users so they can do things like offer their users ‘useful services’ regardless of whether their customers want this or not.
  • Ad/Tracker Services (ATS): These are the Googles and all those companies that put the mechanisms in place (typically 2nd, 3rd, 4th party JavaScript code) to do tracking and ad serving. Ghostery has an excellent options pane for its browser plug-in that shows their categorization:
    Ghostery Options

  • Developers: these are the developers of content blockers. Whether it is a big company like Ghostery or a tiny developer like Marco or Dean Murphy.

  • Consumers: This is me and all of you. Anyone that uses the web for something is a consumer (whether they want to be or not).

The thing about ads is that they’re not only pushing something onto the consumer, they’re also tracking the consumer. Ghostery displays an amazing little window for each visited site showing the number of ads and trackers that a site has. Here’s one from The New York Times.

The New York Times - Breaking News, World News

The ATSes provide services across all the various sites that you and I visit. How much data has Google collected in terms of Gmail, Google Docs, and Google search usage? What about Facebook? Yahoo? Bing? What about all the other ATSes that we know nothing about?

It’s a complicated subject and there are no easy answers (check out “Back to Work Episode 239” towards the end of the show regarding the fact that this is not easy).

The only voice that I can speak for is myself – as a consumer. Personally, I want advertisers to ask me to opt-in to their data collection and ads. So until they do this, I will use ad blockers like Ghostery.

If I’m ok with The Economist’s pay wall – then why shouldn’t I be with a content wall that a publisher puts up? If a publisher objects to ad blockers, then they should absolutely put up a content wall. I wont be offended. I’ll have a clear choice of whitelisting the site with my blocker or moving on to another site.

Ultimately, ad and content blockers are a consumer’s way of making ad and tracking services opt-in services. Publishers, Advertisers, and Ad/Tracking Services have been unwilling to follow an opt-in approach so now the consumers have the ability to enforce such a process.


As of 9/30/15 – Any ads on this site come from wordpress.com. It’s WordPress’s way of getting paid for the free service that they give me. I don’t get any money out of it.

How to Create an Encrypted Zip file on the Mac

It all started with a text message from my wife about needing help with a password on a zip file:

wife: I tried to put password in zip file

wife: I followed this page http://smallbusiness.chron.com/create-encrypted-zip-files-mac-44338.html

me: command of: zip -e myzipfile.zip file1.txt file2.txt OR zip -r -e myzipfile ./directory the tricky part is the terminal

wife: I used the terminal but for some reasons, it only creates empty folder
…a bunch of text messages later…

me: Here you go – give them this link…

My wife is really smart and quite a decent user of her Mac. She needed to encrypt a zip file because whe was sending some paystubs to some bank loan people.

I know what you are starting to think “but encrypting a zip file is insecure”. And you’re probably right but the fact of the matter is bank employees are severely constrained by their employers and you’re LUCKY if they’re even allowed to open an encrypted zip file. It’s not that they’re incapable of such a feat, but rather that they’re in a financial institution with a whole lot of rules and regulations that make secure electronic delivery of anything quite debatable.

There should be an easy..practically trivial way to compress a directory and put a password on the Mac but the “encrypted with password” part is not easy at all. In this tutorial I’ll walk you through how to do this.

And now for the instructions

These instructions and pictures were done on Yosemite but should apply to future versions of Mac OS X.

Creating a non-encrypted zip file is easy

Lets use an example directory called my directory

Creating a non-encrypted zip file is easy

Right click on your folder

Choose the ‘Compress’ selection

Right click on your folder

And now you have a zip file

It’s easy peasy – you now have a *my directory.zip *file. But it isn’t encrypted with a password. Anyone can double click on it and it would show its contents without difficulty.

And now you have a zip file

Creating an encrypted zip file

To create an encrypted zip file you need to use the Mac’s command line. The command line is a vastly different way to interact with the file system. Most of the tutorials that I have seen do not exactly explain how to use the command line. I will make a stab at making this tutorial clearly explain how to use the command line to create the encrypted zip file of a directory.

Before we proceed – you need to agree that you will follow my instructions to the letter….I’m assuming you are nodding your head with a ‘yes’. If you deviate in any way and you get surprising results then go back and try again by following the exact steps.

The usual disclaimer applies – use at your own risk and I’m not responsible if you destroy your Mac 🙂

Create a mydirectory directory in the Documents folder of your mac

Make sure that the mydirectory doesn’t have any spaces in the name.

Note: Your mydirectory folder doesn’t have to be in Documents. It can be anywhere that you can get to with the Finder.

Create a mydirectory directory in the Documents folder of your mac

Place your files in the mydirectory directory

Place your files in the mydirectory directory

Search for terminal in spotlight

Spotlight is the mac’s search facility. If you don’t see it in Finder just press the following keys: COMMAND SPACEBAR

The command is the key with the clover leaf symbol and the spacebar is….the spacebar. When you see the search box type terminal and then double-click on the suggested program like the one shown in the image (below).

Search for terminal in spotlight

Use the Terminal to change directory to mydirectory

In the terminal we’re going to change directory (cd) into the mydirectory folder. Remember that the Terminal is a completely different way of interacting with your file system (the other way is visually through the Finder).

In the terminal you will be typing the cd command followed by a space (i.e. pressing the spacebar).

  1. In the terminal type: cd
  2. With your mouse drag the *mydirectory *folder from the finder window into the terminal

In the next step you will press the enter key on your keyboard and within the Terminal you will have changed the directory into mydirectory.

Use the Terminal to change directory to mydirectory

Press the enter key

You should now be in the mydirectory folder. Congratulations…we’re almost there.

Press the enter key

Now type cd ..

Type: cd ..

The key thing is typing the letter c and d then a space with the spacebar followed by two periods.

Now type cd ..

It’s time to zip up the directory with and encrypt it with a password of your choice

Type: zip -re myzipfile.zip ./mydirectory/

There’s a space (i.e. press the spacebar) between the words (see the red lines in picture).

Note that myzipfile.zip is the encrypted zip file that will hold your files. You can use another name for it but make sure that you don’t put spaces in the file name.

It's time to zip up the directory with and encrypt it with a password of your choice

Now press the enter key

You’ll be prompted for the encryption password so enter whatever password that you want to use and then press enter. Then type it in again when you see ‘Verify password:’

Now press the enter key

What you should see

After you re-enter the password in ‘Verify password:’ and then press the enter key you should see the directory being zipped and encrypted.

What you should see

Time to test the zip file

You’re pretty much done. It’s a good practice to verify that the directory is encrypted in the zip file. So we will use the Terminal that you already have open to open a Finder window to the directory where the zip file is located.

Type: open .

There’s a space between the open and the period.

Time to test the zip file

Open the new zip file in the Finder window

Use the new Finder window to find the zip file that you just created (myzipfile.zip in this case). Double-click on the file.

Open the new zip file in the Finder window

When you double click the zip file

If you have properly encrypted the zip file then you should get the picture shown below. If you don’t see this then you probably didn’t encrypt the zip file.

Note: the “hello.txt” message just refers to the first file in the directory. When you put in the correct password the zip file will be fully decrypted, so all files will be decrypted.

When you double click the zip file

After you put the correct password

After you put the correct password you should see your directory in the finder windows.

Note: In the image below there is a ‘mydirectory 2’ The reason there’s a ‘2’ next to the directory name because your original directory is in the same location.

After you put the correct password

Open the directory and verify that the you can open the files without issue

Open the directory and verify that the you can open the files without issue

You’re done – CONGRATULATIONS!!!

It’s time to put on your party hat and do the happy dance. You’re done!

Image credit: http://emojipedia.org/party-popper/

You're done - CONGRATULATIONS!!!

Let me know how I can make these instructions better.

If you think I can do a better job with this tutorial – let me know via twitter (@eli4d).

One last thing…

If you think that Apple should improve the encryption zip file – send Tim Cook an email at tcook@apple.com (I’m serious). Looking for an idea of what to send? Here’s a sample:

Email Subject:

Can you (pretty) please improve the Mac OS X Archive utility to allow zip encryption from the Finder

Email Body:

Dear Tim,

*Can you kindly ask your Mac OS X team to add an encryption capability to the Mac’s Archive utility so I can use the the Finder’s built in ‘Compress’ service rather than use tortuous command line tutorials like https://eli4d.com/2015/09/23/how-to-create-an-encrypted-zip-file-on-the-mac



The Voice Behind the Code

I recently listened to The Changelog episode about a static site generator called Middleman (as an aside – The Changelog is an amazing podcast about all kinds of open source software – kudos to Adam Stacoviak). Now I’m not a user of Ruby (haven’t had time to play with Ruby nor Rails) but after listening to this episode I really want to try out Middleman and in fact I put it on my list of projects to play with when I have time.

Why? Because I liked how Thomas Reynold presented himself on The Changelog, I like his philosophy in developing and managing Middleman. It’s a side project that he’s been maintaining for a long time and he’s committed to maintaing it for a long time still. Furthermore, his technical decisions and evolution of Middleman shows me that he’s someone who’s willing to evolve his software rather than let it fade away in a morass of old crufty code.

My immediate reaction of putting Middleman on my project playlist made me consider my own approach for selecting software. I used to look at software based on popularity as measured by techie blogs and the latest fad. Somewhere along the line I changed my approach and how I purchase software. Somewhere along the line, I started paying attention to the the voice behind the code.

These days – when I come across an interesting product – I start reading the blog of the developer (or company), and then I move onto any podcasts that the developer has participated in. It’s an oddly personal path to a product. I suppose that marketeers will call it ‘personalization’ or some such thing.

When did this start for me? When did I change from a blind purchaser of software to a more reflective one? (I think this is more applicable to Mac software purchases than iOS products where I’ve bought lots of crap before stopping my purchases for the most part)

I think it started with the Build and Analyze (B&A) podcast where I heard Marco Arment talk about software development. I found out about B&A from a Merlin Mann podcast called Back to Work.

I bought Marco’s Instapaper app because of B&A. Here was an opinionated developer that wasn’t afraid to tell why he did or didn’t do certain things when it came to Instapaper. I liked the guy’s honesty, hard headedness and general East Coast demeanor. Marco sold Instapaper in 2013 and I thought that Instapaper was doomed to take a long slow nosedive into oblivion. But I was wrong because Marco entrusted his software baby to a great steward for his product.

He moved on from B&A to the Accidental Tech Podcast. He also created The Magazine but I didn’t buy it because it was not my cup-of-tea as a product (Apple’s Newstand never seemed right to me so I never bought anything in it).

He recently created a fantastic podcast client which I’ve been enjoying since day one of its launch. Overcast embodies Marco’s sensibilities and his choices fit the checkboxes that I have for a podcast client.

It’s funny how all of this started because of a podcast and listening to some anonymous guy passionately talk about his software and why he made certain choices when designing that software.

I have yet to be disappointed by a product purchase that is based on the voice behind the code. I’m not sure if this is a great approach to purchasing software but it works for me.

Voices that I’ve liked:

Book Review: “Childhood’s End” by Arthur C. Clarke

Warning: Spoiler Alert: If you intend to read the book, please do not read this review.


  • Harlequin level: n/a
  • Plot/action/story: 5
  • Solid conclusion: 5
  • SciFi thrill: 5
  • Fantasy thrill: 5
  • Part of a series but doesn’t skimp: n/a

Overall thoughts about the book

While I’ll do my best to describe my impression of “Childhood’s End”, I have to admit that words fail me. It is a stunning novel beyond description. I read it on my Kindle and immediately ordered a 1953 hardcover version the moment that I finished it. I rarely do that…actually, I never do that.

While I understand that scifi purists might scoff at Clarke’s combination of scifi and the paranormal, I don’t think anyone can deny his storytelling mastery when it comes to both.

Clarke divides the book into 3 parts:

  1. Earth and the Overlords
  2. The Golden Age
  3. The Last Generation

In Earth and the Overlords we are introduced to the mysterious Overlords that show up just as man is about to take off to the stars. This theme of man being prevented from reaching the stars is repeated over and over again and the last part of the book resolves this fundamental issue. Mankind does not ever take off but man’s children leave on a completely different route into the universe.

Getting back to this first part, Clarke plays with and refuses to answer whether the Overlords are ‘good’ or ‘evil’. Are they really here to help mankind or do they have a different agenda? He also taunts the reader with the most basic of questions – what do the Overlords look like and why do they refuse to show themselves?

He constantly hints at a hidden agenda and he uses the relationship of overlord Karellen with the human Stormgren to both clarify and obscure the Overlord/mankind relationship. This part of the book is best summed up by the last paragraph of part one:

And Stormgren hoped that when Karellen was free to walk once more on Earth, he would one day come to these northern forests, and stand beside the grave of the first man ever to be his friend.

There’s this bittersweet tone that the above paragraph sets for the next section of the book – The Golden Age.

In The Golden Age we are immediately shown what the Overlords look like. Sure it’s 50 years later and the Overlords have had time to affect man in a way that brings utopia to all mankind. But it’s still shocking to find that the Karellen (and therefore all Overlords) looks like Satan.

At this point I was sure that the Overlords’s agenda was ‘evil’ and of course I was wrong once again. Clarke is like an amazingly strategic volleyball player that sets up a fake spike and has one of his compatriots slam the ball on his confused opponents.

Mankind’s utopia is in full swing when we’re introduced to Rupert Boyce. Through Rupert we meet George Greggson and his future wife – Jean. And through Rupert’s séance party Clarke shows us some slight hints to the Overlord’s actual agenda. It has to do with Jean revealing the exact location of the Overlord’s homeworld (actually the location of their sun). In the process of showing us this we are also introduced to Jan Rodricks, who in the last section of the book, turns out to be the last man on earth.

Jan figures out a brilliant way to be a stowaway on an Overlord ship reaching for the stars and visiting their world. This daring move in conjunction with time dilation assures his place as the last man on earth.

The Golden Age closes with a one-two punch. The first punch is Karellen’s clear dictate that mankind would never reach the stars:

“It is a bitter thought, but you must face it. The planets you may one day possess. But the stars are not for man.” “The stars are not for man.” Yes, it would annoy them to have the celestial portals slammed in their faces.

The second punch is the bittersweet passage that continues the build up of the ending in this constant circular drumbeat sort of way. As I mentioned before – words fail me.

It had been the Golden Age. But gold was also the color of sunset, of autumn: and only Karellen’s ears could catch the first wailings of the winter storms. And only Karellen knew with what inexorable swiftness the Golden Age was rushing to its close.

The Last Generation begins with the pettiness of George Greggson and the eventual move of both him and his family to New Athens – a sort of modern day commune. Here in New Athens Clarke builds up and hammers through the transformation of the Greggson’s children and the eventual transformation of all of the children of the world.

As a parent, some passages are utterly terrifying:

“I’ve only one more question,” he said. “What shall we do about our children?” “Enjoy them while you may,” answered Rashaverak gently. “They will not be yours for long.” It was advice that might have been given to any parent in any age: but now it contained a threat and a terror it had never held before.


It was the end of civilization, the end of all that men had striven for since the beginning of time. In the space of a few days, humanity had lost its future, for the heart of any race is destroyed, and its will to survive is utterly broken, when its children are taken from it.

Here Clarke reveals the full plan of the Overlords and the upcoming extinction of mankind. He also intersperses Jan’s journey to the Overlord home-world. It is a sort of high-tech rendition of biblical hell with less drama and lots of tech. Through Jan we get to see that the Overlords are really in their own sort of purgatory.

Jan is truly the last man on earth and through him we see the ascendence of man in the form of the children’s merger with the Overmind. Yet this merger is strange and inexplicable. We don’t know what really becomes of the children, we just know that they are no longer an obvious remnant of mankind.

They were emptier than the faces of the dead, for even a corpse has some record carved by time’s chisel upon its features, to speak when the lips themselves are dumb.

The Overlords are stuck in their own hell. They are servants to a master that they cannot understand. They are at an evolutionary dead-end and the only thing that they can do besides serving the Overmind is to do their best to understand that which they cannot understand. And yet Karellen assures us that they will not bow their heads without a fight.

Yet, Karellen knew, they would hold fast until the end: they would await without despair whatever destiny was theirs. They would serve the Overmind because they had no choice, but even in that service they would not lose their souls.

The above passage reminds me of Invictus and the way Clarke applies it applies to the Overlords – man’s version of Satan is quite astounding.

>Invictus by William Ernest Henley

Out of the night that covers me,
Black as the pit from pole to pole,
I thank whatever gods may be
For my unconquerable soul.

In the fell clutch of circumstance
I have not winced nor cried aloud.
Under the bludgeonings of chance
My head is bloody, but unbowed.

Beyond this place of wrath and tears
Looms but the Horror of the shade,
And yet the menace of the years
Finds, and shall find me, unafraid.

It matters not how strait the gate,
How charged with punishments the scroll,
I am the master of my fate:
I am the captain of my soul.

Man’s children have ascended and become something else (we don’t know if they’re in ‘heaven’, we just know they’re in ‘something else’). But the Overlords…they’re still fighting to be the captains of their soul.

Amazon Web Services Lesson – S3 Bucket Names are Universal so get your domain named S3 bucket before someone else does

I recently subscribed to Nicholas Zakas’s excellent http://www.nczonline.net newsletter and came across a shocking realization about Amazon’s S3 service: all S3 bucket names are universal. Let me explain what this means.

It all started with wanting a static image server for my blog

A few weeks ago I wanted to host all images for this site on images.eli4d.com. Why? Well I wanted to be able to easily move my blog without worrying about static assets. I also wanted to explore an AWS service such as S3.

I finally got it to work after beating my head against some security policy issues (this had more to do with me than Amazon but this is for another post). One of the key points that I learned when doing this is that the simplest approach to create an S3 based static site requires naming the S3 bucket with the name of the domain.

But then I read the following from Nicolas Zakas’s newsletter

From http://www.nczonline.net/blog/2015/08/wordpress-jekyll-my-new-blog-setup/

But then I read the following from Nicolas Zakas's newsletter

OMG – what?

image attribution: https://flic.kr/p/8Y1Mp9

OMG - what?

So what does this mean?

It means that if you have any intention of ever having a static S3 based website, then you should create the S3 buckets with the various permutation of your domain’s names before someone else does (so domain.com, www.domain.com, blog.domain.com, etc…). This is worth doing even if you don’t use those S3 buckets.

Keep in mind that you’re not locked out of using any other S3 buckets for your domains. But you have to deal with some unnecessary hoops.

So what does this mean?


Many thanks to Nicolas Zakas for documenting his experience with S3.

How to use Google Forms to track anything

Ever had a need to track something? Ever had to ask you spouse to help you track something? Google Forms can be very helpful.


In this post I go over some quick steps to create a google form to track cat vomit (yes – I’m serious). I discuss the steps of form creation, and how to easily access this form from your smart phone (I use the iPhone as the example) so that both you and your spouse can track a common issue or thing.


I know…you’re thinking ‘cat vomit – couldn’t you pick something better?’ My answer is that I try to pick real life examples, and this is as realistic as it is going to get. My cat, Max, has started vomiting recently…at least I think it was recent. I can’t tell if it’s a pattern or if it’s been happening for a long time and I’m over-worrying about him. I don’t quite know the line of cat weirdness and health problem…so it’s time to get some data.

Putting my engineering hat on – I know that the first thing I need to do in characterizing any system is to collect data. Lots and lots of data. Granted I wont have a Hadoop cluster crunching this data, but I at least want a spreadsheet that I can show to my vet. It’s better than going in with the “I don’t know” response to everything that s/he will ask (like ‘when did it start’, ‘how long’, how often’, etc…).


  • Speed of entry: I need to enter this data quickly. The quicker, the better.
  • Ease of entry: While I can deal with most user interfaces, my wife is not so forgiving. She’s a pragmmatic ‘show me how to bring up the app/form and get out of my way’. She also doesn’t tolerate lots of extraneous UI crap because she has better things to do (and she really does have better things to do).

In considering my budget (i.e. $0) and the problem at hand, I chose to use Google Forms to enter Max’s data.

A word and warning about Google Forms

I have used Google’s services for years. I’m sure that they have a large data dossier about me due to my Gmail and Google docs usage (which includes forms). Putting aside the question of whether Google is evil, the key fact is that Google is a business and all of us users who use its ‘free’ services are its product. So if your data is sensitive, then you should NOT use Google Forms. Just think of yourself as a contestant in the TV show Big Brother, and Google is monitoring everything from the moment you use sites that utilize Google ads or enter their properties (Gmail, docs, Google search, etc…). If you’re in any way uncomfortable with this, then you should find a different way of recording your data.

In this case, I’ve made the soul-searching decision that Max is ok with being tracked. Granted, Google might attempt to monetize on his vomiting when he surfs the web. But it’s a compromise that I’m willing to make, and he’s fine with it though he negotiated some additional treats for this concession.

Lets go to the Google Form site

OMG – a picture of smores! Google Forms are like smores? Maybe the graham crackers are the forms and the marshmallow is the data. So in this case the chewy center is vomit related data…fantastic.

Click the “Go to Google Forms”.

Lets go to the Google Form site

Now you’re in a blank form

Most of the entry form is self explanatory. The key tools to use are:

  • Question editing tools (1)
  • Choosing the question type (2)
  • Add an additional question to your form (3)

Now you're in a blank form

Renaming my form

Renaming my form

Creating a question with a date/time

I put this as the first question because the date/time when I (or my wife) remember something about Max’s behavior may be different than the current time/date of this data’s entry. Notice that I made this an optional question (as most are on this form) because I don’t want my wife to not to use the form.

Creating a question with a date/time

Creating a question about the event

This is a dropdown for the type of event that happened. This ends up being somewhat of an extraneous question (see further down this article in the ‘fine tuning’ section).

Creating a question about the event

The meat of the form

This is the fundamental and most important question of the form. There should be at least one required question. In this case, the event detail should be the only required question. I didn’t check the ‘Required question’ box here but I will later (see ‘Fine Tuning’ section).

The meat of the form

My catchall question

I obviously wont remember all the possible Max issues and behaviors, so I have a catchall (the is the ‘else’ part of my if-elseif structure for my dev friends).

My catchall question

Now it’s time to view the life form

Steel yourself – this will be an exciting form.

Now it's time to view the life form

The form is beautiful

This is the screenshot from a browser. However, the mobile version should be pretty usable since there are few fields. So it should be ok in terms of my ‘speed of entry’ and ‘easy of use’ criteria.

The form is beautiful

Track Max the Cat – Google Forms

Track Max the Cat - Google Forms

The Google Form response spreadsheet

Google automatically creates a Google Sheet (i.e. spreadsheet) for the data that gets entered into the form. This is one of the key benefits. I can also print it and download it as an Excel file (so I can email it to my vet…s/he LOVES email attachments >:-) ).

The Google Form response spreadsheet

Time to test my form

I want to test my form as a non-logged in user. In this case, I use Chrome’s incognito mode. In this way I’m guaranteed to view the form as a non-logged-in user. If I wanted more privacy, I would use Firefox rather than Chrome since it guards privacy better, but since I’m using Google’s services – it doesn’t really matter since my data kimono is already open.

Time to test my form

I test my form and get this as the result

I test my form and get this as the result

I re-check the form response Google Sheet

Notice that the form response Google Sheet will always have a Timestamp column (the first one), which is why additional date/time is optional and only useful if the actual event’s time/date is significantly different from the time/date when the form is used.

I re-check the form response Google Sheet

Using the time/date question

I have some retroactive vomit events that happened and I enter them

Using the time/date question

The update to response form

The update to response form

Now it’s time to put this form on my iPhone (and my wife’s iPhone)

For this form to really be used by me and my wife, I need to place it on our iPhones. What I’m actually going to do is I’m going to place it as a link via the “Add to Home Screen” feature of the iPhone. This features allows you to create a an icon on the iPhone and when you tap it – your iPhone’s browser will go straight to the specified link. In our case, I want to go straight to the form.

Now the form that I just created is a huge long url. To save it on the phone I can do 2 things:

  • Email it to myself and my wife.
  • Use a URL shortner (such as bit.ly) to create a memorable link so I can easily put it in the phone. I’m a big fan of http://bit.ly and the company behind it.

In this article, I chose to go with the second option. This way I can add it to as many devices as I want to.

So – the first thing to do is to go to bit.ly and log-in. By-the-way – remember the warning that I gave about Google Forms at the top of this article? It applies to bit.ly too (heck – it applies to any web service that you use).

Now it's time to put this form on my iPhone (and my wife's iPhone)

Paste in your form’s URL

I paste in my form’s url here. What’s that? Why am I not showing my form’s url? Because Max wants privacy when it comes to his vomity activities…sheesh.

Paste in your form's URL

Bit.ly creates a link for me

Initially, bit.ly creates an ugly link that I would never remember. So I use the ‘customize’ field to put in something memorable (like ‘superkittyvomit’).

Bit.ly creates a link for me

iPhone – place your newly created bit.ly link in the address bar

I put the memorable bit.ly link that I just created in the the iPhone’s browser (i.e. Mobile Safari).

iPhone - place your newly created bit.ly link in the address bar

iPhone – browser loads my form

Now the iPhone’s browser (i.e. Mobile Safari) loads my form. It’s time to sit back and soak in the form’s beauty 🙂 . I scroll around to make sure it works as expected.

iPhone - browser loads my form

iPhone – more testing of Google Form

iPhone - more testing of Google Form

iPhone – more testing of Google Form

iPhone - more testing of Google Form

iPhone – time to make it easy to access the form

Pressing the small upwards arrow on the bottom of the iPhone’s browser brings up a bunch of options. I choose “Add to Home Screen”. This will save a link to my form as an icon.

iPhone - time to make it easy to access the form

iPhone – Changing the icon’s name

I can change the iocn name but I leave it alone since it makes sense to me.

iPhone - Changing the icon's name

iPhone – Icon is now accessible as another ‘app’

While it isn’t an app, it is easily accessible as one. When I touch the ‘Track Max…’, the iPhone’s browser will open and go straight to my form.

iPhone - Icon is now accessible as another 'app'

iPhone – rinse and repeat with your spouse’s device

I perform the same iPhone steps on my wife’s iPhone. Because of that bit.ly link – I can do this really fast and get back to watching Marvel’s Agents of S.H.I.E.L.D.

Fine Tuning

After creating the form – I re-looked at it and realized that I wasn’t capturing the most important question (i.e. ‘Event Detail’). So I went back and cleaned up the form and placed the most critical question at the top. I also placed the optional date/time question at the bottom. This irks me a bit because I feel like it must be at the top. However, in considering my wife’s usage, I realized that the pragmatic choice is to put the date/time question at the bottom. I rather that the most important question be at the top and everything else come afterwards.

Note that I did not delete any columns (i.e. like the ‘Event’ column) in my Google Sheet. My reasoning is that I can always delete that column in Google Sheets or Excel and I rather make sure that the Google Form operates properly (besides the fact I have very little time to further mess with this thing).

Tada – the final form in all its glory

Well…the final form at this point in time. You may bask in its glory and enjoy.

What’s that? Why am I repeating myself with ‘skip this question’? Well – previous forms/experiences have shown me that my user (i.e. wife) tends to hesitate on whether to answer that question or not. In other words, she’s not sure if she really needs to answer this question (remember – she has better things to do). It creates a sort of cognitive dissonance which may not be worth it. Frankly, I’m tempted to remove this question all together and let my user put the date/time in the ‘Additional Information’ question if need be.

Tada - the final form in all its glory


I can now track my kitty’s behaviors. My wife will hopefully use my fantastic Google Form to help with this data collection. So that’s it – Google Forms at its best (or worst depending on your point of view). You can track anything – pets, kids, car problems, co-workers, etc… . Go forth and Google Form away.

If you like these instructions – put a comment on this article or let me know via twitter.

Updates to this post

  • 2015-09-01: I’ve changed the title and the URL link from “Cat Vomit and how to use Google Forms” to “How to use Google Forms to track anything”. The title just felt wrong and it’s bugged me over the past week. I’ve also modified the summary section to complement the title.

Fragmentation Based Customer Support

Note: This post is not about customer service representatives but rather the actual support processes put in place by companies. In the past I’ve worked in technical support and it is a difficult job where you get beaten up by both customers and management. Unlike retail where a customer will physically show up at the returns desk and see the human behind the desk in tech support customers have no problem ‘screaming’ – through the phone, email and Twitter.


Why is it so hard to have great customer support? I think that one big reason is fragmentation. Customer support representatives seem to have very little power to actually help, and it always seems to be another department that is the right one to help.

In this post I talk about my experience with OfficeMax and Adobe. There’s nothing unique about this experience. It happens across most companies. There are very few companies that have great customer support and there are even fewer that have representatives that can solve your problem on the spot. The only company that comes to mind where both great support and rapid resolution intersect is Hover.


About a month ago I ordered a 2 TB portable hard disk from OfficeMax for my workplace. I went through the work related shopping carts to order this drive. It was supposed to be shipped within a week of the order but nothing showed up. Two weeks later, I contacted my workplace finance person to check on the order (i.e. the PO) and she confirmed that everything was squared away on my employer’s side. She sent me an email with the PO number and it alsoincluded the UPS tracking number.

Going to UPS’s website I discovered that the package was not delivered due to an address issue. It was almost the right address, but almost is not good enough when UPS can’t deliver it. So I called the OfficeMax customer service number listed on their the website with PO in hand.

The representative that answered (lets call her Jane 1 aka J1) and politely asked me for the details of my order. Then after about 2 minutes of silence she said to me “I’m sorry sir but I don’t have access to the part of the system that would show me your order. I need to transfer you to the technology team and they’ll be able to answer your question”. Before I could anything in response, I was on hold with OfficeMax’s grating elevator music.

Forty five minutes later I was still on hold and no one from the ‘technology team’ graced me with a moment of their time. I hung up in disgust and went back to UPS’s website. I noticed an option to update the address if I had an account so I went ahead and created an account and updated the delivery address. Since I wasn’t sure if this would work I called OfficeMax again with the foolish hope that I would get someone that could do something about my order.

Jane 2 (J2) picked up the phone and I related my previous hold and call time. She apologized and told me that “the technology team has been merged with customer service, so I should have access to your PO”. She looked it up and finds it, then she tells me that it might not make sense to to alter the delivery through UPS since I already changed the address. I tell her that I want my address to be changed in their system in order to avoid this kind of mess-up can be avoided (after all I’ll be forced to order from OfficeMax again). She tells me that I have to go to my employer’s finance group to get that changed.

The drive arrives the next day due to my intervention through UPS’s website. But it leaves a bitter taste in my mouth about OfficeMax. Moving forward, I decide to find some other way to get equipment to avoid OfficeMax as much as possible.

Now was the representative ‘bad’ in any way? Not at all. Why couldn’t J1 find my order but J2 could? I can only figure that there’s tremendous compartmentalization in OfficeMax’s customer support.

Of course my experience with OfficeMax was a walk in the park when compared to Adobe. Adobe’s customer support fragmentation is breathtaking in its depth and breadth. About 2 years ago I had to move a license for Framemaker from a coworker that left the company. After about two weeks of phone calls and emails the license was finally moved. It was unbelievable exhausting ordeal.

Yesterday I had a flashback to my previous experience with Adobe. My current employer got me a Creative Cloud (CC) license and I got the CC email on Monday:

Hi Eli4d,

You have been assigned a Creative Cloud — Complete membership. This grants you access to the full collection of Creative Cloud desktop products — with team-level benefits.

Accept invitation

Some of your benefits include:

The latest release of Adobe Creative Cloud apps
Access additional tools and services.
Collaborate with colleagues, both inside and outside of your organization.
Use cloud-based storage and device syncing capabilities to access and share your work wherever you are, while the software remains installed on your computer.

Welcome to Adobe Creative Cloud.

I clicked on the ‘Accept invitation’ link and ended up on a Adobe’s login page. My work email address was pre-populated but I wasn’t logged in. I used the site’s forget-password mechanism to get in. After logging in – Adobe’s website informed that I ad no subscriptions and suggested that I really should joint Creative Cloud because it’s awesome. The moment I saw this I thought OMG – I have to deal with their customer support – sh*t.

The contact information page indicated that I could only contact them by email or chat. I kept looking for a phone number – but nothing. So I choose chat even though I had 10 minutes to talk to them (kid pickup deadline). I’m not sure why I did this even though I knew that nothing would happen.

The exact thing like OfficeMax happened here – I got a representative (T1) who got information from me and then transferred me to another representative (B1) who asked me for the same exact information as the first representative. Here’s my chat session with their representative(s).

Note: I should have been nicer to the human on the other side of the keyboard. I was tight on time but he/she certainly didn’t deserve my frustration.

T1: Hello! Welcome to Adobe Customer Service.

T1: I have received your query.

T1: Please allow me a moment while I look into your account & verify the details.

Eli4d: I think I have multiple accounts and your system got confused.

Eli4d: Your file was successfully uploaded: Join your team email_showing_cc_membership.pdf.

T1: okay

T1: May I know the name of the product?

Eli4d: Attaching email that I just got.

Eli4d: Please read the email (attached pdf)

T1: okay

T1: May I know the name of the product?

Eli4d: Creative Cloud…have you read the email?

T1: I have checked your email and it is for creative cloud.

T1: For this query, I am not a right person to handle this issue and I need to transfer this chat to creative cloud support team.

T1: May I?

Eli4d: Why does your system say I’m not attached to any plan?

Eli4d: I have 8 more minutes that I can spend on this before I need to leave.

T1: I understand that but , I am not a right person to handle this issue and I need to transfer this chat to creative cloud support team.

T1: May I?

Eli4d: Is there an 800 number to talk to a human?

Eli4d: fine – transfer me

T1: Thank you

T1: Please stay online while I connect you

Eli4d: I just need someone to fix this already – I’ve been waiting for a while for corporate approval on this and now – I can’t get access.

T1: I apologize for the inconvenience.
info: Please wait while we connect you to a representative.
info: You are now chatting with B1.

B1: Hello! Welcome to Adobe Customer Service.

B1: Hi Eli4d.

B1: I understand that you are unable to use the subscription. I will be glad to check and help you with this.

Eli4d: Any status on this?

B1: I check and see that there is no subscription under eli4d@employer_email. May I know if you have an alternate email address under which you have the subscription?

Eli4d: Did the other representative send you the pdf document that I uploaded?

Eli4d: CC was purchased under eli4d@employer_email

Eli4d: Any other accounts that I have are irrelevant.

B1: May I confirm if you are referring to Adobe Creative Suite 5 Design Standard Student and Teacher Edition?

Eli4d: Your file was successfully uploaded: Join your team email_showing_cc_membership.pdf.

Eli4d: No – it’s creative cloud. Resending the pdf I already sent the other rep.

B1: May I know if you are referring to team subscription?

Eli4d: My time is up with this chat session. Kindly forward this to whoever deals with PO for your system. The attachment I sent you clearly shows you what company this is associated with – employer_name.

Eli4d: It’s unfortunate that your chat system is just a constant non stop frustrating thing.

Eli4d: Kindly give me a phone number to speak to a person.

I still haven’t resolved the CC licensing issue. No one followed up with me after the above chat.

With Adobe I feel like I’m always asking for help from the wrong person. It’s like running in circles on a track. You keep putting mileage on your shoes but you’re not going anywhere. Of course with a running track you’re at least getting some exercise, whereas with Adobe it a constant exercise in futility and frustration.


It’s easy to prescribe un-scalable solution. If you’re not a financial institution, then why must your support people have fragmented information about the customer? Why did Adobe’s T1 representative not have my customer information? Why did he have to send me to the “Creative Cloud team” for a subscription issue? Why did B1 not get the information that T1 already had? Is it a training issue? Is it a systemic problem with customer information?

I don’t know what the solution is for this issue. As a customer I can’t do much about monoliths like Adobe or Officemax. Perhaps someone on their side can do something about fragmentation based customer support. Perhaps and then again perhaps not.

As a customer I’m dreading my next attempt in contacting Adobe. My Creative Cloud subscription is nowhere in sight and I have so little time to deal the tortuous process of getting this resolved. I’m trying to figure out if this is worth resolving or is it better to ask my employer to get a refund and then go purchase something like Pixelmator. Sure it’s not Photoshop but is Photoshop worth all the stress and aggravation of Adobe’s customer support?

Updates to this post

  • 2015-07-29: Before going back to the dreaded Adobe chat channel on Adobe’s site I reached out to Adobe customer support via Twitter referencing this post. I got immediate response from their representative.
  • 2015-07-30: Through the above Twitter conversation I got an actual human from Adobe to call me and resolve the issue (thank you Kashish). I’ve reviewed the ‘Conclusion’ section of this post and I don’t see a reason to change it. I realize that my case was resolved more than anything due to my dogged persistance. Customer support continues to be quite fragmented both for Adobe and many other companies.