<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>deeje.com/musings</title>
    
    <link rel="alternate" type="text/html" href="http://blog.deeje.tv/musings/" />
    <id>tag:typepad.com,2003:weblog-4351</id>
    <updated>2009-06-05T14:51:05-07:00</updated>
    <subtitle>deeje cooley in random-access mode…</subtitle>
    <generator uri="http://www.typepad.com/">TypePad</generator>
    <geo:lat>37.770937</geo:lat><geo:long>-122.442763</geo:long><logo>http://homepage.mac.com/deeje/music/2d-eeje.jpg</logo><link rel="self" href="http://feeds.feedburner.com/deeje/musings" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
        <title>Notes on writing a history-driven client-server synchronization engine</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/AKCjuCkrPuU/notes-on-writing-a-history-driven-client-server-synchronization-engine.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/06/notes-on-writing-a-history-driven-client-server-synchronization-engine.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-67691383</id>
        <published>2009-06-05T14:51:05-07:00</published>
        <updated>2009-06-05T14:56:58-07:00</updated>
        <summary type="html">I've been working on a synchronization engine for an iPhone application called Clinks, and wanted to share some notes to help others down the road. This is a hefty topic… heck, even the title had to be somewhat unwieldy. With...</summary>
        <author>
            <name>deeje</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Code" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="iPhone" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Technology" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;I've been working on a synchronization engine for an iPhone application called Clinks, and wanted to share some notes to help others down the road.  This is a hefty topic… heck, even the title had to be somewhat unwieldy.  With that, lets roll up our sleeves and dive in…&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Goals&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;First off, you're probably reading this because you recognize that native iPhone clients need to go above and beyond a polished web experience.  In particular, native apps need to function regardless of the state of an internet connection.  This means making sure that sufficient data is cached locally, and that any local changes get propagated to the server/cloud when an internet connection is re-established.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Second, the synchronization engine you consider building will be highly dependent on the goals of your app and on the schema of your data. I've seen basic algorithms for sync engines that attempt to sync *everything* from the client up to the server, and *everything* on the server back down to the client, but in my experience, this isn't a solution to any real-world problem, just a starting point.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;By way of example, Clinks is a social wine journal that allows wine enthusiasts to keep track of the wines they try and like, and share that information with their friends.  The underlying schema contains, in high level terms, tables for person, product, and experience, where experience captures the tastes and ratings of a product by a person.  Users can add experience records to their journal, which may or may not create new product records (they may add an experience record for an existing product, for example).  For our sync scenario, we want to push all changes to the experience table, and only push new product records.  We also want to pull down friends' experience records as they change too.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;We've kept things simple: sync on a record level, and collisions in the history tables are handled using simple FIFO logic. Your needs may vary, and will directly affect the complexity of your sync algorithms.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;History&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;One way to implement record-level sync is by using a history table, which is basically a separate table in your schema that tracks all the changes made to records in the other tables.  In your code, whenever a user creates, updates, or deletes a record, your code also insert a new record into the history table that captures all that information: person, table, record, action, date.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Note that each client has a history table, and the cloud/server has a master history table. With that, the sync engine on the client basically reconciles the local history table with the history table on the server on a periodic or on-demand basis.  The reconciliation can be optimized by keeping track of the last history record sync'ed, and then on subsequent syncs only processing history records after the previous last history record.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;GUIDs&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;Before we proceed, we must address the issue of primary keys.  All databases support a primary key field for uniquely identifying a record, which is crucial for edit operations as well as relationships between tables. Unfortunately, almost all databases assume management of primary key (PK) fields by default, and don't have any concept of a "distributed" PK space.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;To illustrate, consider two users starting with fresh databases on their iPhones.  When each user creates a record, each database will assign a PK of 1 to the records.  Now when those users try to sync to the cloud/server, there would be two records with the same PK value (disregarding typical checks for uniqueness, etc.), making a mess of downstream searches, edits, and sync.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The simple solution is to add an additional "GUID" field to all tables that are to be synchronized, and to generate globally unique identifiers for each new record.  Many operating systems and languages have APIs to do just that, generating sufficiently long and random unique ID strings that are statistically unlikely to ever collide.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;In practice what this means is that your sync engine will deal with GUIDs, while your database engines will continue to deal with PKs.  One significant change you'll need to make to your server is to implement fetch based on GUID rather than by PK.  For Ruby on Rails, we simply overrode the GET resource to use the GUID field, then left all the other verbs, like PUT, POST, and DELETE using the PKs.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Algorithm&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;Here's some pseudo code tying all this together:&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;pre&gt;&#xD;
