Google Glass as an Apple strategy
If the recently hyped Google Goggles (AKA Project Glass) aren’t vaporware, they represent a classic move from the Apple playbook:
Invent the products that replace your best-sellers
I’m thinking of this in terms of Glass replacing Android handsets. Apple doesn’t wait for a competitor to offer something better than their products — they control the killing-off of their best-sellers with each next-generation release. While some companies delay innovation in attempt to extract every ounce of profit (and increasing margins) out of their products, Apple doesn’t leave their timelines, forecasting, and supply-chain in the hands on it’s competitors.
Don’t compete head-on (Android v. iOS)
Android is making great progress, but it’s an head-on fight; and advancements are always compared to the iPhone. Sure, there’s money to be made with Android handsets — but it’s a “me too” game.
Change the conversation (iPad vs. everything else)
Tablet computing is hot right now; but so far, trying to capture a piece of the iPad market (AKA the Tablet market), is a losing proposition. Apple owns this segment. Instead of playing catch-up, change the conversion. Invent a new platform, and own it’s market segment instead.
Of course, as nice as all of this sounds, daringfireball has the right interpretation: This vaporware R&D fluff looks more like Microsoft or Nokia than Apple. Apple wouldn’t say “we’re exploring ideas for a future product that will change the world.” Apple would just do it.
Python decorator to perma-cache method results
I was generating some reports recently that involved accessing expensive object methods whose results were known to not change on subsequent calls; However, instead of using local variables, I sketched-out this quick decorator to save method responses as variables on the object (using a leading ‘_’ followed by the method-name as the variable name):
def cache_method_results(fn):
def _view(self, *args, **kwargs):
var_name = '_{n}'.format(n=fn.__name__)
if var_name in self.__dict__: # Return the copy we have
return self.__dict__[var_name]
else: # Run the function and save its result
self.__dict__[var_name] = fn(self, *args, **kwargs)
return self.__dict__[var_name]
return _view
You might use it like this:
class Foo(object):
@cache_method_results
def some_expensive_operation(self):
...calculate something big and unchanging...
return results
f = Foo()
print(f.some_expensive_operation()) # This first call will run the calculation
...
print(f.some_expensive_operation()) # but this one will used the cached result instead
It’s not rocket science, but these little tricks add to the fun of using Python.
Leanpub
Writing Hadoop jobs as shell commands
Python library for auto-tagging text
Here’s an interesting text-classifying library that extracts/computes “tags” for a given piece of text:
“Mining of Massive Datasets”
My earlier work with Social Book Club, and current work with Kirkus Reviews, has me spending a fair amount of time exploring and developing recommendation systems. There are a variety of good books and papers on the subject, but I recently finished reading “Mining of Massive Datasets” (a free ebook that accompanies a Stanford CS course on Data Mining), and it was a surprisingly good read.
The book covers a number of topics that come up frequently in data mining: reworking algorithms into a map-reduce paradigm, finding similar items, mining streams of data, finding frequent items, clustering, and recommending items. Unlike many texts on the subject, you won’t find source-code in this book; but rather, extensive explanations of multiple techniques and algorithms to address each topic. This lends itself to a better understanding of the theory, so that you understand the trade-offs you might be making when implementing your own systems.
There are easier texts to get through, but if you’re getting started with recommendation or data-mining systems, and haven’t read this book, I’d encourage you to do so.
Cleaning an Idle Air Control Value (IACV) on a Subaru
My ’02 WRX started-up with a wandering (and lean) idle this morning. Thankfully, all it took was a $6 gasket and 20-minutes of pulling, cleaning, and re-installing the IACV. So far, it seems to have worked. See the following for detailed instructions:
Last day at Optaros…
Last day at Optaros. New world awaits on Monday. Exciting times!
Mint offering a free view into aggregate spending patterns
One of the most fascinating aspects of http://data.mint.com/ is that it’s public. CC companies have had similar data, but never shared it.
Mr. Job: A python framework for writing Hadoop jobs
Using progressive enhancement for mobile/web layout
You can’t (afford to) innovate like Apple
An insufficient focus on UX can kill your company
Insufficient focus on User Experience and design cost Wasabe their company: http://blog.precipice.org/why-wesabe-lost-to-mint
Corn industry trickery
Corn industry hopes to rename High Fructose Corn Syrup to “corn sugar”. New name, same product to avoid. “Goodbye High Fructose Corn Syrup, Hello Corn Sugar (Signed, Corn Industry)“.
Interface design patterns evolve
Interface design patterns evolve — it’s to be expected. However, doing so sometimes breaks the “don’t make me think” mantra. Case in point with the change to the window control’s orientation in the new iTunes 10:

The red, close button is in the expected location; However, the green, switch-to-mini-controller button is now below, rather than beside it.
The trio of gum-drop buttons has always been less than self-explanatory, but at least they were consistently located. iTunes 10 breaks the pattern, and not really for the benefit of other applications (since the vertical orientation doesn’t suit most UI designs quite as well).
It would have been interesting to be in the room when this new design was pitched. I’d guess that the rationale was to free-up additional vertical height (which is a common design direction seen in applications designed for widescreen monitors), but I would have loved to hear the answer to “Do we really need those 12 pixels so badly that we’ll violate our own user interface guidelines?” Sometimes the answer is “Yes”.
BTW, it seems you can switch back to the normal button orientation using the following:
defaults write com.apple.iTunes full-window -boolean YES
…and yes, I switched back to save the milliseconds it takes to orient to the new layout and select the right button.
Google closure-linter for JS style conformance
I had started writing a JavaScript style-guide conformance tool. Might not be needed now: http://code.google.com/p/closure-linter/
Note that I’m currently partial to running it like this:
gjslint.py --strict $filename | grep "^Line" | grep -v "Line too long"
New Firefox builds expose JavaScript parse tree
New Firefox builds offer JavaScript parse tree API: “An API for parsing JavaScript” Neat for tool devs. No word on whether you can modify/write to it.
Listening to customers
Back when I was in Product Management, I used surveys to gather feedback from beta testers. Given how valuable (and appreciated) the feedback could be, I now make a point to participate in surveys when asked. Unfortunately, even something as simple as a survey doesn’t always go as planned. Here’s what I was greeted with yesterday during an attempt to provide feedback:

Pretty awesome, huh?
I had better luck loading the page today; However, after spending a few minutes filling out a survey, guess which button didn’t work?

I generally expect only a very small percentage of customers to fill-out surveys, so the reliability of the survey service is of utmost importance — if you actually want to listen. In this case, I hope that web metrics can be used to track how many customers started the survey vs. how many completed the task. [NOTE: If you're designing surveys, tracking abandonment points during the survey process can also give you an idea whether your surveys are too long, or asking the wrong questions.]
I do appreciate it when companies try to…
I do appreciate it when companies try to address “security”, but this is so bad it’s comical. I hope “math” wasn’t your favorite subject in school:


