Monthly Archives: September 2011

Stop thinking iPad killer

Amazon announced their new tablet product today, the Kindle Fire. In my last post, I outlined how I thought Amazon was going to “pull an Apple“. Today, I’m feeling even more confident in that assertion, but not in the way I thought I would. Initially I thought that the Kindle Fire would be a direct strike at the iPad. I don’t get that feeling from the product Amazon launched today.

Apple has more media savvy than many of their hardware competitors like Samsung and HTC. Neither of these competitors have meaningful media marketplaces in consumers’ hands. Apple has the iTMS, iBooks, and App Store, which cumulatively offer consumers access to a wide variety of content. Interestingly, some media bleeds over to and from places you wouldn’t expect it. For example, I get my magazine subscriptions through Zinio, which is downloaded through the App Store, and in turn, my content is downloaded in-app. I expected magazines to be available through iBooks, and speculation on the internet makes it seem that others do too. To further complicate matters, some magazines are available as an “app” in the App Store.

If I knew nothing about Apple’s distribution channels, that discovery would require a not-insignificant amount of exploration. Yet thus far, Apple has actually lead the pack in terms of application quality and discoverability. I attribute much of the iPad’s success to its simplicity and the draw of its many apps.

Step back and look at Amazon’s offering. Simplicity is taken to the next level. All content comes from Amazon and is logically categorized. Movies, TV shows, magazines, books; they’re all right where you’d expect them. There’s no interstitial abstraction of a store, with the exception of apps. Even there, the naming is about as straight forward as you can get. Content is front and center on the Kindle Fire.

So how exactly is this different than the “Apple” maneuver I thought they were going to pull. When you compare the Kindle Fire to the iPad… Well, you can’t. The Kindle Fire isn’t an iPad. It doesn’t try to be. With the iPad, you’re aware of the platform you’re using. There are elements that make you aware that you’re using an Apple iOS device. All iOS devices come with a suite of apps for general productivity. Compared to the Kindle Fire, the iPad is a generalist device. The Kindle Fire is laser focused on consumers that want a device to access content. Amazon has commoditized the platform. They don’t call this device an Android tablet, because they don’t want people thinking about the OS. They want them focused on the 18 million (HELLO!) pieces of content they have access to.

Some of you are screaming at your computer right now, because when the iPad initially launched, geeks everywhere cried out in desperation over the fact that it wasn’t able to run desktop applications like Photoshop and their favorite code editor. The Kindle Fire takes this focus one step further, and you can expect every geek who is just now adjusting to the iPad to scream about what’s lacking in the Kindle Fire. The iPad has taught us that sometimes it’s a worthwhile exercise to ignore the “experts” and see what the consumer has to say.

I don’t know if the Kindle Fire will match the iPad in sales numbers. I don’t even know that it will work well. The hardware could be a let down, resulting in a laggy, uncomfortable user experience. What I do know is that Amazon just pulled an Apple. Rather than go after an existing market, they just created their own.

Amazon is about to pull an Apple

So, MG Siegler says an “Amazon tablet is coming”:http://techcrunch.com/2011/09/02/amazon-kindle-tablet/, and that he’s used it. Meanwhile, HackerNews is caught up in a lengthy discussion as to whether tablets are consumption devices, and whether or not that’s good for society… or something. Elsewhere in the discussion, the tablet is being doomed to failure because Amazon chose to fork Android, risking app compatibility with the plethora of high-quality applications available on the wonderfully organized and widely praised Android Marketplace. Pardon my condescending sarcasm.

Way to miss the point, folks.

I feel like history is repeating itself. I have a feeling that Amazon is about to pull an Apple here, and one of the only communities of people I know who are supposed to be dedicated to looking _forward_ are stuck on a backward-facing philosophical discussion of consumption versus creation. That ship has sailed! Others are failing to see that creating “yet another Android tablet” isn’t the way to distinguish yourself in the market.

Amazon is a unique company. Have a look at the existing players in the tablet market:

*Apple*

* At their core, a computing device company
* Has content distribution relationships (iTunes content partners) for music, movies, and books
* Powerful infrastructure support (data centers, iCloud)
* Makes money on the hardware sale, as well as the sale of content

*Google*

* A search company
* Builds a tablet OS, but doesn’t actually sell a tablet
* Wants customers to spend a lot of time in Google web properties
* Wants to expand in to media (Google Music) and shopping search to sell more ads

*Samsung*

* A consumer electronics company
* Makes a wide variety of devices, including several tablets
* Doesn’t have their own tablet OS (relies on Android)

*Amazon*

* World’s largest online retailer
* Has 137 million active customers [1]
* Has quality content distribution relations for music, movies, books, clothing, electronics, lawn mowers… anything else you can think of
* Knows how to build a successful hardware platform (Kindle)
* Highest rated in customer satisfaction [2]

Amazon is unique in their online retail scope and experience with hardware products. Only Apple can come compare, and the focuses are flipped. Apple’s primary focus is hardware, with a strong media distribution backing. Amazon’s primary focus is online retailing, with a strong hardware product. Arguably, their converse efforts are disproportionate. That is to say, I don’t think the Kindle is as strong a corollary to Amazon’s retail business as Apple’s iTunes Store (apps, music, and movies) is to their hardware. Still I don’t think Amazon’s diverse strengths can be easily dismissed. They’re in a better position than both Google and Samsung to challenge the iPad as the dominant product in the tablet space.