// push&#xD;
get lastClientHistoryDate&#xD;
get clientDeltaList from client History where (date &amp;gt; lastClientHistoryDate)&#xD;
for (clientHistoryItem in clientDeltaList)&#xD;
  if (clientHistoryItem.guid isn't on server)&#xD;
    switch (clientHistoryItem.action)&#xD;
      case create:&#xD;
        get clientItem from client where (guid = clientHistoryItem.guid)&#xD;
        new remoteItem&#xD;
        remoteItem.guid = clientItem.guid&#xD;
        remoteItem.data = clientItem.data&#xD;
        post remoteItem&#xD;
      case update:&#xD;
        get clientItem from client where (guid = clientHistoryItem.guid)&#xD;
        get remoteItem from server where (guid = clientHistoryItem.guid)&#xD;
        remoteItem.data = clientItemData&#xD;
        put remoteItem&#xD;
      case delete:&#xD;
        get remoteItem from server where (guid = clientHistoryItem.guid)&#xD;
        delete remoteItem&#xD;
    add clientHistoryItem to server History table&#xD;
  set lastClientHistoryDate = clientHistoryItem.date&#xD;
&#xD;
//pull&#xD;
get lastServerHistoryDate&#xD;
get serverDeltaList from server History where (date &amp;gt; lastServerHistoryDate)&#xD;
for (serverHistoryItem in serverDeltaList)&#xD;
  if (serverHistoryItem.guid isn't on client)&#xD;
    switch (serverHistoryItem.action)&#xD;
      case create:&#xD;
        get remoteItem from server where (guid = serverHistoryItem.guid)&#xD;
        new clientItem&#xD;
        clientItem.guid = remoteItem.guid;&#xD;
        clientItem.data = remoteItem.data&#xD;
        save clientItem&#xD;
      case update:&#xD;
        get remoteItem from server where (guid = serverHistoryItem.guid)&#xD;
        get clientItem from client where (guid = serverHistoryItem.guid)&#xD;
        clientItem.data = remoteItem.data&#xD;
        save clientItem&#xD;
      case delete:&#xD;
        get clientItem from client where (guid = serverHistoryItem.guid)&#xD;
        delete clientItem&#xD;
    add serverHistoryItem to client History table&#xD;
  set lastServerHistoryDate = serverHistoryItem.date&#xD;
&lt;/pre&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Note that you must fetch the record from the opposite DB using GUIDs in order to get the PK for that record for subsequent DB operations.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Note also that the algorithm appears to push changes up, then process those same changes coming back down.  While this is true, the algorithm is actually designed to support *multiple* clients for a user, all syncing to the cloud/server, so there could be unprocessed history items on the server that client hasn't yet fetched.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;And finally, note that this algorithm doesn't speak to relational schemas. You'll need to map the relationships between record GUIDs to the record PKs on each database accordingly.&lt;/p&gt;&#xD;
&#xD;
&lt;h3&gt;Dates&lt;/h3&gt;&#xD;
&#xD;
&lt;p&gt;One final thought on date fields.  We use dates as a way to optimize the sync engine, allowing us to only process history records that are newer than the last sync date.  Its important, therefore, to declare your date fields the same on both client and server, or to otherwise normalize the date values when comparing them.&lt;/p&gt;&#xD;
&#xD;
 &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AKCjuCkrPuU:mBPyagvwp7k:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=AKCjuCkrPuU:mBPyagvwp7k:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AKCjuCkrPuU:mBPyagvwp7k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AKCjuCkrPuU:mBPyagvwp7k:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AKCjuCkrPuU:mBPyagvwp7k:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=AKCjuCkrPuU:mBPyagvwp7k:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AKCjuCkrPuU:mBPyagvwp7k:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AKCjuCkrPuU:mBPyagvwp7k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=AKCjuCkrPuU:mBPyagvwp7k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/AKCjuCkrPuU" height="1" width="1"/&gt;</content>


    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/06/notes-on-writing-a-history-driven-client-server-synchronization-engine.html</feedburner:origLink></entry>
    <entry><title type="text">Links for 2009-06-01 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/_49HfZm4DNk/deeje" /><updated>2009-06-02T00:00:00-07:00</updated><id>http://del.icio.us/deeje#2009-06-01</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://steveweller.com/articles/toolbar-icons/"&gt;creating toolbar Icons with OmniGraffle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/_49HfZm4DNk" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/deeje#2009-06-01</feedburner:origLink></entry><entry><title type="text">Links for 2009-05-28 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/rQ3LHtKuch4/deeje" /><updated>2009-05-29T00:00:00-07:00</updated><id>http://del.icio.us/deeje#2009-05-28</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://iphone-developers-nc.googlegroups.com/web/UIApplication_TVOut.m?gda=iAgCgUcAAABEVnVB-gFoPt8OF-QIAoNTytFBOCilSRfyW7ARuSQZQiMLt7ifAefTzzPefc7yZRHjA9wbE34TyAfq_LiaE4mFeV4duv6pDMGhhhZdjQlNAw"&gt;TVOut&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/rQ3LHtKuch4" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/deeje#2009-05-28</feedburner:origLink></entry><entry><title type="text">Links for 2009-05-26 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/xJT4RiMXeJk/deeje" /><updated>2009-05-27T00:00:00-07:00</updated><id>http://del.icio.us/deeje#2009-05-26</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://groups.google.com/group/cocos2d-iphone-discuss/browse_thread/thread/58c232a7770cb46d?hl=en"&gt;Is it possible to draw on a sprite? -  cocos2d-iphone-discuss |  Google Groups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feedproxy.google.com/~r/oreilly/radar/atom/~3/2OM_wWfW0Ow/time-lapse-of-galactic-center.html"&gt;Time Lapse of Galactic Center of Milky Way rising over Texas Star Party&lt;/a&gt;&lt;br/&gt;
According to William Castleman: &amp;quot;The time-lapse sequence was taken with the simplest equipment that I brought to the star party. I put the Canon EOS-5D (AA screen modified to record hydrogen alpha at 656 nm) with an EF 15mm f/2.8 lens on a weighted tripod. Exposures were 20 seconds at f/2.8 ISO 1600 followed by 40 second interval. Exposures were controlled by an interval timer shutter release (Canon TC80N3). Power was provided by a Hutech EOS203 12v power adapter run off a 12v deep cycle battery. Large jpg files shot in custom white balance were batch processed in Photoshop (levels, curves, contrast, Noise Ninja noise reduction, resize) and assembled in Quicktime Pro. Editing/assembly was with Sony Vegas Movie Studio 9.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/xJT4RiMXeJk" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/deeje#2009-05-26</feedburner:origLink></entry><entry><title type="text">Links for 2009-05-19 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/Px_M4YoHxSs/deeje" /><updated>2009-05-20T00:00:00-07:00</updated><id>http://del.icio.us/deeje#2009-05-19</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thinkstick.net/2008/05/algorithm-to-generate-tag-clouds/"&gt;Think Stick!  &amp;raquo; Algorithm to generate tag clouds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.jeremymartin.name/2008/03/efficient-tag-cloud-algorithm.html"&gt;jMar's Blog: Efficient Tag Cloud Algorithm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/Px_M4YoHxSs" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/deeje#2009-05-19</feedburner:origLink></entry><entry><title type="text">Links for 2009-05-14 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/kyb1HSYIjpM/deeje" /><updated>2009-05-15T00:00:00-07:00</updated><id>http://del.icio.us/deeje#2009-05-14</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://148apps.biz/app-sales-coorelation-between-demo-and-paid-versions/%23comments"&gt;App Sales Data Between Demo and Paid Versions Compared&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.drobnik.com/touch/2009/05/build-for-os-2x-and-30-at-the-same-time/%23comments"&gt;Build for OS 2.x and 3.0 at the Same Time&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/kyb1HSYIjpM" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/deeje#2009-05-14</feedburner:origLink></entry><entry><title type="text">Links for 2009-05-12 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/JOhsjZj_1Zg/deeje" /><updated>2009-05-13T00:00:00-07:00</updated><id>http://del.icio.us/deeje#2009-05-12</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-table-of.html"&gt;OpenGL ES from the Ground Up:  Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stylecrave.com/2009-05-08/10-bottles-of-wine-you-cant-afford-to-uncork/"&gt;10 Bottles Of Wine You Can&amp;rsquo;t Afford To Uncork&lt;/a&gt;&lt;br/&gt;
Oh, how I&amp;#039;d love to taste a 200-year-old port!&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/JOhsjZj_1Zg" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/deeje#2009-05-12</feedburner:origLink></entry><entry>
        <title>The myth of the myth of self-commenting code</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/d7W9w2KRdWE/the-myth-of-the-myth-of-self-commenting-code.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/05/the-myth-of-the-myth-of-self-commenting-code.html" />
        <id>tag:typepad.com,2003:post-66247041</id>
        <published>2009-05-01T08:59:34-07:00</published>
        <updated>2009-05-01T08:59:34-07:00</updated>
        <summary type="html">Synchronicity! I was thinking of writing on this topic, and up pops this gem… The Accidental Businessman wrote: The myth of the myth of self-commenting code On Code Commenting And Technical Debt | BrandonSavage.net Interesting post by Brandon—I disagree only...</summary>
        <author>
            <name>deeje</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Code" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;Synchronicity!  I was thinking of writing on this topic, and up pops this gem&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://mtabini.blogspot.com/"&gt;&lt;cite&gt;The Accidental Businessman&lt;/cite&gt;&lt;/a&gt; wrote:&lt;/p&gt;
&lt;blockquote cite="http://mtabini.blogspot.com/2009/04/myth-of-myth-of-self-commenting-code.html"&gt;
&lt;p&gt;&lt;a href="http://mtabini.blogspot.com/2009/04/myth-of-myth-of-self-commenting-code.html"&gt;The myth of the myth of self-commenting code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.brandonsavage.net/on-code-commenting-and-technical-debt/"&gt;On Code Commenting And Technical Debt | BrandonSavage.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Interesting post by Brandon&amp;mdash;I disagree only on one main point:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;This myth of self-documenting code needs to be squashed once and for all. Commenting is important, and unless your code does nothing other than display &amp;ldquo;Hello World!&amp;rdquo; it&amp;rsquo;s going to need some explanation.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;I find this view of coding a little misguided, to be honest&amp;mdash;in fact, I would go as far as saying that code &lt;span style="font-style: italic;"&gt;doesn't need any comments&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Wait, did I just say that? Yes, I did, and here's why: code is a discussion between the developer and a machine. Writing code that cannot be comprehended by another human being is a bit like writing a letter to your dear friend in a language you can write but not read&amp;mdash;strange, at best.&lt;br /&gt;&lt;br /&gt;Good code should be self-documenting insofar as you should be able to understand what the code does without the assistance of any comments&amp;mdash;after all, the computer gets it, so why shouldn't you? This can easily be done by the judicious use of clear logic and good programming practices like giving your variables names that are actually related to what they do.&lt;br /&gt;&lt;br /&gt;What I suspect Brandon really means is that the comments are there to illustrate the intentions of the author &lt;span style="font-style: italic;"&gt;when those intentions are not immediately made obvious by the code itself&lt;/span&gt;. This, I daresay, is the crux of Eli's argument that commenting &lt;span style="font-style: italic;"&gt;inside&lt;/span&gt; the code is the most important contribution that a developer can make towards eliminating technical debt. That's because commenting inside the code helps understand the reasoning behind the choices that were made when writing the code, rather than what the code itself accomplishes&amp;#8230;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/38916764-8986413929396675482?l=mtabini.blogspot.com'/&gt;&lt;/div&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Having re-invested myself to production level coding, and having dug into lots of existing code bases over the years, I've come to a similar conclusion&amp;#8230; comments in code are only necessary to explain choices that are otherwise not obvious.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=d7W9w2KRdWE:9HGd-IzL_vY:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=d7W9w2KRdWE:9HGd-IzL_vY:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=d7W9w2KRdWE:9HGd-IzL_vY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=d7W9w2KRdWE:9HGd-IzL_vY:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=d7W9w2KRdWE:9HGd-IzL_vY:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=d7W9w2KRdWE:9HGd-IzL_vY:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=d7W9w2KRdWE:9HGd-IzL_vY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=d7W9w2KRdWE:9HGd-IzL_vY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=d7W9w2KRdWE:9HGd-IzL_vY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/d7W9w2KRdWE" height="1" width="1"/&gt;</content>


    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/05/the-myth-of-the-myth-of-self-commenting-code.html</feedburner:origLink></entry>
    <entry><title type="text">Links for 2009-04-29 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/sl6Ehc8PKGs/deeje" /><updated>2009-04-30T00:00:00-07:00</updated><id>http://del.icio.us/deeje#2009-04-29</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.raddonline.com/blogs/geek-journal/iphone-sdk-using-facebook-connect-for-iphone-part-1-of-2/"&gt;RaddOnline: iPhone SDK: Using Facebook Connect for iPhone Part 1 of 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ra-design.com/blogs/geek-journal/iphone-sdk-using-facebook-connect-for-iphone-working-with-extended-permissions-part-2-of-2/"&gt;RaddOnline: iPhone SDK: Using Facebook Connect for iPhone, Working with Extended Permissions Part 2 of 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mobileorchard.com/a-flurry-of-market-data/#comments"&gt;A Flurry Of Market Data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/sl6Ehc8PKGs" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/deeje#2009-04-29</feedburner:origLink></entry><entry>
        <title>kinetic wave sculptures</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/m1-Zv6WceHs/kinetic-wave-sculptures.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/04/kinetic-wave-sculptures.html" />
        <id>tag:typepad.com,2003:post-66008117</id>
        <published>2009-04-25T10:43:15-07:00</published>
        <updated>2009-04-25T10:43:15-07:00</updated>
        <summary type="html">I had the pleasure of seeing one of these sculptures at the Exploratorum some years ago… steve cooley presents wrote: kinetic wave sculptures This was too cool not to repost:</summary>
        <author>
            <name>deeje</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Gallery" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Science" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
&lt;p&gt;I had the pleasure of seeing one of these sculptures at the Exploratorum some years ago… &lt;a href="http://somejunkwelike.com/wordpress"&gt;&lt;cite&gt;steve cooley presents&lt;/cite&gt;&lt;/a&gt; wrote:&lt;/p&gt;&#xD;
&lt;blockquote cite="http://feedproxy.google.com/~r/somejunkwelike/~3/hZgmNvY5irw/"&gt;&#xD;
&lt;p&gt;&lt;a href="http://feedproxy.google.com/~r/somejunkwelike/~3/hZgmNvY5irw/"&gt;kinetic wave sculptures&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p&gt;This was too cool not to repost:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/dehXioMIKg0&amp;amp;rel=0&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/dehXioMIKg0&amp;amp;rel=0&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://feedads.googleadservices.com/~a/9REsDd0qKUfHs-SFoD1SRE9brug/a"&gt;&lt;img src="http://feedads.googleadservices.com/~a/9REsDd0qKUfHs-SFoD1SRE9brug/i" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;&#xD;
&lt;a href="http://feeds2.feedburner.com/~ff/somejunkwelike?a=hZgmNvY5irw:ZsM2ow0F7_A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds2.feedburner.com/~ff/somejunkwelike?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds2.feedburner.com/~ff/somejunkwelike?a=hZgmNvY5irw:ZsM2ow0F7_A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds2.feedburner.com/~ff/somejunkwelike?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds2.feedburner.com/~ff/somejunkwelike?a=hZgmNvY5irw:ZsM2ow0F7_A:2mJPEYqXBVI"&gt;&lt;img src="http://feeds2.feedburner.com/~ff/somejunkwelike?d=2mJPEYqXBVI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds2.feedburner.com/~ff/somejunkwelike?a=hZgmNvY5irw:ZsM2ow0F7_A:3QFJfmc7Om4"&gt;&lt;img src="http://feeds2.feedburner.com/~ff/somejunkwelike?i=hZgmNvY5irw:ZsM2ow0F7_A:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
&lt;/div&gt;&lt;img src="http://feeds2.feedburner.com/~r/somejunkwelike/~4/hZgmNvY5irw" height="1" width="1"&gt;&lt;/img&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=m1-Zv6WceHs:6GMofnTJj7o:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=m1-Zv6WceHs:6GMofnTJj7o:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=m1-Zv6WceHs:6GMofnTJj7o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=m1-Zv6WceHs:6GMofnTJj7o:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=m1-Zv6WceHs:6GMofnTJj7o:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=m1-Zv6WceHs:6GMofnTJj7o:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=m1-Zv6WceHs:6GMofnTJj7o:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=m1-Zv6WceHs:6GMofnTJj7o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=m1-Zv6WceHs:6GMofnTJj7o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/m1-Zv6WceHs" height="1" width="1"/&gt;</content>


    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/04/kinetic-wave-sculptures.html</feedburner:origLink></entry>
    <entry>
        <title>Rating Systems</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/4WLUzb5u_EQ/rating-systems.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/03/rating-systems.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-64601013</id>
        <published>2009-03-24T22:35:11-07:00</published>
        <updated>2009-03-24T22:35:11-07:00</updated>
        <summary type="html">How do you use the various rating systems you encounter in your life? Do you use the full resolution of each rating system, or have you unconsciously developed a mapping of your own classifications to the rating systems being provided?...</summary>
        <author>
            <name>deeje</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Film" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Marketing" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Music" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Technology" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Television" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Wine" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;How do you use the various rating systems you encounter in your life?  Do you use the full resolution of each rating system, or have you unconsciously developed a mapping of your own classifications to the rating systems being provided?&lt;/p&gt;

&lt;p&gt;Numerous products incorporate rating systems. Ideally, these systems allow users to develop profiles that then help recall past products and experiences, as well as discover and select new products and experiences in the future.  The most common rating systems I've seen include:
&lt;ul&gt;
&lt;li&gt;5 stars&lt;/li&gt;
&lt;li&gt;3 Stars&lt;/li&gt;
&lt;li&gt;Thumbs Up/Down&lt;/li&gt;
&lt;li&gt;100 Point&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;h3&gt;Ratings for collections&lt;/h3&gt;

&lt;p&gt;In Apple's iLife suite, both iTunes and iPhoto incorporate the 5 star rating system, and underneath the hood, these ratings are stored on a 100-point scale.&lt;/p&gt;

&lt;div style="text-align:center;"&gt;&lt;img src="http://blog.deeje.tv/.a/6a00d8341db43f53ef01156f4d043e970b-pi" alt="ratings-itunes.png" border="0" width="517" height="260" /&gt;&lt;/div&gt;

&lt;p&gt;I find it interesting how similarly and differently I use these rating systems in each of these products. In iTunes, I reserve the 5 star rating for songs I consider true classics, songs I believe will hold up over time and come to represent the best music I've ever heard. With a modest collection of 3806 items in my Music tab, only 34 items are rated 5 stars, less then 1%.  373 items are rated 4 stars, just shy of 10%, and 1547 items are rated 3 stars, which represents less than half my library.  I have smart playlists defined for each of these ratings, and generally tend to play music with 3 or more stars, and I rarely mark music with less than three stars.  In fact, of the 6 potential ratings available, I only really need 4: none, good, great, awesome.&lt;/p&gt;

&lt;div style="text-align:center;"&gt;&lt;img src="http://blog.deeje.tv/.a/6a00d8341db43f53ef01156f4d0541970b-pi" alt="ratings-iphoto.png" border="0" width="163" height="108" /&gt;&lt;/div&gt;

&lt;p&gt;In iPhoto, I use a similar 5, 4, and 3 star system.  5 star photos represent the absolute best moments of my family's life.  Photo's with 4 stars and great, and photos with 3 stars are worth sharing with my family.  I make little distinction between 1 and 2 stars, and only both marking photos with those low ratings as a way to indicate a photo worth preserving.  As with iTunes, I have smart lists in iPhoto that find all these photos at various ratings.  As with iTunes, I'm not really using all 6 rating positions (0-5), but only need: none, save, good, great, awesome.&lt;/p&gt;

&lt;h3&gt;Ratings for entertainment&lt;/h3&gt;

&lt;p&gt;Because these are collections I curate, it makes sense that these ratings to be only positive.  But there are lots of places where I want to capture a negative rating because I am not collecting things but rather experiencing them.&lt;/p&gt;

&lt;div style="text-align:center;"&gt;&lt;img src="http://blog.deeje.tv/.a/6a00d8341db43f53ef01156e54bb2b970c-pi" alt="ratings-netflix.png" border="0" width="376" height="329" /&gt;&lt;/div&gt;

&lt;p&gt;Netflix offers a 6-position rating scale, with dislike, none, and 1-5 stars.  I rarely mark something as dislike, though I do remember rating a bunch of things early on to give the recommendation system something to chew on.  And I rarely mark something less than 2 stars, where 2 stars is meh, 3 stars is good, 4 stars is great, and 5 stars is something I would consider buying.&lt;/p&gt;

&lt;div style="text-align:center;"&gt;
&lt;br/&gt;
 &lt;OBJECT classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B' width="426" height="26" codebase='http://www.apple.com/qtactivex/qtplugin.cab'&gt;
        &lt;param name='src' value="http://blog.deeje.tv/ratings-hulu.mp4"&gt;
        &lt;param name='autoplay' value="true"&gt;
        &lt;param name='controller' value="false"&gt;
        &lt;param name='loop' value="true"&gt;
        &lt;EMBED src="http://blog.deeje.tv/ratings-hulu.mp4" width="426" height="26" autoplay="true" controller="false" loop="true" pluginspage='http://www.apple.com/quicktime/download/'&gt;
        &lt;/EMBED&gt;
        &lt;/OBJECT&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;/div&gt;

&lt;p&gt;Hulu's approach to ratings mixes a negative-to-positive spectrum on top of a positive rating scale, where 1 star is "Hated it" and 5 stars is "Loved it".  I personally don't consider this system to be a good design… it feels very first-grade-ish, where even the worst performance merits a "star" for effort.  Unfortunately, there is no antithesis of the star symbol, and so it isn't easy to craft a rating scale with stars at the positive pole and something metaphorically connected at the negative pole.&lt;/p&gt;

&lt;p&gt;So far, all of the rating systems I've described have suffered a bit from too much resolution, in that there are more choices available than I need to express an opinion or make a classification.  I have to mentally transcode my own value onto the rating system available to me.  For shared systems, this creates aggregate rating systems are are noisy and course, because even with a vocabulary of only 5 words, people may still not be saying the same things to each other.&lt;/p&gt;

&lt;div style="text-align:center;"&gt;&lt;img src="http://blog.deeje.tv/.a/6a00d8341db43f53ef01156f4d6072970b-pi" alt="ratings-sfgate-the_little_man.gif" border="0" width="500" height="100" /&gt;&lt;/div&gt;

&lt;p&gt;To contrast this, consider one of the better (IMHO) approaches to rating experiences, the San Francisco Chronicle's movie reviews "&lt;a href="http://www.sfgate.com/cgi-bin/article.cgi?file=/chronicle/archive/2003/11/16/PKG112UOG41.DTL"&gt;little man&lt;/a&gt;". Except perhaps for the empty seat, each of the icons is very clear and understandable when seen alone, and makes complete sense when seen in sequence.  Moreover, there is no ambiguity, and I believe most people can express their own responses to a movie using this scale with little-to-no adjustment on their part. The resolution of the rating system seems just right.&lt;/p&gt;

&lt;h3&gt;Ratings for wine&lt;/h3&gt;

&lt;p&gt;Now we turn to the rating systems for wine… Ug! What a mess! In the mid-20th century, wines were often rated on a 20-point scale, often credited to &lt;a href="http://www.finias.com/wine/ucd_scoring.htm"&gt;UC Davis&lt;/a&gt;.  Then in the late 1970s' Robert Parker started publishing wine reviews &lt;a href="http://www.erobertparker.com/info/legend.asp"&gt;using a 100-point scale&lt;/a&gt;. Talk about too much resolution!  What's the difference between an 82 and an 83? Nothing really, but because Parker has become so powerful in the wine industry, the difference between an 89 and a 90 can make or break a wine maker.  For good or bad, the rest of the industry has pretty much jumped on board.&lt;/p&gt;

&lt;div style="text-align:center;"&gt;&lt;img src="http://blog.deeje.tv/.a/6a00d8341db43f53ef01156e5564fc970c-pi" alt="ratings-wine.jpg" border="0" width="190" height="300" /&gt;&lt;/div&gt;

&lt;p&gt;There's no denying that the U.S. population can apply their grade-school experiences to understand the value of 90 points as representing a good wine.  It's unfortunate that, unlike movies or food or music or just about any other experience, people rely far too much on wine critics' ratings and not nearly enough on their own experiences to judge and compare wines.  And the sheer inanity of the 100-point resolution compounds this fact for the average wine drinker.&lt;/p&gt;

&lt;p&gt;For &lt;a href="http://clinks.tv"&gt;Clinks&lt;/a&gt;, we concluded several things: first, that the 100-point scale isn't going to be replaced any time soon (certainly not by a few eager wine drinkers who decided to write a cool iPhone app); second, that the cure for the Parker monopoly is the emerging democratization of wine reviews and ratings, aka Wine 2.0; and third, that people need a way to express their experience of a wine that was easy, unambiguous, and direct.  So, we came up with a rating picker that focuses on the near-universal metaphor of thumbs up and down, which maps back onto the 100-point scale.&lt;/p&gt;

&lt;div style="text-align:center;"&gt;
&lt;br/&gt;
 &lt;OBJECT classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B' width="320" height="216" codebase='http://www.apple.com/qtactivex/qtplugin.cab'&gt;
        &lt;param name='src' value="http://web.mac.com/deeje/clinks/ratings-clinks.mp4"&gt;
        &lt;param name='autoplay' value="true"&gt;
        &lt;param name='controller' value="false"&gt;
        &lt;param name='loop' value="true"&gt;
        &lt;EMBED src="http://web.mac.com/deeje/clinks/ratings-clinks.mp4" width="320" height="216" autoplay="true" controller="false" loop="true" pluginspage='http://www.apple.com/quicktime/download/'&gt;
        &lt;/EMBED&gt;
        &lt;/OBJECT&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;/div&gt;

&lt;p&gt;In this way, the 100-point scale is collapsed into a manageable resolution. By no means will this quell the &lt;a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2007/06/15/WIGOOQ5IGD1.DTL&amp;hw=wine&amp;sn=001&amp;sc=1000"&gt;growing debate&lt;/a&gt; about the value and validity of the 100-point wine rating scale, but we think is does help average wine drinkers rank their experiences more easily, which then helps them remember the good wines next time they're at the store. It will be interested to see how people react to it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=4WLUzb5u_EQ:snfkyuYhAjU:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=4WLUzb5u_EQ:snfkyuYhAjU:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=4WLUzb5u_EQ:snfkyuYhAjU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=4WLUzb5u_EQ:snfkyuYhAjU:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=4WLUzb5u_EQ:snfkyuYhAjU:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=4WLUzb5u_EQ:snfkyuYhAjU:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=4WLUzb5u_EQ:snfkyuYhAjU:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=4WLUzb5u_EQ:snfkyuYhAjU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=4WLUzb5u_EQ:snfkyuYhAjU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/4WLUzb5u_EQ" height="1" width="1"/&gt;</content>

        
        

    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/03/rating-systems.html</feedburner:origLink><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="enclosure" href="http://feedproxy.google.com/~r/deeje/musings/~5/MV7qBzVxQjI/ratings-hulu.mp4" length="35301" type="video/mp4" /><feedburner:origEnclosureLink>http://blog.deeje.tv/ratings-hulu.mp4</feedburner:origEnclosureLink></entry>
    <entry>
        <title>My default computer configuration</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/xoNSx6GBbW4/my-default-computer-configuration.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/03/my-default-computer-configuration.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-64597325</id>
        <published>2009-03-24T19:44:04-07:00</published>
        <updated>2009-03-24T19:44:04-07:00</updated>
        <summary type="html">Over the course of this year, I've had to configure a number of machines for daily use. Thru sheer habit, I didn't want to buy a new notebook until after Macworld back in January, so I added accounts to both...</summary>
        <author>
            <name>deeje</name>
        </author>
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;Over the course of this year, I've had to configure a number of machines for daily use. Thru sheer habit, I didn't want to buy a new notebook until after Macworld back in January, so I added accounts to both my wife's and my kid's notebook computers until after then.  Once Macworld had come and gone, I bought a MacBook, opting to balance weight with performance.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;In all these configurations, I've come to appreciate the core set of tools I use on a daily basis:&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;OmniFocus - i've moved away from Mail as a to-do list, and have committed to OmniFocus, both on the Mac and the iPhone.  I had already started to incorporate GTD principles at the start of 2007, so this has felt like a natural adoption.&lt;/li&gt;&#xD;
&lt;li&gt;iDisk - I decided to turn on automatic sync'ing, and have been thrilled with the results so far.  Now I don't have to worry about where I create documents, I just always save to my iDisk, and know I can get to them everywhere.&lt;/li&gt;&#xD;
&lt;li&gt;NetNewsWire - I'm pruning my subscription list significantly, and not spending nearly as much time reading.&lt;/li&gt;&#xD;
&lt;li&gt;MarsEdit - I'm queueing up a bunch of blog entries, so that there's always something to write about, and if I feel blocked on one topic, I can just pick up another topic and take it forward.&lt;/li&gt;&#xD;
&lt;li&gt;Cocoalicious - am trying hard to not leave tabs open in NetNewsWire and Safari... I either read a page right away, or tag it as a reference for future use.&lt;/li&gt;&#xD;
&lt;li&gt;Keynote - I'm doing a lot more presentations these days, whether one-on-one in SyncDev interviews, or to audiences at various conferences.&lt;/li&gt;&#xD;
&lt;li&gt;Xcode - I'm actually really liking this IDE, particularly the auto completion capabilities.&lt;/li&gt;&#xD;
&lt;li&gt;Versions - version control is now a habit.&lt;/li&gt;&#xD;
&lt;li&gt;Fireworks - Just the right level of image editing capabilities, suitable for graphics art in applications.&lt;/li&gt;&#xD;
&lt;li&gt;Interarchy&lt;/li&gt;&#xD;
&lt;li&gt;OmniGraffle - great tool for diagrams.&lt;/li&gt;&#xD;
&lt;li&gt;Keynote&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=xoNSx6GBbW4:GTfe7uQJwpQ:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=xoNSx6GBbW4:GTfe7uQJwpQ:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=xoNSx6GBbW4:GTfe7uQJwpQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=xoNSx6GBbW4:GTfe7uQJwpQ:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=xoNSx6GBbW4:GTfe7uQJwpQ:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=xoNSx6GBbW4:GTfe7uQJwpQ:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=xoNSx6GBbW4:GTfe7uQJwpQ:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=xoNSx6GBbW4:GTfe7uQJwpQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=xoNSx6GBbW4:GTfe7uQJwpQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/xoNSx6GBbW4" height="1" width="1"/&gt;</content>


    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/03/my-default-computer-configuration.html</feedburner:origLink></entry>
    <entry>
        <title>GPS on a snowboard</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/AGB0qKiR7lY/gps-on-a-snowboard.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/02/gps-on-a-snowboard.html" />
        <id>tag:typepad.com,2003:post-63205975</id>
        <published>2009-02-22T16:50:51-08:00</published>
        <updated>2009-02-22T16:50:51-08:00</updated>
        <summary type="html">During my first (and probably few) snow days of the 2009 season, I took along a Garmin eTrex GPS unit. Now I've got some very interesting data to look at, giving me a new perspective on one of my favorite...</summary>
        <author>
            <name>deeje</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Personal" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Sports" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;During my first (and probably few) snow days of the 2009 season, I took along a Garmin eTrex GPS unit.  Now I've got some very interesting data to look at, giving me a new perspective on one of my favorite sports.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;On day 1, I didn't turn the unit on until late in the afternoon, whereas on day 2, I captured the entire day.  Here is the overall waypoint map:&lt;/p&gt;&#xD;
&#xD;
&lt;div style="text-align:center;"&gt;&lt;img src="http://blog.deeje.tv/.a/6a00d8341db43f53ef011168908cc8970c-pi" alt="Northstar-2009-02-waypoints.png" border="0" width="621" height="426"&gt;&lt;/img&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;As you may recognize, I went to Northstar, on the north shore of Lake Tahoe.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Here is the elevation map:&lt;/p&gt;&#xD;
&#xD;
&lt;div style="text-align:center;"&gt;&lt;img src="http://blog.deeje.tv/.a/6a00d8341db43f53ef011168908d3f970c-pi" alt="Northstar-2009-02-elevation.png" border="0" width="616" height="347"&gt;&lt;/img&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;From this, I get some interesting stats:&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Highest elevation: 8621 ft&lt;/li&gt;&#xD;
&lt;li&gt;Longest run: 2.9 miles&lt;/li&gt;&#xD;
&lt;li&gt;Deepest vertical drop: 2299 ft&lt;/li&gt;&#xD;
&lt;li&gt;Total number of runs: 13&lt;/li&gt;&#xD;
&lt;li&gt;Total distance travelled: 35.73 miles&lt;/li&gt;&#xD;
&lt;li&gt;Average lift speed: 10 mph&lt;/li&gt;&#xD;
&lt;li&gt;Average speed on runs: 20 mph&lt;/li&gt;&#xD;
&lt;li&gt;Peak speed on runs: 40 mph&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AGB0qKiR7lY:ITuC4iu_d_g:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=AGB0qKiR7lY:ITuC4iu_d_g:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AGB0qKiR7lY:ITuC4iu_d_g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AGB0qKiR7lY:ITuC4iu_d_g:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AGB0qKiR7lY:ITuC4iu_d_g:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=AGB0qKiR7lY:ITuC4iu_d_g:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AGB0qKiR7lY:ITuC4iu_d_g:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=AGB0qKiR7lY:ITuC4iu_d_g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=AGB0qKiR7lY:ITuC4iu_d_g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/AGB0qKiR7lY" height="1" width="1"/&gt;</content>


    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/02/gps-on-a-snowboard.html</feedburner:origLink></entry>
    <entry>
        <title>Internet TV Value Chain</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/wXid30NL5eQ/internet-tv-value-chain.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/02/internet-tv-value-chain.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-62375214</id>
        <published>2009-02-04T10:45:23-08:00</published>
        <updated>2009-02-04T10:45:23-08:00</updated>
        <summary type="html">I define Internet TV as professionally- or prosumer-created video delivered over the internet, often thru a web browser. That definition doesn't quite cover all of YouTube, since so much of their content is random (to use as kind a word...</summary>
        <author>
            <name>deeje</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Technology" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Television" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Web/Tech" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;I define Internet TV as professionally- or prosumer-created video delivered over the internet, often thru a web browser.  That definition doesn't quite cover all of YouTube, since so much of their content is random (to use as kind a word as I can find), but certainly YouTube &lt;a href="http://dictionary.law.com/default2.asp?selected=1017&amp;bold=||||"&gt;in toto&lt;/a&gt; is part of Internet TV, too.&lt;/p&gt;

&lt;p&gt;I've gained a tremendous amount of experience and exposure to the processes involved in delivering Internet TV content, and its much more complicated than most people imagine. When I go to tech conferences and sit in on sessions titled "How to publish video online", I'm flabbergasted that these presentations often revolve strictly around the presentation layer inside HTML, and ignore the complexities of publishing for-profit video content online.&lt;/p&gt;

&lt;p&gt;The value chain for publishing Internet TV involves the following components:
&lt;ul&gt;
&lt;li&gt;Encoding&lt;/li&gt;
&lt;li&gt;Video Content Management&lt;/li&gt;
&lt;li&gt;Advertising&lt;/li&gt;
&lt;li&gt;Protection&lt;/li&gt;
&lt;li&gt;Delivery (CDN)&lt;/li&gt;
&lt;li&gt;Playback&lt;/li&gt;
&lt;li&gt;Measurement&lt;/li&gt;
&lt;/ul&gt;
Depending on your needs, you can fill each of these components using desktop software, server software, or web services.  Surprisingly, there are few one-stop shops for all of these components, and custom requirements often make these challenging to choose.&lt;/p&gt;

&lt;p&gt;Here are some additional thoughts on each of the value chain components.&lt;/p&gt;

&lt;h3&gt;Encoding&lt;/h3&gt;

&lt;p&gt;Encoding means transforming video sources into digital bits suitable for transportation over the Internet.  It used to be that encoding was integral to Delivery and Playback, but as the entire video industry moves to standards like H.264, encoding can become independent of these downstream value chain components.&lt;/p&gt;

&lt;p&gt;That doesn't necessarily make encoding any easier.  Even with an emerging standard, there are still many considerations for encoding, starting with the nature of the video source.  Libraries of existing video content can be processed in batches asynchronously.  Live video feeds must be processed in real-time.  Ideally you must also encode at multiple dimensions and quality levels (translating into an array of different bit rates).  This means additional processing power for live events, and additional storage for libraries.  And of course, you should make all your live events available afterwards on-demand.&lt;/p&gt;

&lt;h3&gt;Video Content Management&lt;/h3&gt;

&lt;p&gt;Like any other kind of content being published on a regular basis, video content needs to be managed. Fundamentally, this means keeping track of which content is ready for publishing, and which content is already published.  From there, you can imaging all sorts of additional business rules and related metadata that you'd like to manage for your content, which is often encoded as XML and stored in databases on robust back-end systems.&lt;/p&gt;

&lt;p&gt;Often times, video content management encompasses many of the value chain components in aggregate, such as encoding files that are uploaded, storing them on servers, publishing them to websites, communicating with advertising systems, and so on.  And sometimes, they don't, which means you'll have to integrate these other components yourself.&lt;/p&gt;

&lt;h3&gt;Advertising&lt;/h3&gt;

&lt;p&gt;There are two aspects to advertising that you must consider when assembling your solution: where to put ads in and around your video content, and what ads to display.&lt;/p&gt;

&lt;p&gt;The &amp;quot;where&amp;quot; question is often defined using a &amp;quot;playlist&amp;quot concept, which may be component managed by your video content management system.  With a mix of the old (TV) and the new (Web), the playlist may include a sequence of content segments, interspersed with in-roll (pre-roll, mid-roll, post-roll) video ads, along with parallel companion banner ads that appear next to the content and overlay ads that appear on top of the content.&lt;/p&gt;

&lt;p&gt;For short video segments, the playlist may want to have complex business rules that dictate in-roll ads only after N plays or only after N minutes of playback.  For longer video segments, the challenge is in identifying the natural breaks within the video content suitable for traditional mid-roll advertising.  For professional content, these breaks are already built into the content for traditional broadcasts by the editor, and the industry must move towards standards that allow editors to pass this metadata along thru the encoding and publishing steps with as little additional effort as possible.&lt;/p&gt;

&lt;p&gt;Once the &amp;quot;when&amp;quot; question is addressed, the next challenge for advertising systems is the &amp;quot;what&amp;quot;, to fill the ad spots at playback that are most suitable for the viewer of the content.  Ultimately, the value of each ad will be measured by the relevance of the ad to each viewer.  Some advertising solutions focus on matching ads to the context of the content, while others focus on matching ads with the behavior of the viewer.&lt;/p&gt;

&lt;p&gt;Each have their strengths and limitations, IMHO. Educational or informational programming, like cooking shows, will benefit most directly from contextual advertising, because viewers are specifically in the mindset of knowledge acquisition.&lt;/p&gt;

&lt;h3&gt;Protection and Delivery&lt;/h3&gt;

&lt;p&gt;Good fences make good neighbors.  Good content protection makes your content available most conveniently to your viewers, while preserving the business model you need to remain viable.  The corollary is that castles aren't very inviting: make your content too difficult to use, and no one will try.&lt;/p&gt;

&lt;p&gt;For Internet TV content, protection is often closely tied to the form of delivery, either streaming or download.&lt;/p&gt;

&lt;p&gt;Streaming involves delivering bits in real time to a viewer in an encrypted fashion, such that the bits are displayed and then immediately discarded. The pros for content owners is that the content remains centrally managed, and the content is available on-demand for viewers.  The cons are that any disruption in that real-time delivery can translate into a disruption of the playback experience, and that users must be online in order to watch the content.&lt;/p&gt;

&lt;p&gt;Downloading involves delivering bits in asynchronously, in an encrypted fashion on a per-viewer basis. The pros for viewers is that they can watch the content regardless of the state and quality of their online connection.  The cons are that viewers will opt to download higher bitrate versions of content, increasing the delivery costs.&lt;/p&gt;

&lt;p&gt;Speaking of delivery costs, the CDN cost difference between streaming and download have dropped significantly in recent years, and streaming has incorporated protection, while protecting downloadable content is still a separate step and cost at this point.&lt;/p&gt;

&lt;h3&gt;Playback&lt;/h3&gt;

&lt;p&gt;The emergence of standards like H.264 take video quality almost completely out of the equation when evaluating playback environments.  But the other aspects are still tremendously important, including protected delivery and advertising.&lt;/p&gt;

&lt;p&gt;And of course, Internet TV should eventually transcend traditional TV, particularly in terms of interactivity.  What that actually looks like in 50 years, I don't think anyone really knows.  But playback environments need the developer base, tool set, and device support to enable exploration and experimentation.&lt;/p&gt;

&lt;h3&gt;Measurement&lt;/h3&gt;

&lt;p&gt;After all that, we come to the most important, and least mature, component of the entire Internet TV value chain.  You can't manage what you don't measure, so make sure you put measurement in place *first*, and the rest of the components as you see fit.  Fundamentally, this means figuring out what questions you want answered, then figuring out how best to answer them.&lt;/p&gt;

&lt;p&gt;The challenge with measurement is defining exactly what you want to measure, and understanding what metrics the various other components provide.  Server-side components may track hits, and client-side components, rolled into your playback environment, may track starts and stops.  The industry is starting to tackle the challenges around definitions of measurement, and how to translate low-level metrics like these into higher-level metrics like audience size and engagement time.&lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wXid30NL5eQ:ZM6VASJiI7E:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=wXid30NL5eQ:ZM6VASJiI7E:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wXid30NL5eQ:ZM6VASJiI7E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wXid30NL5eQ:ZM6VASJiI7E:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wXid30NL5eQ:ZM6VASJiI7E:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=wXid30NL5eQ:ZM6VASJiI7E:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wXid30NL5eQ:ZM6VASJiI7E:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wXid30NL5eQ:ZM6VASJiI7E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=wXid30NL5eQ:ZM6VASJiI7E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/wXid30NL5eQ" height="1" width="1"/&gt;</content>


    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/02/internet-tv-value-chain.html</feedburner:origLink></entry>
    <entry>
        <title>What I learned at ZAP 2009</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/n5Vg9hR9NAA/what-i-learned-at-zap-2009.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/01/what-i-learned-at-zap-2009.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-62207986</id>
        <published>2009-01-31T18:00:01-08:00</published>
        <updated>2009-01-31T18:00:01-08:00</updated>
        <summary type="html">If you follow me on Twitter (@deeje) you probably noticed a ton of posting today rating various wines. I was at the ZAP Zinfandel Festival 2009 at Fort Mason today, and was field testing our new iPhone app. Here are...</summary>
        <author>
            <name>deeje</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="iPhone" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Wine" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;If you follow me on Twitter (&lt;a href="http://twitter.com/deeje"&gt;@deeje&lt;/a&gt;) you probably noticed a ton of posting today rating various wines.  I was at the &lt;a href="http://www.zinfandel.org/"&gt;ZAP&lt;/a&gt; &lt;a href="http://www.zinfandel.org/default.asp?n1=9&amp;n2=209"&gt;Zinfandel Festival 2009&lt;/a&gt; at Fort Mason today, and was field testing our new iPhone app.  Here are a few quick observations while they're fresh on my mind.&lt;/p&gt;

&lt;p&gt;First, I didn't see anyone actually taking notes on what they were tasting.  ZAP does provide a paper guide for tasting notes and I did run into some friends who pulled out their tasting guide to tell me about some of their favorite zins.  Clearly, people are trying to keep track to a limited degree, but it wasn't overt or widespread.&lt;/p&gt;

&lt;p&gt;Next, we've already been thinking about a "twitter limiter" setting so that low ratings don't get posted.  The takeaway here is that my rating is not consequential... I'm no expert, I'm just trying to keep track of what I like and don't like.  There's no point in posting low ratings, only the stuff that really impresses.&lt;/p&gt;

&lt;p&gt;Third, while we've spent considerable time making our app easy to user, and in particular, easer to enter data, there's still a bunch of aspects to identifying wine that are tricky.  For example, what's the difference between Zinfandel and Old Vine Zinfandel?  How important is the vinyard? Clearly the winemaker makes the distinction, and so should we when we want to remember and find that wine again.  But we also don't want to make identifying wines a burden... tricky.&lt;/p&gt;

&lt;p&gt;The notion of scanning bar codes to identify wines seems obvious to everyone we talk with, but the practical reality is that bar codes are not universal.  In the context of a large wine tasting event, however, i could see it making a journal drop dead simple to use.&lt;/p&gt;

&lt;p&gt;Lastly, I'm not so deep on wines yet to really appreciate all the nuance between the 14 different zinfandels I tasted. I'm looking forward to the &lt;a href="http://www.winejudging.com/"&gt;San Francisco Chronicle Wine Competition&lt;/a&gt; &lt;a href="http://www.winejudging.com/public_tasting.htm"&gt;public wine tasting&lt;/a&gt; event in Feb.&lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=n5Vg9hR9NAA:drJfR6Ogu3s:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=n5Vg9hR9NAA:drJfR6Ogu3s:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=n5Vg9hR9NAA:drJfR6Ogu3s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=n5Vg9hR9NAA:drJfR6Ogu3s:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=n5Vg9hR9NAA:drJfR6Ogu3s:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=n5Vg9hR9NAA:drJfR6Ogu3s:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=n5Vg9hR9NAA:drJfR6Ogu3s:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=n5Vg9hR9NAA:drJfR6Ogu3s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=n5Vg9hR9NAA:drJfR6Ogu3s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/n5Vg9hR9NAA" height="1" width="1"/&gt;</content>


    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/01/what-i-learned-at-zap-2009.html</feedburner:origLink></entry>
    <entry>
        <title>One of the world's longest exposures

noahkalina:
One of the world’s longest exposures...</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/79DY0XtR32I/one-of-the-worlds-longest-exposures--noahkalina-one-of-the-worlds-longest-exposures.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/01/one-of-the-worlds-longest-exposures--noahkalina-one-of-the-worlds-longest-exposures.html" />
        <id>tag:typepad.com,2003:post-61203120</id>
        <published>2009-01-11T19:24:04-08:00</published>
        <updated>2009-01-29T20:04:26-08:00</updated>
        <summary type="html">Mike Hudack's Tumblog wrote: ericlodwick: noahkalina: One of the world’s longest exposures... ericlodwick: noahkalina: One of the world’s longest exposures ever. For 6 months between the winter and summer solstice, Justin Quinnell left open his homemade pinhole camera. The lowest...</summary>
        <author>
            <name>deeje</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Photography" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;a href="http://mhudack.com/"&gt;&lt;cite&gt;Mike Hudack's Tumblog&lt;/cite&gt;&lt;/a&gt; wrote:&lt;/p&gt;
&lt;blockquote cite="http://mhudack.com/post/69806711"&gt;
&lt;p&gt;&lt;a href="http://mhudack.com/post/69806711"&gt;ericlodwick:

noahkalina:
One of the world&amp;rsquo;s longest exposures...&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://data.tumblr.com/hLyH2DZInifqdtbneIL5UO1Zo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://ericlodwick.com/post/69804206/noahkalina-one-of-the-worlds-longest-exposures"&gt;ericlodwick&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://blog.noahkalina.com/post/69044385/one-of-the-worlds-longest-exposures-ever-for-6"&gt;noahkalina&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;One of the world&amp;rsquo;s longest exposures ever. For 6 months between the winter and summer solstice, &lt;a href="http://www.pinholephotography.org/"&gt;Justin&amp;#160;Quinnell&lt;/a&gt; left open his homemade pinhole camera.&amp;#160;The lowest arc shows the first day of exposure on the winter solstice, the top curves were captured in the middle of summer.&lt;br/&gt;(via: &lt;a href="http://ptrbkr.com/"&gt;ptrbkr&lt;/a&gt;)&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;Beautiful.&lt;/p&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Indeed!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=79DY0XtR32I:D2pWU9VcWx4:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=79DY0XtR32I:D2pWU9VcWx4:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=79DY0XtR32I:D2pWU9VcWx4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=79DY0XtR32I:D2pWU9VcWx4:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=79DY0XtR32I:D2pWU9VcWx4:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=79DY0XtR32I:D2pWU9VcWx4:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=79DY0XtR32I:D2pWU9VcWx4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=79DY0XtR32I:D2pWU9VcWx4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=79DY0XtR32I:D2pWU9VcWx4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/79DY0XtR32I" height="1" width="1"/&gt;</content>


    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/01/one-of-the-worlds-longest-exposures--noahkalina-one-of-the-worlds-longest-exposures.html</feedburner:origLink></entry>
    <entry>
        <title>The Passion Factor</title>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/deeje/musings/~3/wGL5UcbymzQ/the-passion-factor.html" />
        <link rel="replies" type="text/html" href="http://blog.deeje.tv/musings/2009/01/the-passion-factor.html" />
        <id>tag:typepad.com,2003:post-61121316</id>
        <published>2009-01-09T12:09:33-08:00</published>
        <updated>2009-01-09T12:09:33-08:00</updated>
        <summary type="html">After I parted ways with Adobe, I reached out to my former colleagues with an oft-burdensome request to recommend me on LinkedIn. Very graciously, many responded. Thank you! In thinking about where I want to go next, I've also been...</summary>
        <author>
            <name>deeje</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Personal" />
        
        
<content type="html" xml:lang="en-US" xml:base="http://blog.deeje.tv/musings/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;After I parted ways with Adobe, I reached out to my former colleagues with an oft-burdensome request to recommend me on LinkedIn. Very graciously, many responded.  Thank you!&lt;/p&gt;

&lt;p&gt;In thinking about where I want to go next, I've also been thinking about the best ways to describe what I do.  I've worn many hats over the years, and no one hat seems to satisfy me enough.  Engineer, architect , product manager, business development...  But I'm beginning to see some themes that connect the hats I like best.&lt;/p&gt;

&lt;p&gt;Reviewing the recommendations I've received, a common term used to describe me is &amp;quot;passionate&amp;quot;.  In the context of business, I've channeled my passion into building great products. The way that this passion is manifest is two-fold.  First, I'm passionate about understanding customer needs.  And second, I'm passionate about defining experiences that satisfy those needs.&lt;/p&gt;

&lt;p&gt;After returning to college to earn a Business/Marketing degree a few years ago, I got the rare opportunity to learn a new product development methodology called SyncDev.  SyncDev is a process that involves changing the fundamental order of new product development.  A typical order is &amp;quot;design, build, sell&amp;quot;, but in SyncDev, the order becomes &amp;quot;sell, design, build&amp;quot;.&lt;/p&gt;

&lt;p&gt;Part of what makes SyncDev so great is the iterative nature it brings to all aspects of product development: market segmentation, market requirements, product requirements, promotion, and engineering.  In SyncDev, you're constantly testing your theories about each of these aspects against real customer feedback, to ensure that the final result is worth doing and very successful.&lt;/p&gt;

&lt;p&gt;It seems like an obvious optimization, but its also amazing how many companies build before they sell, provide answers before they've asked the questions.  Now that I've experienced the SyncDev process, I won't build another product without practicing SyncDev  along the way.  And I will be providing coaching services to help companies incorporate SyncDev into their DNAs. For those interested, I highly recommend you check out their site at &lt;a href="http://www.syncdev.com/"&gt;SyncDev.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the customer, problems, and features start to come into focus thru SyncDev, I love the challenge of designing experiences that are efficient and delightful.  I've worked on almost a dozen consumer products over the last two decades.  TouchBase was one of the first highly successful address book apps for Mac, which we sold to Aldus.  Photo Deluxe put task-based UIs on top of the power of Photoshop.  PuppetTime brought automated 3D animation to screenwriters, which we sold to Cycore.  Contribute enabled easy web page editing before blogs and wikis.  And Adobe Media Player tackled the business and technical challenges of a completely on-demand television experience.&lt;/p&gt;

&lt;/p&gt;In each case, I've used the latest and greatest frameworks and technologies.  Early on, I realized that while user interfaces can be broken down into building blocks, user experiences cannot. Great experiences are often defined by the little details that most users don't consciously see or feel, and by the complexity of the solutions that they hide.  They make the user feel more efficient, and bring delight repeatedly.&lt;/p&gt;

&lt;p&gt;I'm currently working with some colleagues on a wine journal app for iPhone, using SyncDev to better understands the wants and needs of wine drinkers, and defining and designing experiences that will, we hope, help wine drinkers move from casual to connoisseur.&lt;/p&gt;

&lt;p&gt;I'm looking forward to sharing more with you soon... In the meantime, what are you passionate about?&lt;/p&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wGL5UcbymzQ:-WO2apdogX8:3QFJfmc7Om4"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=wGL5UcbymzQ:-WO2apdogX8:3QFJfmc7Om4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wGL5UcbymzQ:-WO2apdogX8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wGL5UcbymzQ:-WO2apdogX8:2nqncYFp4_M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=2nqncYFp4_M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wGL5UcbymzQ:-WO2apdogX8:ozPqQDaSF7U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=wGL5UcbymzQ:-WO2apdogX8:ozPqQDaSF7U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wGL5UcbymzQ:-WO2apdogX8:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/deeje/musings?a=wGL5UcbymzQ:-WO2apdogX8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/deeje/musings?i=wGL5UcbymzQ:-WO2apdogX8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/deeje/musings/~4/wGL5UcbymzQ" height="1" width="1"/&gt;</content>


    <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><feedburner:origLink>http://blog.deeje.tv/musings/2009/01/the-passion-factor.html</feedburner:origLink></entry>
 
</feed><!-- ph=1 --><!-- nhm:dynamic-ssi --><!-- ThriftClient: CommentSvc-2-count-error: 5 -->