If I were on Amazon’s tablet team, I’d try to make the device the center of the mass market consumer’s consumption lifestyle. People clearly love to shop Amazon, so make it easy for them. An Amazon tablet could fulfill the dreams of 1970s futurists who believed that housewives would purchase household products from a screen in their kitchens and living rooms. Amazon is in a unique position to provide a customer experience that spans everything from digital music to purchasing a new lawn chair on a single device through software that is smart and intuitive. This could be the device that actually makes people _want_ to do these things. If they deliver on that, they’ll be in the game.

h3. Footnotes

# “Google cached page: Inside Amazon”:http://webcache.googleusercontent.com/search?q=cache:CwHkwbSb-IIJ:www.amazon.com/Inside-Careers-Homepage/b%3Fie%3DUTF8%26node%3D239367011+amazon+active+customer+accounts&cd=1&hl=en&ct=clnk&gl=us&client=safari
# “Amazon replaces Netflix at the top of a customer satisfaction survey”:http://www.internetretailer.com/2011/05/10/amazon-replaces-netflix-top-customer-satisfaction-poll

Simple wrapper for Ruby scripts running in an RVM environment

Ruby is a fantastic programming language, but I’ve not been all that happy with the community’s viewpoint of the execution environment. Ruby is fast moving, so you often encounter scripts or applications that require specific versions of Ruby. This problem isn’t unique to Ruby, but the solutions the Ruby community offers are.

Typically, versioned interpreters are installed using a convention that works something like this. If Ruby 1.9 and Ruby 1.8 were installed concurrently, the interpreters would be installed using /usr/bin/ruby19 and /usr/bin/ruby18. Scripts that require Ruby would have their shebang altered appropriately. You’d also typically symlink /usr/bin/ruby to your preferred (default) Ruby install.

Ruby eschews this convention. Ruby interpreters that come with many Linux packages use this convention, but most Rubyists will advise you to avoid OS packages because of other issues. As a system administrator, the entire scenario borders on horrifying. I get why Rubyists feel the way they do, but to people on the “other side”, it’s terrifying. Hearing “just install from source” keeps sysadmins up at night.

Enter RVM. Ruby enVironment Manager is a tool for installing and managing Ruby interpreters and RubyGems (Ruby’scripts library package manager). At it’s core, RVM is a collection of bash scripts, written by author Wayne Seguin. It’s an excellent tool, and while it gets some public criticism over methodologies like overriding common shell commands like cd, I’m generally happy with it. I’m one of a growing group of sysadmins who cross over in to the programming side of things, so the power and flexibility of having multiple Ruby interpreters and multiple RubyGems gemsets is has a lot of value to me.

RVM works by altering the execution environment. I won’t go in to details about how to use RVM, but you should be able to glean enough from this simple statement to get some idea of what’s going on:

$ rvm use ruby-1.9.2-p290@sprinkle

This tells RVM to “use” (load) the environment for Ruby version 1.9.2, patch level 290, and use the “sprinkle” gemset. A gemset is just a collection of gems that you give a name. This appears to work like magic, but it’s really quite simple. RVM changes a set of environment variables that are relevant to the execution of Ruby and RubyGems. Basically, a bunch of load and execution paths. That’s all.

So where’s this all headed? The beauty of RVM is that it encapsulates Ruby execution environments. The primary drawback of RVM is that it encapsulates Ruby execution environments. How’s that? Take the ruby executable path for example:

/Users/myser/.rvm/rubies/ruby-1.9.2-p290/bin/ruby

Not exactly as friendly as /usr/local/bin/ruby. Fortunately, that’s a solved problem. We have /usr/bin/env to work around that problem. The catch is, env works by searching the current environment. As we know, RVM dynamically loads an environment that works for each Ruby. What happens if RVM is never executed, and why would that be the case?

One example is cron. When you run a cron task, a very minimal environment is loaded. This means that RVM isn’t loaded. The standard solution to this is to source the rvm script prior to execution, but this means including the source line in every cron task, which A) requires that you remember it, and B) adds a lot of visual clutter to the crontab. When you’re reviewing a list of cron tasks looking for something specific, all these source lines make a real mess.

Additionally, if you write shell scripts in Ruby, you may need some scripts to run in Ruby 1.8, while others work in Ruby 1.9. In an interactive session, Ruby shell scripts are executed in the currently loaded environment, so you may not get what you expect. I’d prefer a self contained script that loads an expected interpreter and environment explicitly.

Wayne provides some example code for loading the RVM environment on the scripting page, but stops short of a working script example. I’ve taken the very, very small leap to a working script wrapper. The benefit of this wrapper is that it is portable to any environment where RVM is available at a user or system-wide level. You will, however, have to ensure that the appropriate Ruby and gemset are available. The script looks like this:

#!/usr/bin/env bash

# Load RVM into a shell session *as a function*
if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
  # First try to load from a user install
  source "$HOME/.rvm/scripts/rvm"
elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
  # Then try to load from a root install
  source "/usr/local/rvm/scripts/rvm"
else
  printf "ERROR: An RVM installation was not found.\n"
fi

# Configure ruby and gemset
rvm ruby-1.9.2-p290@gemset_name >/dev/null

ruby <<-rb
  puts "Hello!"
rb

I’m a jack of all trades, so I’m sure that there are different ideas and methods that may be better than this. I’d love to hear about them! Trackbacks are open on this page, so please comment and let me know what you think.