<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Dare Obasanjo's weblog - Platforms</title>
    <link>http://www.25hoursaday.com/weblog/</link>
    <description>"You can buy cars but you can't buy respect in the hood" - Curtis Jackson</description>
    <language>en-us</language>
    <copyright>Dare Obasanjo</copyright>
    <lastBuildDate>Thu, 23 Oct 2014 14:45:09 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.12105.0</generator>
    <managingEditor>kpako@yahoo.com</managingEditor>
    <webMaster>kpako@yahoo.com</webMaster>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=b32f411a-d4d0-42bb-b3a2-3995a95671a6</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,b32f411a-d4d0-42bb-b3a2-3995a95671a6.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,b32f411a-d4d0-42bb-b3a2-3995a95671a6.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b32f411a-d4d0-42bb-b3a2-3995a95671a6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yesterday <a href="https://blog.twitter.com/2014/introducing-fabric">Twitter announced
Fabric</a>, a new mobile SDK for Android and iOS composed of four distinct pieces
</p>
        <ul>
          <li>
            <a href="https://try.crashlytics.com/">Crashlytics</a> – an application analytics
package that gives developers tools to measure how their apps are being used and measure
app quality in the wild (i.e. crashes). 
</li>
          <li>
            <a href="https://dev.twitter.com/twitter-kit">Twitter Kit</a> – an SDK that makes
it add Twitter integration such as signing in with Twitter, embedding tweets or posting
tweets from your app 
</li>
          <li>
            <a href="https://dev.twitter.com/mopub">MoPub Kit</a> – makes it easy to embed ads
from Twitter’s ad network in your app so you can make money 
</li>
          <li>
            <a href="https://www.digits.com/">Digits</a> – makes it easy for any app to build
phone number based sign-in similar to what <a href="http://www.skype.com/en/qik/">Skype
Qik</a> and <a href="http://www.whatsapp.com/">WhatsApp</a> have. This is quite frankly <em>a
game changer</em>. 
</li>
        </ul>
        <p>
The response to this release I’ve seen online have swung between two extremes, <a href="http://blogs.wsj.com/digits/2014/10/22/behind-flight-twitters-bold-attempt-to-make-nice-with-app-makers/">fawning
adoration from the tech press</a> proclaiming that Twitter has moved beyond tweets
into mobile services and <a href="http://www.marco.org/2014/10/20/wsj-twitter-peace-offering">skepticism
from developers </a>who don’t trust Twitter as represented in this tweet below
</p>
        <blockquote lang="en" class="twitter-tweet">
          <p>
Did Twitter address in any way their platform trust issues today? Innovation in guaranteeing
long term trustworthiness would be fascinating.
</p>
— kellan (@kellan) <a href="https://twitter.com/kellan/status/525079632463552512">October
23, 2014</a></blockquote>
        <p>
          <script async="async" src="//platform.twitter.com/widgets.js" charset="utf-8">
          </script>
        </p>
        <p>
The root of this angst is Twitter’s tumultuous relationship with developers of Twitter
clients which eventually led to their <a href="https://blog.twitter.com/2012/changes-coming-to-twitter-api">infamous
quadrant of death post</a> which effectively limited the growth of any app whose primary
function was to be a replacement Twitter experience. This hurt many developers who
had been working on Twitter reading experiences and in fact led to <a href="http://www.businessinsider.com/flipboard-ceo-mike-mccue-has-left-twitters-board-of-directors-2012-8">the
CEO of Flipboard quitting Twitter’s board in disgust</a>. 
</p>
        <p>
Thus it is a valid question for developers as to whether they can trust Twitter this
time? The answer is Yes for a very simple reason. Twitter’s API moves in 2012 and
yesterday’s announcements were borne from the same motives, to grow its primary business
of selling ads tied to their mobile experiences. In 2012, they had to address the
fact that their liberal exposure of their service via their API had created a situation
where a huge slice of their user base were using the app through experiences Twitter
could not effectively monetize.  
</p>
        <p>
At the height of the 3rd party Twitter app boom <a href="http://techcrunch.com/2011/03/15/report-use-of-third-party-twitter-clients-dwindles-to-42-percent/">almost
half of their users were using official apps (42%)</a> although <a href="https://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=4&amp;cad=rja&amp;uact=8&amp;ved=0CDEQFjAD&amp;url=http%3A%2F%2Fwww.theverge.com%2F2012%2F7%2F24%2F3183124%2Ftwitter-third-party-apps-study-benjamin-mayo&amp;ei=nQ9JVNbqI4-1yATIg4HQBQ&amp;usg=AFQjCNHJyBeUr7r-BHMlpb9hOkdth4Ecww&amp;sig2=C9dsUfig5ozC5sbp6PyGZQ">that
percentage dwindled</a> as they stepped up their mobile app efforts and sent the message
to app developers that they no longer wanted people to compete with them on providing
mobile experiences.
</p>
        <p>
          <img src="http://tctechcrunch2011.files.wordpress.com/2011/03/sysomos-1.png" /> 
</p>
        <p>
Taking control of the primary user experience for Twitter was the smart business decision
and is why <a href="http://www.businessinsider.com/twitter-q2-earnings-2014-7">they
now  generate over a billion dollars a year as a business</a>. 
</p>
        <p>
This brings us to Fabric. All four components aid Twitters core business of selling
ads for mobile experiences. 
</p>
        <ul>
          <li>
            <em>Twitter Kit</em> increases engagement with Twitter by making it easy for users
to consume and generate tweets from other apps without those apps being a threat to
Twitter by becoming competing experiences. 
</li>
          <li>
            <em>Digits</em> allows Twitter to build a profile of users based on their phone number
the same way Facebook builds a profile of users based on the apps and websites they
visit that use Facebook Connect. 
</li>
          <li>
            <em>Crashlytics</em> + <em>MoPub</em> is the Trojan horse with a approach to <a href="http://techcrunch.com/2014/07/21/yahoo-is-buying-mobile-analytics-firm-flurry-for-north-of-200m/">Flurry
which Yahoo acquired for $200 million</a>. Crashlytics is a incredibly useful component
that is valuable to all mobile apps since they all care about user behavior and crashes.
Once you’re hooked on Crashlytics, it’s easier to upsell you to also using Twitters
ad network and hence $$$. 
</li>
        </ul>
        <p>
All of these efforts help Twitter’s core business and it would be insanity for them
to screw developers by abandoning them just as it would have been insanity for them
to pursue an ad-based business model in a world where a huge chunk of their most active
users were using 3rd party apps as their primary Twitter experience. 
</p>
        <p>
So go ahead, try out Fabric and judge it on its merits. I’m curious to hear what you
think. 
</p>
        <p>
          <img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/Chris-Brown/e/B000AQ4T9M/digital/ref=ntt_mp3_rdr?_encoding=UTF8&amp;sn=d">Chris
Brown</a> – <a href="http://www.amazon.com/Loyal-Explicit/dp/B00MXC1BW4">Loyal (featuring
Lil Wayne and Tyga)</a><img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b32f411a-d4d0-42bb-b3a2-3995a95671a6" />
      </body>
      <title>Fabric: Why Developers Can Trust Twitter Won’t Screw Them This Time</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,b32f411a-d4d0-42bb-b3a2-3995a95671a6.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2014/10/23/FabricWhyDevelopersCanTrustTwitterWontScrewThemThisTime.aspx</link>
      <pubDate>Thu, 23 Oct 2014 14:45:09 GMT</pubDate>
      <description>&lt;p&gt;
Yesterday &lt;a href="https://blog.twitter.com/2014/introducing-fabric"&gt;Twitter announced
Fabric&lt;/a&gt;, a new mobile SDK for Android and iOS composed of four distinct pieces
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://try.crashlytics.com/"&gt;Crashlytics&lt;/a&gt; – an application analytics
package that gives developers tools to measure how their apps are being used and measure
app quality in the wild (i.e. crashes). 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.twitter.com/twitter-kit"&gt;Twitter Kit&lt;/a&gt; – an SDK that makes
it add Twitter integration such as signing in with Twitter, embedding tweets or posting
tweets from your app 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.twitter.com/mopub"&gt;MoPub Kit&lt;/a&gt; – makes it easy to embed ads
from Twitter’s ad network in your app so you can make money 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.digits.com/"&gt;Digits&lt;/a&gt; – makes it easy for any app to build
phone number based sign-in similar to what &lt;a href="http://www.skype.com/en/qik/"&gt;Skype
Qik&lt;/a&gt; and &lt;a href="http://www.whatsapp.com/"&gt;WhatsApp&lt;/a&gt; have. This is quite frankly &lt;em&gt;a
game changer&lt;/em&gt;. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The response to this release I’ve seen online have swung between two extremes, &lt;a href="http://blogs.wsj.com/digits/2014/10/22/behind-flight-twitters-bold-attempt-to-make-nice-with-app-makers/"&gt;fawning
adoration from the tech press&lt;/a&gt; proclaiming that Twitter has moved beyond tweets
into mobile services and &lt;a href="http://www.marco.org/2014/10/20/wsj-twitter-peace-offering"&gt;skepticism
from developers &lt;/a&gt;who don’t trust Twitter as represented in this tweet below
&lt;/p&gt;
&lt;blockquote lang="en" class="twitter-tweet"&gt; 
&lt;p&gt;
Did Twitter address in any way their platform trust issues today? Innovation in guaranteeing
long term trustworthiness would be fascinating.
&lt;/p&gt;
— kellan (@kellan) &lt;a href="https://twitter.com/kellan/status/525079632463552512"&gt;October
23, 2014&lt;/a&gt;&lt;/blockquote&gt; 
&lt;p&gt;
&lt;script async src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
The root of this angst is Twitter’s tumultuous relationship with developers of Twitter
clients which eventually led to their &lt;a href="https://blog.twitter.com/2012/changes-coming-to-twitter-api"&gt;infamous
quadrant of death post&lt;/a&gt; which effectively limited the growth of any app whose primary
function was to be a replacement Twitter experience. This hurt many developers who
had been working on Twitter reading experiences and in fact led to &lt;a href="http://www.businessinsider.com/flipboard-ceo-mike-mccue-has-left-twitters-board-of-directors-2012-8"&gt;the
CEO of Flipboard quitting Twitter’s board in disgust&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Thus it is a valid question for developers as to whether they can trust Twitter this
time? The answer is Yes for a very simple reason. Twitter’s API moves in 2012 and
yesterday’s announcements were borne from the same motives, to grow its primary business
of selling ads tied to their mobile experiences. In 2012, they had to address the
fact that their liberal exposure of their service via their API had created a situation
where a huge slice of their user base were using the app through experiences Twitter
could not effectively monetize.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
At the height of the 3rd party Twitter app boom &lt;a href="http://techcrunch.com/2011/03/15/report-use-of-third-party-twitter-clients-dwindles-to-42-percent/"&gt;almost
half of their users were using official apps (42%)&lt;/a&gt; although &lt;a href="https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=4&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=0CDEQFjAD&amp;amp;url=http%3A%2F%2Fwww.theverge.com%2F2012%2F7%2F24%2F3183124%2Ftwitter-third-party-apps-study-benjamin-mayo&amp;amp;ei=nQ9JVNbqI4-1yATIg4HQBQ&amp;amp;usg=AFQjCNHJyBeUr7r-BHMlpb9hOkdth4Ecww&amp;amp;sig2=C9dsUfig5ozC5sbp6PyGZQ"&gt;that
percentage dwindled&lt;/a&gt; as they stepped up their mobile app efforts and sent the message
to app developers that they no longer wanted people to compete with them on providing
mobile experiences.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://tctechcrunch2011.files.wordpress.com/2011/03/sysomos-1.png" /&gt;&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Taking control of the primary user experience for Twitter was the smart business decision
and is why &lt;a href="http://www.businessinsider.com/twitter-q2-earnings-2014-7"&gt;they
now&amp;#160; generate over a billion dollars a year as a business&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
This brings us to Fabric. All four components aid Twitters core business of selling
ads for mobile experiences. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Twitter Kit&lt;/em&gt; increases engagement with Twitter by making it easy for users
to consume and generate tweets from other apps without those apps being a threat to
Twitter by becoming competing experiences. 
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Digits&lt;/em&gt; allows Twitter to build a profile of users based on their phone number
the same way Facebook builds a profile of users based on the apps and websites they
visit that use Facebook Connect. 
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Crashlytics&lt;/em&gt; + &lt;em&gt;MoPub&lt;/em&gt; is the Trojan horse with a approach to &lt;a href="http://techcrunch.com/2014/07/21/yahoo-is-buying-mobile-analytics-firm-flurry-for-north-of-200m/"&gt;Flurry
which Yahoo acquired for $200 million&lt;/a&gt;. Crashlytics is a incredibly useful component
that is valuable to all mobile apps since they all care about user behavior and crashes.
Once you’re hooked on Crashlytics, it’s easier to upsell you to also using Twitters
ad network and hence $$$. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
All of these efforts help Twitter’s core business and it would be insanity for them
to screw developers by abandoning them just as it would have been insanity for them
to pursue an ad-based business model in a world where a huge chunk of their most active
users were using 3rd party apps as their primary Twitter experience. 
&lt;/p&gt;
&lt;p&gt;
So go ahead, try out Fabric and judge it on its merits. I’m curious to hear what you
think. 
&lt;/p&gt;
&lt;p&gt;
&lt;img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/Chris-Brown/e/B000AQ4T9M/digital/ref=ntt_mp3_rdr?_encoding=UTF8&amp;amp;sn=d"&gt;Chris
Brown&lt;/a&gt; – &lt;a href="http://www.amazon.com/Loyal-Explicit/dp/B00MXC1BW4"&gt;Loyal (featuring
Lil Wayne and Tyga)&lt;/a&gt; &lt;img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b32f411a-d4d0-42bb-b3a2-3995a95671a6" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,b32f411a-d4d0-42bb-b3a2-3995a95671a6.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=2fcfa0f8-1785-4b84-95dd-027fb2d4c340</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,2fcfa0f8-1785-4b84-95dd-027fb2d4c340.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,2fcfa0f8-1785-4b84-95dd-027fb2d4c340.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2fcfa0f8-1785-4b84-95dd-027fb2d4c340</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A few weeks ago Dalton Caldwell, founder of <a href="http://en.wikipedia.org/wiki/Imeem">imeem</a> and <a href="http://picplz.com/">Picplz</a>,
wrote a well received blog post titled <a href="http://daltoncaldwell.com/what-twitter-could-have-been">What
Twitter could have been</a> where he laments the fact that Twitter hasn’t fulfilled
some of the early promise developers saw in it as a platform. Specifically he writes 
</p>
        <blockquote>
          <p>
            <em>Perhaps you think that Twitter today is a really cool and powerful company. Well,
it is. But that doesn’t mean that it couldn’t have been much, much more. I believe
an API-centric Twitter could have enabled an ecosystem far more powerful than what
Facebook is today. Perhaps you think that the API-centric model would have never worked,
and that if the ad guys wouldn’t have won, Twitter would not be alive today. Maybe.
But is the service we think of as Twitter today really the Twitter from a few years
ago living up to its full potential? Did all of the man-hours of brilliant engineers,
product people and designers, and hundreds of millions of VC dollars really turn into,
well, </em>
            <a href="https://twitter.com/#!/daltonc/media/slideshow?url=pic.twitter.com%2FAPZkZ1J1">
              <em>this</em>
            </a>
            <em>?</em>
          </p>
        </blockquote>
        <p>
His blog post struck a chord with developers which made Dalton follow it up with another
blog post titled <a href="http://daltoncaldwell.com/an-audacious-proposal">announcing
an audacious proposal</a> as well as launching the <a href="https://join.app.net/">join.app.net</a>.
Dalton’s proposal is as follows 
</p>
        <blockquote>
          <p>
            <em>I believe so deeply in the importance of having a financially sustainable realtime
feed API &amp; service that I am going to refocus App.net to become <strong>exactly
that</strong>. I have the experience, vision, infrastructure and team to do it. Additionally,
we already have much of this built: a polished native iOS app, a robust technical
infrastructure currently capable of handing ~200MM API calls per day with no code
changes, and a developer-facing API provisioning, documentation and analytics system.
This isn’t vaporware.</em>
          </p>
          <p>
            <em>To manifest this grand vision, we are officially launching a Kickstarter-esque
campaign. We will only accept money for this financially sustainable, ad-free service
if we hit what I believe is critical mass. I am defining minimum critical mass as
$500,000, which is roughly equivalent to ~10,000 backers.</em>
          </p>
        </blockquote>
        <p>
As can be expected as someone who’s worked on software as both <a href="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-43-metablogapi/7080.Whats_2D00_new_5F00_5440AAB8.png">an
API client</a> and <a href="http://dev.live.com">platform provider of APIs</a>, I
have a few thoughts on this topic. So let’s start from the beginning. 
</p>
        <h2>The Promise of Twitter Annotations
</h2>
        <h2>
        </h2>
        <h2>
        </h2>
        <p>
About two years ago, Twitter CEO Dick Costolo wrote an expansive <a href="http://blog.twitter.com/2010/05/twitter-platform.html">“state
of the union” style blog post about the Twitter platform</a>. Besides describing the
state of the Twitter platform at the time it also set forth the direction the platform
intended to go in and made a set of promises about how Twitter saw its role relative
to its developer ecosystem. Dick wrote 
</p>
        <blockquote>
          <p>
            <em>To foster this real-time open information platform, we provide a short-format
publish/subscribe network and access points to that network such as www.twitter.com,
m.twitter.com and several Twitter-branded mobile clients for iPhone, BlackBerry, and
Android devices. We also provide a complete API into the functions of the network
so that others may create access points. We manage the integrity and relevance of
the content in the network in the form of the timeline and we will continue to spend
a great deal of time and money fostering user delight and satisfaction. Finally, we
are responsible for the extensibility of the network to enable innovations that range
from Annotations and Geo-Location to headers that can route support tickets for companies.
There are over 100,000 applications leveraging the Twitter API, and <font color="#ff0000">we
expect that to grow significantly with the expansion of the platform via Annotations
in the coming months</font>.</em>
          </p>
        </blockquote>
        <p>
There was a lot of excitement in the industry about Twitter Annotations both from
developers as well as the usual suspects in the tech press like <a title="TechCrunch: An Early Look At Twitter Annotations Or, &quot;Twannotations&quot;" href="http://techcrunch.com/2010/05/08/twitter-annotations/">TechCrunch</a> and <a href="http://www.readwriteweb.com/archives/what_twitter_annotations_mean.php">ReadWriteWeb</a>.
Blog posts such as <a href="http://www.readwriteweb.com/archives/how_twitter_annotations_could_bring_the_real-time_semantic_web_together.php">How
Twitter Annotations Could Bring the Real-Time and Semantic Web Together</a> show how
excited some developers were by the possibilities presented by the technology. For
those who aren’t familiar with the concept, annotations were supposed to be the way
to attach arbitrary metadata to a tweet beyond the well-known 140 characters. Below
is a screenshot from a Twitter presentation showing this concept visually 
</p>
        <p>
          <img src="http://tctechcrunch2011.files.wordpress.com/2010/05/screen-shot-2010-05-08-at-2-33-17-pm.png?w=640" />
        </p>
        <p>
Although it’s been two years since the <a href="http://techcrunch.com/2010/06/02/twitter-annotations-testing/">Twitter
Annotations was supposed to begin testing</a> this feature has never been released
nor has it talked about by the Twitter Platform team in recent months. Many believe
that Twitter Annotations will never be released due to a changing of the guard within
Twitter which is hinted at in Dalton Caldwell’s <a href="http://daltoncaldwell.com/what-twitter-could-have-been">What
Twitter could have been</a> post 
</p>
        <blockquote>
          <p>
            <em>As I understand, a hugely divisive internal debate occurred among Twitter employees
around this time. One camp wanted to build the entire business around their realtime
API. In this scenario, Twitter would have turned into something like a realtime cloud
API company. The other camp looked at Google’s advertising model for inspiration,
and decided that building their own version of AdWords would be the right way to go.</em>
          </p>
          <p>
            <em>As you likely already know, the advertising group won that battle, and many of
the open API people left the company.</em>
          </p>
        </blockquote>
        <p>
It is this seeming change in direction that Dalton has seized on to create <a href="https://join.app.net/">join.app.net</a>. 
</p>
        <p>
 
</p>
        <h2>Why Twitter Annotations was a Difficult Promise to Make
</h2>
        <h2>
        </h2>
        <h2>
        </h2>
        <p>
I have no idea what went on within Twitter but as someone who has built both platforms
and API clients the challenges in delivering a feature such as Twitter Annotations
seem quite obvious to me. A big problem when delivering a platform as part of an end
user facing service is that there are often trade offs one has to make at the expense
of the other. Doing things that make end users happy may end up ticking off people
who’ve built businesses on your platform (e.g. <a href="http://www.seroundtable.com/google-panda-unemployment-14143.html">layoffs
caused by Google Panda update</a>, <a href="http://tech.fortune.cnn.com/2012/07/12/facebook-9/">companies
losing customers overnight after launch of Facebook's timeline</a>, etc). On the other
hand, doing things that make developers happy can create suboptimal user experiences
such as <a href="http://www.zdnet.com/android-malwares-dirty-secret-repackaging-of-legit-apps-7000000886/">the
“openness” of Android as a platform making it a haven for mobile malware</a>. 
</p>
        <p>
The challenge with Twitter Annotations is that it threw user experience consistency
out of the Window. Imagine that the tweet shown in the image above was created by
Dare’s Awesome Twitter App which allows users to “attach” a TV episode from a source
like Hulu or Netflix into the app before they tweet. Now in Dare’s Awesome Twitter
App, the user sees their tweet an an inline experience where they can consume the
video inline similar to what Twitter calls <a href="http://techcrunch.com/2012/06/13/twitter-expanded-tweets/">Expanded
Tweets</a> today. However the user’s friends who are using the Twitter website or
other Twitter apps just see 140 characters. You can imagine that apps would then compete
on how many annotations they supported and creating new interesting annotations. This
is effectively what happened with RSS and a variety of <a href="http://www.feedforall.com/directory-namespace.htm">RSS
extensions</a> with no RSS reader supporting the full gamut of extensions. Heck, I
supported more RSS extensions in <a href="http://rssbandit.org/">RSS Bandit</a> in
2009 than Google Reader does today. 
</p>
        <p>
This cacophony of Annotations would have meant that not only would there no longer
be such a thing as a consistent Twitter experience but Twitter itself would be on
an eternal treadmill of supporting various annotations as they were introduced into
the ecosystem by various clients and content producers. 
</p>
        <p>
Secondly, the ability to put arbitrary machine readable content in tweets would have
made Twitter an attractive mechanism as a “free” publish-subscribe infrastructure
of all manner of apps and devices. Instead of building a push notification system
to communicate with client apps or devices, an enterprising developer could just create
a special Twitter account and have all the end points connect to that. The notion
of <a href="http://www.wired.com/threatlevel/2009/08/botnet-tweets">Twitter controlled
botnets</a> and the rise of <a href="http://mashable.com/2012/06/26/home-devices-connect-to-twitter/">home
appliances connected to Twitter</a> are all indicative that there is some demand for
this capability. If this content not intended for humans ever becomes a large chunk
of the data flowing through Twitter, how to monetize it will be extremely challenging.
Charging people for using Twitter in this way isn’t easy since it isn’t clear how
you differentiate a 20,000 machine botnet from a moderately popular Internet celebrity
with a lot of fans who mostly lurk on Twitter. 
</p>
        <p>
I have no idea if Twitter ever plans to ship Annotations but if they do I’d be very
interested to see how they would solve the two problems mentioned above. 
</p>
        <h2>Challenges Facing App.net as a Consumer Service
</h2>
        <h2>
        </h2>
        <h2>
        </h2>
        <p>
Now that we’ve talked about Twitter Annotations, let’s look at what App.net plans
to deliver to address the demand that has yet to be fulfilled by the promise of Twitter
Annotations. From join.app.net we learn the product that is intended to be delivered
is 
</p>
        <blockquote>
          <h6>
            <em>OK, great, but what exactly is this product you will be delivering?</em>
          </h6>
          <p>
            <em>As a member, you'll have a new social graph and real-time feed that you access
from an App.net mobile application or website. At first, the user experience will
be very similar to what Twitter was like before it turned into a media company. On
a forward basis, we will focus on expanding our core experience by nurturing a powerful
ecosystem based on 3rd-party developer built "apps". This is why we think
the name "App.net" is appropriate for this service.</em>
          </p>
          <p>
            <em>From a developer perspective, you will be able to read and write to a Twitter-like
API. Developers behaving in good faith will have free reign to build alternate UIs,
new business models of their own, and whatever they can dream up.</em>
          </p>
          <p>
            <em>As this project progresses, we will be collaborating with you, our backers, while
sharing and iterating screenshots of the app, API documentation, and more. There are
quite a few technical improvements to existing APIs that we would like to see in the
App.net API. For example, longer message character limits, RSS feeds, and rich annotations
support.</em>
          </p>
        </blockquote>
        <p>
In short it intends to be a Twitter clone with a more expansive API policy than Twitter.
The key problem facing App.net is that as a social graph based services it will suffer
from the curse of <a href="http://en.wikipedia.org/wiki/Network_effect">network effects</a>.
Social apps need to cross a particular threshold of people on the service before they
are useful and once they cross that threshold it often leads to a “winner-take-all”
dynamic where similar sites with smaller users bleed users to the dominant service
since everyone is on the dominant service. This is how Facebook killed <a href="http://www.myspace.com">MySpace</a> &amp; <a href="http://www.bebo.com/">Bebo</a> and
Twitter killed <a href="http://www.pownce.com/">Pownce</a> &amp; <a href="http://en.wikipedia.org/wiki/Jaiku">Jaiku</a>.
App.net will need to differentiate itself more than just being “open version of popular
social network”. Services like <a href="http://status.net/">Status.net</a> and <a href="https://joindiaspora.com">Diaspora</a> have
tried and failed to make a dent with that approach while fresh approaches to the same
old social graph and news feed like <a href="http://www.pinterest.com">Pinterest</a> and <a href="http://www.instagram.com">Instagram</a> have
grown by leaps and bounds. 
</p>
        <p>
A bigger challenge is the implication that it wants to be a paid social network. As
I mentioned earlier, social graph based services live and die by network effects.
The more people that use them the more useful they get for their members. Charging
money for an online service is an easy way to reduce your target audience by at least
an order of magnitude (i.e. reduce your target audience by at least 90%). As an end
user, I don’t see the value of joining a Twitter-clone populated by people who could
afford $50 a year as opposed to joining a free service like Facebook, Twitter or even
Google+. 
</p>
        <h2>Challenges Facing App.net as a Developer Platform
</h2>
        <h2>
        </h2>
        <h2>
        </h2>
        <p>
As a developer it isn’t clear to me what I’m expected to get out of App.net. The question
on how they came up with their pricing tiers is answered thusly 
</p>
        <blockquote>
          <p>
            <em>Additionally, there are several comps of users being willing to pay roughly this
amount for services that are deeply valuable, trustworthy and dependable. For instance,
Dropbox charges $10 and up per month, Evernote charges $5 and up per month, Github
charges $7 and up per month.</em>
          </p>
          <p>
            <em>The developer price is inspired by the amount charged by the Apple Developer Program, </em>
            <a href="https://developer.apple.com/programs/ios/">
              <em>$99</em>
            </a>
            <em>.
We think this demonstrates that developers are willing to pay for access to a high
quality development platform.</em>
          </p>
        </blockquote>
        <p>
I’ve already mentioned above that network effects are working against App.net as a
popular consumer service. The thought of spending $50 a year to target less users
than I can by building apps on Facebook or Twitter’s platforms doesn’t sound logical
to me. The leaves using App.net as a low cost publish-subscribe mechanism for various
apps or devices I deploy. This is potentially interesting but I’d need to get more
data before I can tell just how interesting it could be. For example, there is a bunch
of talk about claiming your Twitter handle and other things which makes it sound like
developers only get a single account on the service. True developer friendliness for
this type of service would include disclosure on how one could programmatically create
and manage nodes in the social graph (aka accounts in the system). 
</p>
        <p>
At the end of the day although there is a lot of persuasive writing on <a href="https://join.app.net/">join.app.net</a>,
there’s just not enough to explain why it will be a platform that will provide me
enough value as a developer for me to part with my hard earned $50. The comparison
to Apple’s developer program is rich though. Apple has given developers <a href="http://techcrunch.com/2012/06/11/apples-app-store-hits-30-billion-downloaded-apps-paid-out-5-billion-to-developers/">five
billion reasons why paying them $99 a year is worth it</a>, we haven’t gotten one
good one from App.net. 
</p>
        <p>
That said, I wish Dalton luck on this project. Props to anyone who can pick himself
up and continue to build new things after what he went through with imeem and PicPlz. 
</p>
        <p>
          <img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=French+Montana&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">French
Montana</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=French+Montana+Pop+That&amp;x=0&amp;y=0">Pop
That (featuring Rick Ross, Lil Wayne and Drake)</a><img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=2fcfa0f8-1785-4b84-95dd-027fb2d4c340" />
      </body>
      <title>Some Thoughts on App.net</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,2fcfa0f8-1785-4b84-95dd-027fb2d4c340.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2012/07/15/SomeThoughtsOnAppnet.aspx</link>
      <pubDate>Sun, 15 Jul 2012 22:04:46 GMT</pubDate>
      <description>&lt;p&gt;
A few weeks ago Dalton Caldwell, founder of &lt;a href="http://en.wikipedia.org/wiki/Imeem"&gt;imeem&lt;/a&gt; and &lt;a href="http://picplz.com/"&gt;Picplz&lt;/a&gt;,
wrote a well received blog post titled &lt;a href="http://daltoncaldwell.com/what-twitter-could-have-been"&gt;What
Twitter could have been&lt;/a&gt; where he laments the fact that Twitter hasn’t fulfilled
some of the early promise developers saw in it as a platform. Specifically he writes 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Perhaps you think that Twitter today is a really cool and powerful company. Well,
it is. But that doesn’t mean that it couldn’t have been much, much more. I believe
an API-centric Twitter could have enabled an ecosystem far more powerful than what
Facebook is today. Perhaps you think that the API-centric model would have never worked,
and that if the ad guys wouldn’t have won, Twitter would not be alive today. Maybe.
But is the service we think of as Twitter today really the Twitter from a few years
ago living up to its full potential? Did all of the man-hours of brilliant engineers,
product people and designers, and hundreds of millions of VC dollars really turn into,
well, &lt;/em&gt;&lt;a href="https://twitter.com/#!/daltonc/media/slideshow?url=pic.twitter.com%2FAPZkZ1J1"&gt;&lt;em&gt;this&lt;/em&gt;&lt;/a&gt;&lt;em&gt;?&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
His blog post struck a chord with developers which made Dalton follow it up with another
blog post titled &lt;a href="http://daltoncaldwell.com/an-audacious-proposal"&gt;announcing
an audacious proposal&lt;/a&gt; as well as launching the &lt;a href="https://join.app.net/"&gt;join.app.net&lt;/a&gt;.
Dalton’s proposal is as follows 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;I believe so deeply in the importance of having a financially sustainable realtime
feed API &amp;amp; service that I am going to refocus App.net to become &lt;strong&gt;exactly
that&lt;/strong&gt;. I have the experience, vision, infrastructure and team to do it. Additionally,
we already have much of this built: a polished native iOS app, a robust technical
infrastructure currently capable of handing ~200MM API calls per day with no code
changes, and a developer-facing API provisioning, documentation and analytics system.
This isn’t vaporware.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;To manifest this grand vision, we are officially launching a Kickstarter-esque
campaign. We will only accept money for this financially sustainable, ad-free service
if we hit what I believe is critical mass. I am defining minimum critical mass as
$500,000, which is roughly equivalent to ~10,000 backers.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As can be expected as someone who’s worked on software as both &lt;a href="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-43-metablogapi/7080.Whats_2D00_new_5F00_5440AAB8.png"&gt;an
API client&lt;/a&gt; and &lt;a href="http://dev.live.com"&gt;platform provider of APIs&lt;/a&gt;, I
have a few thoughts on this topic. So let’s start from the beginning. 
&lt;/p&gt;
&lt;h2&gt;The Promise of Twitter Annotations
&lt;/h2&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;p&gt;
About two years ago, Twitter CEO Dick Costolo wrote an expansive &lt;a href="http://blog.twitter.com/2010/05/twitter-platform.html"&gt;“state
of the union” style blog post about the Twitter platform&lt;/a&gt;. Besides describing the
state of the Twitter platform at the time it also set forth the direction the platform
intended to go in and made a set of promises about how Twitter saw its role relative
to its developer ecosystem. Dick wrote 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;To foster this real-time open information platform, we provide a short-format
publish/subscribe network and access points to that network such as www.twitter.com,
m.twitter.com and several Twitter-branded mobile clients for iPhone, BlackBerry, and
Android devices. We also provide a complete API into the functions of the network
so that others may create access points. We manage the integrity and relevance of
the content in the network in the form of the timeline and we will continue to spend
a great deal of time and money fostering user delight and satisfaction. Finally, we
are responsible for the extensibility of the network to enable innovations that range
from Annotations and Geo-Location to headers that can route support tickets for companies.
There are over 100,000 applications leveraging the Twitter API, and &lt;font color="#ff0000"&gt;we
expect that to grow significantly with the expansion of the platform via Annotations
in the coming months&lt;/font&gt;.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
There was a lot of excitement in the industry about Twitter Annotations both from
developers as well as the usual suspects in the tech press like &lt;a title="TechCrunch: An Early Look At Twitter Annotations Or, &amp;quot;Twannotations&amp;quot;" href="http://techcrunch.com/2010/05/08/twitter-annotations/"&gt;TechCrunch&lt;/a&gt; and &lt;a href="http://www.readwriteweb.com/archives/what_twitter_annotations_mean.php"&gt;ReadWriteWeb&lt;/a&gt;.
Blog posts such as &lt;a href="http://www.readwriteweb.com/archives/how_twitter_annotations_could_bring_the_real-time_semantic_web_together.php"&gt;How
Twitter Annotations Could Bring the Real-Time and Semantic Web Together&lt;/a&gt; show how
excited some developers were by the possibilities presented by the technology. For
those who aren’t familiar with the concept, annotations were supposed to be the way
to attach arbitrary metadata to a tweet beyond the well-known 140 characters. Below
is a screenshot from a Twitter presentation showing this concept visually 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://tctechcrunch2011.files.wordpress.com/2010/05/screen-shot-2010-05-08-at-2-33-17-pm.png?w=640" /&gt;
&lt;/p&gt;
&lt;p&gt;
Although it’s been two years since the &lt;a href="http://techcrunch.com/2010/06/02/twitter-annotations-testing/"&gt;Twitter
Annotations was supposed to begin testing&lt;/a&gt; this feature has never been released
nor has it talked about by the Twitter Platform team in recent months. Many believe
that Twitter Annotations will never be released due to a changing of the guard within
Twitter which is hinted at in Dalton Caldwell’s &lt;a href="http://daltoncaldwell.com/what-twitter-could-have-been"&gt;What
Twitter could have been&lt;/a&gt; post 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;As I understand, a hugely divisive internal debate occurred among Twitter employees
around this time. One camp wanted to build the entire business around their realtime
API. In this scenario, Twitter would have turned into something like a realtime cloud
API company. The other camp looked at Google’s advertising model for inspiration,
and decided that building their own version of AdWords would be the right way to go.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;As you likely already know, the advertising group won that battle, and many of
the open API people left the company.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
It is this seeming change in direction that Dalton has seized on to create &lt;a href="https://join.app.net/"&gt;join.app.net&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h2&gt;Why Twitter Annotations was a Difficult Promise to Make
&lt;/h2&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;p&gt;
I have no idea what went on within Twitter but as someone who has built both platforms
and API clients the challenges in delivering a feature such as Twitter Annotations
seem quite obvious to me. A big problem when delivering a platform as part of an end
user facing service is that there are often trade offs one has to make at the expense
of the other. Doing things that make end users happy may end up ticking off people
who’ve built businesses on your platform (e.g. &lt;a href="http://www.seroundtable.com/google-panda-unemployment-14143.html"&gt;layoffs
caused by Google Panda update&lt;/a&gt;, &lt;a href="http://tech.fortune.cnn.com/2012/07/12/facebook-9/"&gt;companies
losing customers overnight after launch of Facebook's timeline&lt;/a&gt;, etc). On the other
hand, doing things that make developers happy can create suboptimal user experiences
such as &lt;a href="http://www.zdnet.com/android-malwares-dirty-secret-repackaging-of-legit-apps-7000000886/"&gt;the
“openness” of Android as a platform making it a haven for mobile malware&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The challenge with Twitter Annotations is that it threw user experience consistency
out of the Window. Imagine that the tweet shown in the image above was created by
Dare’s Awesome Twitter App which allows users to “attach” a TV episode from a source
like Hulu or Netflix into the app before they tweet. Now in Dare’s Awesome Twitter
App, the user sees their tweet an an inline experience where they can consume the
video inline similar to what Twitter calls &lt;a href="http://techcrunch.com/2012/06/13/twitter-expanded-tweets/"&gt;Expanded
Tweets&lt;/a&gt; today. However the user’s friends who are using the Twitter website or
other Twitter apps just see 140 characters. You can imagine that apps would then compete
on how many annotations they supported and creating new interesting annotations. This
is effectively what happened with RSS and a variety of &lt;a href="http://www.feedforall.com/directory-namespace.htm"&gt;RSS
extensions&lt;/a&gt; with no RSS reader supporting the full gamut of extensions. Heck, I
supported more RSS extensions in &lt;a href="http://rssbandit.org/"&gt;RSS Bandit&lt;/a&gt; in
2009 than Google Reader does today. 
&lt;/p&gt;
&lt;p&gt;
This cacophony of Annotations would have meant that not only would there no longer
be such a thing as a consistent Twitter experience but Twitter itself would be on
an eternal treadmill of supporting various annotations as they were introduced into
the ecosystem by various clients and content producers. 
&lt;/p&gt;
&lt;p&gt;
Secondly, the ability to put arbitrary machine readable content in tweets would have
made Twitter an attractive mechanism as a “free” publish-subscribe infrastructure
of all manner of apps and devices. Instead of building a push notification system
to communicate with client apps or devices, an enterprising developer could just create
a special Twitter account and have all the end points connect to that. The notion
of &lt;a href="http://www.wired.com/threatlevel/2009/08/botnet-tweets"&gt;Twitter controlled
botnets&lt;/a&gt; and the rise of &lt;a href="http://mashable.com/2012/06/26/home-devices-connect-to-twitter/"&gt;home
appliances connected to Twitter&lt;/a&gt; are all indicative that there is some demand for
this capability. If this content not intended for humans ever becomes a large chunk
of the data flowing through Twitter, how to monetize it will be extremely challenging.
Charging people for using Twitter in this way isn’t easy since it isn’t clear how
you differentiate a 20,000 machine botnet from a moderately popular Internet celebrity
with a lot of fans who mostly lurk on Twitter. 
&lt;/p&gt;
&lt;p&gt;
I have no idea if Twitter ever plans to ship Annotations but if they do I’d be very
interested to see how they would solve the two problems mentioned above. 
&lt;/p&gt;
&lt;h2&gt;Challenges Facing App.net as a Consumer Service
&lt;/h2&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;p&gt;
Now that we’ve talked about Twitter Annotations, let’s look at what App.net plans
to deliver to address the demand that has yet to be fulfilled by the promise of Twitter
Annotations. From join.app.net we learn the product that is intended to be delivered
is 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;h6&gt;&lt;em&gt;OK, great, but what exactly is this product you will be delivering?&lt;/em&gt;
&lt;/h6&gt;
&lt;p&gt;
&lt;em&gt;As a member, you'll have a new social graph and real-time feed that you access
from an App.net mobile application or website. At first, the user experience will
be very similar to what Twitter was like before it turned into a media company. On
a forward basis, we will focus on expanding our core experience by nurturing a powerful
ecosystem based on 3rd-party developer built &amp;quot;apps&amp;quot;. This is why we think
the name &amp;quot;App.net&amp;quot; is appropriate for this service.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;From a developer perspective, you will be able to read and write to a Twitter-like
API. Developers behaving in good faith will have free reign to build alternate UIs,
new business models of their own, and whatever they can dream up.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;As this project progresses, we will be collaborating with you, our backers, while
sharing and iterating screenshots of the app, API documentation, and more. There are
quite a few technical improvements to existing APIs that we would like to see in the
App.net API. For example, longer message character limits, RSS feeds, and rich annotations
support.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
In short it intends to be a Twitter clone with a more expansive API policy than Twitter.
The key problem facing App.net is that as a social graph based services it will suffer
from the curse of &lt;a href="http://en.wikipedia.org/wiki/Network_effect"&gt;network effects&lt;/a&gt;.
Social apps need to cross a particular threshold of people on the service before they
are useful and once they cross that threshold it often leads to a “winner-take-all”
dynamic where similar sites with smaller users bleed users to the dominant service
since everyone is on the dominant service. This is how Facebook killed &lt;a href="http://www.myspace.com"&gt;MySpace&lt;/a&gt; &amp;amp; &lt;a href="http://www.bebo.com/"&gt;Bebo&lt;/a&gt; and
Twitter killed &lt;a href="http://www.pownce.com/"&gt;Pownce&lt;/a&gt; &amp;amp; &lt;a href="http://en.wikipedia.org/wiki/Jaiku"&gt;Jaiku&lt;/a&gt;.
App.net will need to differentiate itself more than just being “open version of popular
social network”. Services like &lt;a href="http://status.net/"&gt;Status.net&lt;/a&gt; and &lt;a href="https://joindiaspora.com"&gt;Diaspora&lt;/a&gt; have
tried and failed to make a dent with that approach while fresh approaches to the same
old social graph and news feed like &lt;a href="http://www.pinterest.com"&gt;Pinterest&lt;/a&gt; and &lt;a href="http://www.instagram.com"&gt;Instagram&lt;/a&gt; have
grown by leaps and bounds. 
&lt;/p&gt;
&lt;p&gt;
A bigger challenge is the implication that it wants to be a paid social network. As
I mentioned earlier, social graph based services live and die by network effects.
The more people that use them the more useful they get for their members. Charging
money for an online service is an easy way to reduce your target audience by at least
an order of magnitude (i.e. reduce your target audience by at least 90%). As an end
user, I don’t see the value of joining a Twitter-clone populated by people who could
afford $50 a year as opposed to joining a free service like Facebook, Twitter or even
Google+. 
&lt;/p&gt;
&lt;h2&gt;Challenges Facing App.net as a Developer Platform
&lt;/h2&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;p&gt;
As a developer it isn’t clear to me what I’m expected to get out of App.net. The question
on how they came up with their pricing tiers is answered thusly 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Additionally, there are several comps of users being willing to pay roughly this
amount for services that are deeply valuable, trustworthy and dependable. For instance,
Dropbox charges $10 and up per month, Evernote charges $5 and up per month, Github
charges $7 and up per month.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The developer price is inspired by the amount charged by the Apple Developer Program, &lt;/em&gt;&lt;a href="https://developer.apple.com/programs/ios/"&gt;&lt;em&gt;$99&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.
We think this demonstrates that developers are willing to pay for access to a high
quality development platform.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I’ve already mentioned above that network effects are working against App.net as a
popular consumer service. The thought of spending $50 a year to target less users
than I can by building apps on Facebook or Twitter’s platforms doesn’t sound logical
to me. The leaves using App.net as a low cost publish-subscribe mechanism for various
apps or devices I deploy. This is potentially interesting but I’d need to get more
data before I can tell just how interesting it could be. For example, there is a bunch
of talk about claiming your Twitter handle and other things which makes it sound like
developers only get a single account on the service. True developer friendliness for
this type of service would include disclosure on how one could programmatically create
and manage nodes in the social graph (aka accounts in the system). 
&lt;/p&gt;
&lt;p&gt;
At the end of the day although there is a lot of persuasive writing on &lt;a href="https://join.app.net/"&gt;join.app.net&lt;/a&gt;,
there’s just not enough to explain why it will be a platform that will provide me
enough value as a developer for me to part with my hard earned $50. The comparison
to Apple’s developer program is rich though. Apple has given developers &lt;a href="http://techcrunch.com/2012/06/11/apples-app-store-hits-30-billion-downloaded-apps-paid-out-5-billion-to-developers/"&gt;five
billion reasons why paying them $99 a year is worth it&lt;/a&gt;, we haven’t gotten one
good one from App.net. 
&lt;/p&gt;
&lt;p&gt;
That said, I wish Dalton luck on this project. Props to anyone who can pick himself
up and continue to build new things after what he went through with imeem and PicPlz. 
&lt;/p&gt;
&lt;p&gt;
&lt;img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=French+Montana&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;French
Montana&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=French+Montana+Pop+That&amp;amp;x=0&amp;amp;y=0"&gt;Pop
That (featuring Rick Ross, Lil Wayne and Drake)&lt;/a&gt; &lt;img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=2fcfa0f8-1785-4b84-95dd-027fb2d4c340" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,2fcfa0f8-1785-4b84-95dd-027fb2d4c340.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=f8607405-0737-4520-8f9c-59b818f30c2a</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,f8607405-0737-4520-8f9c-59b818f30c2a.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,f8607405-0737-4520-8f9c-59b818f30c2a.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f8607405-0737-4520-8f9c-59b818f30c2a</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Earlier this morning, Jeff Kunins posted the announcement that <a href="http://windowsteamblog.com/windows_live/b/windowslive/archive/2010/10/14/messenger-connect-is-out-of-beta-and-available-worldwide.aspx">Messenger
Connect is out of beta and available worldwide</a>. Key excerpts from his post include 
</p>
        <blockquote>
          <p>
            <em>Today, we are pleased to announce that <b>Messenger Connect is out of beta and
available worldwide</b>. We’ve gotten a great response so far: leading sharing syndicators
ShareThis, AddThis, Gigya, and AddToThis have already made the Windows Live </em>
            <a href="http://msdn.microsoft.com/en-us/windowslive/ff796213.aspx">
              <em>sharing
badge</em>
            </a>
            <em> available on more than 1 million websites (check it out now on </em>
            <a href="http://www.bing.com/search?q=nikon+d90&amp;form=QBRE&amp;qs=AS&amp;sk=AS1&amp;pq=nikon+&amp;sp=2&amp;sc=8-6">
              <em>Bing</em>
            </a>
            <em>). </em>
            <br />
            <em>…</em>
            <br />
            <em>Over 2500 developers gave us great feedback during the beta, helping us to refine
and improve this release of Messenger Connect. Below is a quick summary, but for all
the details check out </em>
            <a href="http://windowsteamblog.com/windows_live/b/developer/archive/2010/10/12/what-is-new-in-the-latest-messenger-connect-release.aspx">
              <em>this
post from Angus on the Windows Live for Developers blog</em>
            </a>
            <em>. Our focus with
the release of Messenger Connect was to make it easier for partners to adopt, without
compromising user privacy.</em>
          </p>
          <p>
            <b>
              <em>
              </em>
            </b>
          </p>
          <ul>
            <li>
              <em>
                <b>Easier to check out </b>–We made it faster and simpler for partners to try
out Messenger Connect and determine if it would be useful for their sites. For example:
you can try out the </em>
              <a href="http://messengerconnectchatcontrol.mslivelabs.com/">
                <em>real
time chat control</em>
              </a>
              <em> without needing to write any code. </em>
              <br />
              <a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-53-82-metablogapi/6305.devlivecom_5F00_653D6D80.png">
                <em>
                  <img title="Learn at the Windows Live Developer Center" border="0" alt="Learn at the Windows Live Developer Center" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-53-82-metablogapi/7128.devlivecom_5F00_thumb_5F00_27CD08F9.png" width="530" height="531" />
                </em>
              </a>
            </li>
            <li>
              <em>
                <b>Easier to adopt and integrate– </b>We<b></b>reduced the effort needed for
sites to implement Messenger Connect usefully and powerfully by providing new tools
and sample code for </em>
              <a href="http://messengerconnectactivities.mslivelabs.com">
                <em>ActivityStrea.ms
template selectors</em>
              </a>
              <em> and more. 
<br /></em>
              <a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-53-82-metablogapi/0714.clip_5F00_image006_5F00_128EDD84.jpg">
                <em>
                  <img title="Sample code" border="0" alt="Sample code" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-53-82-metablogapi/4035.clip_5F00_image006_5F00_thumb_5F00_70C304F2.jpg" width="530" height="346" />
                </em>
              </a>
            </li>
          </ul>
        </blockquote>
        <p>
A number of folks worked really hard behind the scenes to get us to this point and
I’m glad to see what we’ve shipped today. I haven’t announced this on my blog yet
but I recently took over as the Lead Program Manager responsible for our Messenger
Connect and related platform efforts in Windows Live. If you’ve been a regular reader
of my blog it shouldn’t be a surprise that I’ve decided to make working on building
open web platforms my day job and not just a hobby I was interested in. 
</p>
        <p>
As Angus Logan says in his <a title="Windows Live for Developers Blog: What is new in the latest Messenger Connect release" href="http://windowsteamblog.com/windows_live/b/developer/archive/2010/10/12/what-is-new-in-the-latest-messenger-connect-release.aspx">follow
up blog post on the Windows Live for Developers blog</a>; this is just the beginning.
We’d love to get feedback from the community of developers on what we’ve released
and the feedback we’ve gotten thus far has been immensely helpful. You can find us
at <a href="http://dev.live.com/forums">http://dev.live.com/forums</a></p>
        <p>
PS: Since someone asked on Twitter, you can find out more about Messenger Connect
by reading <a href="http://msdn.microsoft.com/en-us/library/ff749031.aspx">What is
Messenger Connect?</a></p>
        <p>
          <img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Waka+Flocka+Flame&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Waka
Flocka Flame</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Waka+Flocka+Flame+No+Hands&amp;x=0&amp;y=0">No
Hands (featuring Roscoe Dash and Wale)</a><img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=f8607405-0737-4520-8f9c-59b818f30c2a" />
      </body>
      <title>On Messenger Connect being out of beta and my new gig</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,f8607405-0737-4520-8f9c-59b818f30c2a.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2010/10/14/OnMessengerConnectBeingOutOfBetaAndMyNewGig.aspx</link>
      <pubDate>Thu, 14 Oct 2010 17:13:43 GMT</pubDate>
      <description>&lt;p&gt;
Earlier this morning, Jeff Kunins posted the announcement that &lt;a href="http://windowsteamblog.com/windows_live/b/windowslive/archive/2010/10/14/messenger-connect-is-out-of-beta-and-available-worldwide.aspx"&gt;Messenger
Connect is out of beta and available worldwide&lt;/a&gt;. Key excerpts from his post include 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Today, we are pleased to announce that &lt;b&gt;Messenger Connect is out of beta and
available worldwide&lt;/b&gt;. We’ve gotten a great response so far: leading sharing syndicators
ShareThis, AddThis, Gigya, and AddToThis have already made the Windows Live &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/windowslive/ff796213.aspx"&gt;&lt;em&gt;sharing
badge&lt;/em&gt;&lt;/a&gt;&lt;em&gt; available on more than 1 million websites (check it out now on &lt;/em&gt;&lt;a href="http://www.bing.com/search?q=nikon+d90&amp;amp;form=QBRE&amp;amp;qs=AS&amp;amp;sk=AS1&amp;amp;pq=nikon+&amp;amp;sp=2&amp;amp;sc=8-6"&gt;&lt;em&gt;Bing&lt;/em&gt;&lt;/a&gt;&lt;em&gt;). &lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;…&lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;Over 2500 developers gave us great feedback during the beta, helping us to refine
and improve this release of Messenger Connect. Below is a quick summary, but for all
the details check out &lt;/em&gt;&lt;a href="http://windowsteamblog.com/windows_live/b/developer/archive/2010/10/12/what-is-new-in-the-latest-messenger-connect-release.aspx"&gt;&lt;em&gt;this
post from Angus on the Windows Live for Developers blog&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Our focus with
the release of Messenger Connect was to make it easier for partners to adopt, without
compromising user privacy.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;em&gt;&lt;/em&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;b&gt;Easier to check out &lt;/b&gt;–We made it faster and simpler for partners to try
out Messenger Connect and determine if it would be useful for their sites. For example:
you can try out the &lt;/em&gt;&lt;a href="http://messengerconnectchatcontrol.mslivelabs.com/"&gt;&lt;em&gt;real
time chat control&lt;/em&gt;&lt;/a&gt;&lt;em&gt; without needing to write any code. &lt;/em&gt; 
&lt;br /&gt;
&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-53-82-metablogapi/6305.devlivecom_5F00_653D6D80.png"&gt;&lt;em&gt;&lt;img title="Learn at the Windows Live Developer Center" border="0" alt="Learn at the Windows Live Developer Center" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-53-82-metablogapi/7128.devlivecom_5F00_thumb_5F00_27CD08F9.png" width="530" height="531" /&gt;&lt;/em&gt;&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;b&gt;Easier to adopt and integrate– &lt;/b&gt;We&lt;b&gt; &lt;/b&gt;reduced the effort needed for
sites to implement Messenger Connect usefully and powerfully by providing new tools
and sample code for &lt;/em&gt;&lt;a href="http://messengerconnectactivities.mslivelabs.com"&gt;&lt;em&gt;ActivityStrea.ms
template selectors&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and more. 
&lt;br /&gt;
&lt;/em&gt;&lt;a href="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-53-82-metablogapi/0714.clip_5F00_image006_5F00_128EDD84.jpg"&gt;&lt;em&gt;&lt;img title="Sample code" border="0" alt="Sample code" src="http://windowsteamblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-53-82-metablogapi/4035.clip_5F00_image006_5F00_thumb_5F00_70C304F2.jpg" width="530" height="346" /&gt;&lt;/em&gt;&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
A number of folks worked really hard behind the scenes to get us to this point and
I’m glad to see what we’ve shipped today. I haven’t announced this on my blog yet
but I recently took over as the Lead Program Manager responsible for our Messenger
Connect and related platform efforts in Windows Live. If you’ve been a regular reader
of my blog it shouldn’t be a surprise that I’ve decided to make working on building
open web platforms my day job and not just a hobby I was interested in. 
&lt;/p&gt;
&lt;p&gt;
As Angus Logan says in his &lt;a title="Windows Live for Developers Blog: What is new in the latest Messenger Connect release" href="http://windowsteamblog.com/windows_live/b/developer/archive/2010/10/12/what-is-new-in-the-latest-messenger-connect-release.aspx"&gt;follow
up blog post on the Windows Live for Developers blog&lt;/a&gt;; this is just the beginning.
We’d love to get feedback from the community of developers on what we’ve released
and the feedback we’ve gotten thus far has been immensely helpful. You can find us
at &lt;a href="http://dev.live.com/forums"&gt;http://dev.live.com/forums&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
PS: Since someone asked on Twitter, you can find out more about Messenger Connect
by reading &lt;a href="http://msdn.microsoft.com/en-us/library/ff749031.aspx"&gt;What is
Messenger Connect?&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Waka+Flocka+Flame&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Waka
Flocka Flame&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Waka+Flocka+Flame+No+Hands&amp;amp;x=0&amp;amp;y=0"&gt;No
Hands (featuring Roscoe Dash and Wale)&lt;/a&gt; &lt;img title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=f8607405-0737-4520-8f9c-59b818f30c2a" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,f8607405-0737-4520-8f9c-59b818f30c2a.aspx</comments>
      <category>Platforms</category>
      <category>Windows Live</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=764c2146-c259-4eaa-a980-86ddcba5d1dc</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,764c2146-c259-4eaa-a980-86ddcba5d1dc.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,764c2146-c259-4eaa-a980-86ddcba5d1dc.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=764c2146-c259-4eaa-a980-86ddcba5d1dc</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Earlier this morning, Ori Amiga posted <a href="http://windowsteamblog.com/blogs/windowslive/archive/2010/04/29/messenger-across-the-web.aspx">Messenger
across the Web</a> on the Inside Windows Live blog. Key excerpts from his blog post
include 
</p>
        <blockquote>
          <p>
            <em>Earlier today, John Richards and </em>
            <a href="http://www.anguslogan.com/">
              <em>Angus
Logan</em>
            </a>
            <em> took the stage at The </em>
            <a href="http://thenextweb.com/conference/">
              <em>Next
Web Conference in Amsterdam</em>
            </a>
            <em> where they announced Messenger Connect –
a new way for partners and developers to connect with Messenger. Messenger Connect
allows web, Windows and mobile app developers to create compelling social experiences
on their websites and apps by providing them with social promotion and distribution
via Messenger.</em>
          </p>
          <em>… </em>
          <h3>
            <em>Messenger Connect</em>
          </h3>
          <p>
            <em>Messenger Connect brings the individual APIs we’ve had for a long time (Windows
Live ID, Contacts API, </em>
            <a href="http://msdn.microsoft.com/en-us/library/dd570035.aspx">
              <em>Messenger
Web Toolkit</em>
            </a>
            <em>, etc.) together in a single API that's based on industry
standards and specifications (</em>
            <a href="http://wiki.oauth.net/OAuth-WRAP">
              <em>OAuth
WRAP</em>
            </a>
            <em>, </em>
            <a href="http://ActivityStrea.ms">
              <em>ActivityStrea.ms</em>
            </a>
            <em>, </em>
            <a href="http://www.portablecontacts.net">
              <em>PortableContacts</em>
            </a>
            <em>)
and adds a number of new scenarios. </em>
          </p>
          <p>
            <em>The new Messenger Connect provides our developer partners with three big things: </em>
          </p>
          <ul>
            <li>
              <em>
                <u>Instantly create a user profile and social graph:</u>
                <strong>
                </strong>Messenger
user profile and social graph information allows our shared customers to easily sign-in
and access their friends list and profile information. This allows our partners to
more rapidly personalize their experiences, provides a ready-made social graph for
customers to interact with, and provides a channel to easily invite additional friends
to join in. </em>
            </li>
            <li>
              <em>
                <u>Drive engagement directly through chat indirectly through social distribution:</u> By
enabling both real-time instant messaging conversations (chat) and feed-based sharing
options for customers on their site, developers can drive additional engagement and
usage of their experiences by connecting to the over 320 million Messenger customers
worldwide. </em>
            </li>
            <li>
              <em>
                <u>Designing for easy integration in your technical environment:</u> We are delivering
an API service that will expose a RESTful interface, and we’ll wrap those in a range
of libraries (including JavaScript, .NET, and others). Websites and apps will be able
to choose the right integration type for their specific scenario. Some websites prefer
to keep everything at the presentation tier, and use JavaScript libraries when the
user is present. Others may prefer to do server-side integration, so they can call
the RESTful endpoints from back-end processes. We're aiming to provide the same set
of capabilities across the API service and the libraries that we offer.</em>
            </li>
          </ul>
        </blockquote>
        <p>
I’m really proud of the work that’s gone into building Messenger Connect. Although
I was in some of the early discussions around it, I ducked out early to focus on the
platform behind <a href="http://public.bay.livefilestore.com/y1p8-3NXZ5cmIMOkWe2cej88un_XE5zP4vNs6KOiKDb-PUnaupAT1IYI1CZ62FdpGtqE0LbPbzpCHy9-4aIFRiSPw/MainMessengerWindow.png">the
new social view in Messenger</a> and didn’t have much insight into the day to day
of building the product. However I’ve got to say I love the way the project has turned
out. I suspect a lot of web developers will as well. 
</p>
        <p>
Kudos to Ori and the rest of the team. 
</p>
        <p>
          <img style="vertical-align: middle" title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Ludacris&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Ludacris</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Ludacris+My+Chick+Bad&amp;x=0&amp;y=0">My
Chick Bad (featuring Nicki Minaj)</a><img style="vertical-align: middle" title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=764c2146-c259-4eaa-a980-86ddcba5d1dc" />
      </body>
      <title>Messenger Connect announced</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,764c2146-c259-4eaa-a980-86ddcba5d1dc.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2010/04/29/MessengerConnectAnnounced.aspx</link>
      <pubDate>Thu, 29 Apr 2010 12:45:24 GMT</pubDate>
      <description>&lt;p&gt;
Earlier this morning, Ori Amiga posted &lt;a href="http://windowsteamblog.com/blogs/windowslive/archive/2010/04/29/messenger-across-the-web.aspx"&gt;Messenger
across the Web&lt;/a&gt; on the Inside Windows Live blog. Key excerpts from his blog post
include 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Earlier today, John Richards and &lt;/em&gt;&lt;a href="http://www.anguslogan.com/"&gt;&lt;em&gt;Angus
Logan&lt;/em&gt;&lt;/a&gt;&lt;em&gt; took the stage at The &lt;/em&gt;&lt;a href="http://thenextweb.com/conference/"&gt;&lt;em&gt;Next
Web Conference in Amsterdam&lt;/em&gt;&lt;/a&gt;&lt;em&gt; where they announced Messenger Connect –
a new way for partners and developers to connect with Messenger. Messenger Connect
allows web, Windows and mobile app developers to create compelling social experiences
on their websites and apps by providing them with social promotion and distribution
via Messenger.&lt;/em&gt;
&lt;/p&gt;
&lt;em&gt;… &lt;/em&gt; 
&lt;h3&gt;&lt;em&gt;Messenger Connect&gt;&lt;/em&gt;
&lt;/h3&gt;
&lt;p&gt;
&lt;em&gt;Messenger Connect brings the individual APIs we’ve had for a long time (Windows
Live ID, Contacts API, &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd570035.aspx"&gt;&lt;em&gt;Messenger
Web Toolkit&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, etc.) together in a single API that's based on industry
standards and specifications (&lt;/em&gt;&lt;a href="http://wiki.oauth.net/OAuth-WRAP"&gt;&lt;em&gt;OAuth
WRAP&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href="http://ActivityStrea.ms"&gt;&lt;em&gt;ActivityStrea.ms&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href="http://www.portablecontacts.net"&gt;&lt;em&gt;PortableContacts&lt;/em&gt;&lt;/a&gt;&lt;em&gt;)
and adds a number of new scenarios. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The new Messenger Connect provides our developer partners with three big things: &lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;u&gt;Instantly create a user profile and social graph:&lt;/u&gt;&lt;strong&gt; &lt;/strong&gt;Messenger
user profile and social graph information allows our shared customers to easily sign-in
and access their friends list and profile information. This allows our partners to
more rapidly personalize their experiences, provides a ready-made social graph for
customers to interact with, and provides a channel to easily invite additional friends
to join in. &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;u&gt;Drive engagement directly through chat indirectly through social distribution:&lt;/u&gt; By
enabling both real-time instant messaging conversations (chat) and feed-based sharing
options for customers on their site, developers can drive additional engagement and
usage of their experiences by connecting to the over 320 million Messenger customers
worldwide. &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;u&gt;Designing for easy integration in your technical environment:&lt;/u&gt; We are delivering
an API service that will expose a RESTful interface, and we’ll wrap those in a range
of libraries (including JavaScript, .NET, and others). Websites and apps will be able
to choose the right integration type for their specific scenario. Some websites prefer
to keep everything at the presentation tier, and use JavaScript libraries when the
user is present. Others may prefer to do server-side integration, so they can call
the RESTful endpoints from back-end processes. We're aiming to provide the same set
of capabilities across the API service and the libraries that we offer.&lt;/em&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I’m really proud of the work that’s gone into building Messenger Connect. Although
I was in some of the early discussions around it, I ducked out early to focus on the
platform behind &lt;a href="http://public.bay.livefilestore.com/y1p8-3NXZ5cmIMOkWe2cej88un_XE5zP4vNs6KOiKDb-PUnaupAT1IYI1CZ62FdpGtqE0LbPbzpCHy9-4aIFRiSPw/MainMessengerWindow.png"&gt;the
new social view in Messenger&lt;/a&gt; and didn’t have much insight into the day to day
of building the product. However I’ve got to say I love the way the project has turned
out. I suspect a lot of web developers will as well. 
&lt;/p&gt;
&lt;p&gt;
Kudos to Ori and the rest of the team. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Ludacris&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Ludacris&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Ludacris+My+Chick+Bad&amp;amp;x=0&amp;amp;y=0"&gt;My
Chick Bad (featuring Nicki Minaj)&lt;/a&gt; &lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=764c2146-c259-4eaa-a980-86ddcba5d1dc" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,764c2146-c259-4eaa-a980-86ddcba5d1dc.aspx</comments>
      <category>Platforms</category>
      <category>Windows Live</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=a7dabc88-96a2-46f1-b1d7-91de7528389a</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,a7dabc88-96a2-46f1-b1d7-91de7528389a.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,a7dabc88-96a2-46f1-b1d7-91de7528389a.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=a7dabc88-96a2-46f1-b1d7-91de7528389a</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In a move that was telegraphed by Fred Wilson’s (Twitter investor) post titled <a href="http://www.avc.com/a_vc/2010/04/the-twitter-platform.html">The
Twitter Platform's Inflection Point</a> where he criticized Twitter platform developers
for “filling holes” in Twitter’s user experience, the Twitter team have indicated
they will start providing official Twitter clients for various mobile platforms. There
have been announcements of <a href="http://mobile.blog.twitter.com/2010/04/official-twitter-for-blackberry-app-now.html">an
official Blackberry client</a> and the purchase of Tweetie so it can become the official
iPhone client. The latter was announced in the blog post <a href="http://blog.twitter.com/2010/04/twitter-for-iphone.html">Twitter
for iPhone</a> excerpted below
</p>
        <blockquote>
          <p>
            <em>Careful analysis of the Twitter user experience in the iTunes AppStore revealed
massive room for improvement. People are looking for an app from Twitter, and they're
not finding one. So, they get confused and give up. It's important that we optimize
for user benefit and create an awesome experience.</em>
          </p>
          <p>
            <em>We're thrilled to announce that we've entered into an agreement with Atebits (aka
Loren Brichter) to acquire Tweetie, a leading iPhone Twitter client.</em>
          </p>
        </blockquote>
        <p>
This has led to some anger on the part of Twitter client developers with some of the
more colorful reactions being the creation of the <a href="http://spaz.spreadshirt.com/twitter-destroyed-my-market-segment-A5890895/customize/color/1">Twitter
Destroyed My Market Segment</a> T-shirt and a <a href="http://blogs.sfweekly.com/thesnitch/2010/04/twitter_now_filling_its_own_ho.php">somewhat
off-color image</a> that is making the rounds as representative of what Twitter means
by “filling holes”. 
</p>
        <p>
As an end user and someone who works on web platforms, none of this is really surprising.
Geeks consider having to wade through half a dozen Twitter clients before finding
one that works for them a feature even though <a href="http://en.wikipedia.org/wiki/The_Paradox_of_Choice">paradox
of choice</a> means that most people are actually happier with less choices not more.
This is made worse by the fact that in the mobile world, this may mean paying for
multiple apps until you find one that you’re happy with. 
</p>
        <p>
Any web company that cares about their customers will want to ensure that their experience
is as simple and as pleasant as possible. Trusting your primary mobile experience
to the generosity and talents of 3rd party developers means you are not responsible
for the primary way many people will access your service. This loss of control isn’t
great especially when the design direction you want to take your service in may not
line up with what developers are doing in their apps. Then there’s the fact that forcing
your users to make purchasing decisions before they can use your site conveniently
on their phone isn’t a great first time experience either.  
</p>
        <p>
I expect mobile clients are just the beginning. There are lots of flaws in the Twitter
user experience that are due to Twitter’s reliance on “hole fillers” that I expect
they’ll start to fill. The fact that I ever have to go to <a href="http://bit.ly">http://bit.ly</a> as
part of my Twitter workflow is a bug. URL shorteners really have no reason to exist
in the majority of use cases except when Twitter is sending an SMS message. Sites
that exist simply as image hosting services for Twitter like <a href="http://twitpic.com">Twitpic</a> and <a href="http://yfrog.com">YFrog</a> also
seem extremely superflous especially when you consider that since only power users
know about them not every Twitter user is figuring out how to use the service for
image sharing. I expect this will eventually become a native feature of Twitter as
well. Once Twitter controls the primary mobile clients for accessing their service,
it’ll actually be easier for them to make these changes since they don’t have to worry
about whether 3rd party apps will support Twitter image hosting vs. Twitpic versus
rolling their own ghetto solution. 
</p>
        <p>
The situation is made particularly tough for 3rd party developers due to Twitter’s
lack of a business model as Chris Dixon points out in his post <a href="http://cdixon.org/2010/04/10/twitter-and-3rd-party-developers/">Twitter
and third-party Twitter developers</a></p>
        <blockquote>
          <p>
            <em>Normally, when third parties try to predict whether their products will be subsumed
by a platform, the question boils down to whether their products will be strategic
to the platform. When the platform has an established business model, this analysis
is fairly straightforward (for example, </em>
            <a href="http://cdixon.org/2009/12/30/whats-strategic-for-google/">
              <em>here</em>
            </a>
            <em> is
my strategic analysis of Google’s platform).  If you make games for the iPhone,
you are pretty certain Apple will take their 30% cut and leave you alone. Similarly,
if you are a content website relying on SEO and Google Adsense you can be pretty confident
Google will leave you alone. Until Twitter has a successful business model, they can’t
have a consistent strategy and third parties should expect erratic behavior and even
complete and sudden shifts in strategy.</em>
          </p>
          <p>
            <em>So what might Twitter’s business model eventually be?  I expect that Twitter
search will monetize poorly because most searches on Twitter don’t have </em>
            <a href="http://cdixon.org/2009/09/27/online-advertising-is-all-about-purchasing-intent/">
              <em>purchasing
intent</em>
            </a>
            <em>.  Twitter’s move into mobile clients and </em>
            <a href="http://www.businessinsider.com/twitter-previews-the-redesign-that-will-make-you-not-want-to-use-a-desktop-client-2010-4">
              <em>hints</em>
            </a>
            <em> about
a more engaging website suggest they may be trying to mimic Facebook’s display ad
model.</em>
          </p>
        </blockquote>
        <p>
The hard question then is what opportunities will be left for developers on Twitter’s
platform once the low hanging fruit has been picked by the company. Here I agree with
frequent comments by Dave Winer and Robert Scoble, that there needs to be more metadata
attached to tweets so that different data aggregation and search scenarios can be
built which satisfy thousands of niches. I especially like what Dave Winer wrote in
his post <a href="http://www.scripting.com/stories/2010/04/09/howTwitterCanKillTheTwitte.html">How
Twitter can kill the Twitter-killers</a> where he stated
</p>
        <blockquote>
          <p>
            <em>Suppose Twitter wants to make their offering much more competitive and at the
same time much more attractive to developers. Sure, as </em>
            <a href="http://www.avc.com/a_vc/2010/04/the-twitter-platform.html">
              <em>Fred
Wilson telegraphed</em>
            </a>
            <em>, some developers are going to get rolled over, esp
those who camped out on the natural evolutionary path of the platform vendor. But
there are lots of things Twitter Corp can do to create more opportunities for developers,
ones that expand the scope of the platform and make it possible for a thousand flowers
to bloom, a thousand valuable non-trivial flowers. </em>
            <a href="http://www.scripting.com/stories/2010/04/09/#p4">
              <em>
                <img border="0" alt="Permalink to this paragraph" src="http://www.scripting.com/images/2001/09/20/sharpPermaLink3.gif" width="6" height="9" />
              </em>
            </a>
          </p>
          <p>
            <a name="p5">
            </a>
            <em>The largest single thing Twitter could do is open tweet-level
metadata. If I want to write an app for dogs who tweet, let me add a "field"
to a tweet called isDog, a boolean, that tells me that the author of the tweet is
a dog. That way the dog food company who has a Twitter presence can learn that the
tweet is from a dog, from the guy who's developing a special Twitter client just for
dogs, even though Twitter itself has no knowledge of the special needs of dogs. We
can also add a field for breed and age (in dog years of course). Coat type. Toy preference.
A link to his or her owner. Are there children in the household?</em>
          </p>
        </blockquote>
        <p>
I probably wouldn’t have used the tweeting dog example but the idea is sound. Location
is an example of metadata that is added to tweets which can be used for interesting
applications on top of the core news feed experience as shown by <a href="http://beta.twittervision.com/">Twittervision</a> and <a href="http://www.bing.com/twitter/maps">Bing's
Twitter Maps</a>. I think there’s an opportunity to build interesting things in this
space especially if developers can invent new types of metadata without relying on
Twitter to first bless new fields like they’ve had to do with location (although their
current implementation is still inadequate in my opinion). 
</p>
        <p>
Over the next few months, Twitter will likely continue to encroach on territory which
was once assumed to belong to 3rd party developers. The question is whether Twitter
will replace these opportunities they’ve taken away with new opportunities or instead
if they’ve simply used developers as a means to an end and now they are no longer
useful?
</p>
        <p>
          <img style="vertical-align: middle" title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Notorious+BIG&amp;field-title=Stolen&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Notorious
B.I.G.</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Notorious+BIG+One+More+Chance&amp;x=0&amp;y=0">One
More Chance</a><img style="vertical-align: middle" title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=a7dabc88-96a2-46f1-b1d7-91de7528389a" />
      </body>
      <title>Twitter Slaps Developers in the Face and How They Can Fix It</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,a7dabc88-96a2-46f1-b1d7-91de7528389a.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2010/04/10/TwitterSlapsDevelopersInTheFaceAndHowTheyCanFixIt.aspx</link>
      <pubDate>Sat, 10 Apr 2010 15:36:05 GMT</pubDate>
      <description>&lt;p&gt;
In a move that was telegraphed by Fred Wilson’s (Twitter investor) post titled &lt;a href="http://www.avc.com/a_vc/2010/04/the-twitter-platform.html"&gt;The
Twitter Platform's Inflection Point&lt;/a&gt; where he criticized Twitter platform developers
for “filling holes” in Twitter’s user experience, the Twitter team have indicated
they will start providing official Twitter clients for various mobile platforms. There
have been announcements of &lt;a href="http://mobile.blog.twitter.com/2010/04/official-twitter-for-blackberry-app-now.html"&gt;an
official Blackberry client&lt;/a&gt; and the purchase of Tweetie so it can become the official
iPhone client. The latter was announced in the blog post &lt;a href="http://blog.twitter.com/2010/04/twitter-for-iphone.html"&gt;Twitter
for iPhone&lt;/a&gt; excerpted below
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Careful analysis of the Twitter user experience in the iTunes AppStore revealed
massive room for improvement. People are looking for an app from Twitter, and they're
not finding one. So, they get confused and give up. It's important that we optimize
for user benefit and create an awesome experience.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;We're thrilled to announce that we've entered into an agreement with Atebits (aka
Loren Brichter) to acquire Tweetie, a leading iPhone Twitter client.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This has led to some anger on the part of Twitter client developers with some of the
more colorful reactions being the creation of the &lt;a href="http://spaz.spreadshirt.com/twitter-destroyed-my-market-segment-A5890895/customize/color/1"&gt;Twitter
Destroyed My Market Segment&lt;/a&gt; T-shirt and a &lt;a href="http://blogs.sfweekly.com/thesnitch/2010/04/twitter_now_filling_its_own_ho.php"&gt;somewhat
off-color image&lt;/a&gt; that is making the rounds as representative of what Twitter means
by “filling holes”. 
&lt;/p&gt;
&lt;p&gt;
As an end user and someone who works on web platforms, none of this is really surprising.
Geeks consider having to wade through half a dozen Twitter clients before finding
one that works for them a feature even though &lt;a href="http://en.wikipedia.org/wiki/The_Paradox_of_Choice"&gt;paradox
of choice&lt;/a&gt; means that most people are actually happier with less choices not more.
This is made worse by the fact that in the mobile world, this may mean paying for
multiple apps until you find one that you’re happy with. 
&lt;/p&gt;
&lt;p&gt;
Any web company that cares about their customers will want to ensure that their experience
is as simple and as pleasant as possible. Trusting your primary mobile experience
to the generosity and talents of 3rd party developers means you are not responsible
for the primary way many people will access your service. This loss of control isn’t
great especially when the design direction you want to take your service in may not
line up with what developers are doing in their apps. Then there’s the fact that forcing
your users to make purchasing decisions before they can use your site conveniently
on their phone isn’t a great first time experience either.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
I expect mobile clients are just the beginning. There are lots of flaws in the Twitter
user experience that are due to Twitter’s reliance on “hole fillers” that I expect
they’ll start to fill. The fact that I ever have to go to &lt;a href="http://bit.ly"&gt;http://bit.ly&lt;/a&gt; as
part of my Twitter workflow is a bug. URL shorteners really have no reason to exist
in the majority of use cases except when Twitter is sending an SMS message. Sites
that exist simply as image hosting services for Twitter like &lt;a href="http://twitpic.com"&gt;Twitpic&lt;/a&gt; and &lt;a href="http://yfrog.com"&gt;YFrog&lt;/a&gt; also
seem extremely superflous especially when you consider that since only power users
know about them not every Twitter user is figuring out how to use the service for
image sharing. I expect this will eventually become a native feature of Twitter as
well. Once Twitter controls the primary mobile clients for accessing their service,
it’ll actually be easier for them to make these changes since they don’t have to worry
about whether 3rd party apps will support Twitter image hosting vs. Twitpic versus
rolling their own ghetto solution. 
&lt;/p&gt;
&lt;p&gt;
The situation is made particularly tough for 3rd party developers due to Twitter’s
lack of a business model as Chris Dixon points out in his post &lt;a href="http://cdixon.org/2010/04/10/twitter-and-3rd-party-developers/"&gt;Twitter
and third-party Twitter developers&lt;/a&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Normally, when third parties try to predict whether their products will be subsumed
by a platform, the question boils down to whether their products will be strategic
to the platform. When the platform has an established business model, this analysis
is fairly straightforward (for example, &lt;/em&gt;&lt;a href="http://cdixon.org/2009/12/30/whats-strategic-for-google/"&gt;&lt;em&gt;here&lt;/em&gt;&lt;/a&gt;&lt;em&gt; is
my strategic analysis of Google’s platform).&amp;#160; If you make games for the iPhone,
you are pretty certain Apple will take their 30% cut and leave you alone. Similarly,
if you are a content website relying on SEO and Google Adsense you can be pretty confident
Google will leave you alone. Until Twitter has a successful business model, they can’t
have a consistent strategy and third parties should expect erratic behavior and even
complete and sudden shifts in strategy.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;So what might Twitter’s business model eventually be?&amp;#160; I expect that Twitter
search will monetize poorly because most searches on Twitter don’t have &lt;/em&gt;&lt;a href="http://cdixon.org/2009/09/27/online-advertising-is-all-about-purchasing-intent/"&gt;&lt;em&gt;purchasing
intent&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&amp;#160; Twitter’s move into mobile clients and &lt;/em&gt;&lt;a href="http://www.businessinsider.com/twitter-previews-the-redesign-that-will-make-you-not-want-to-use-a-desktop-client-2010-4"&gt;&lt;em&gt;hints&lt;/em&gt;&lt;/a&gt;&lt;em&gt; about
a more engaging website suggest they may be trying to mimic Facebook’s display ad
model.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The hard question then is what opportunities will be left for developers on Twitter’s
platform once the low hanging fruit has been picked by the company. Here I agree with
frequent comments by Dave Winer and Robert Scoble, that there needs to be more metadata
attached to tweets so that different data aggregation and search scenarios can be
built which satisfy thousands of niches. I especially like what Dave Winer wrote in
his post &lt;a href="http://www.scripting.com/stories/2010/04/09/howTwitterCanKillTheTwitte.html"&gt;How
Twitter can kill the Twitter-killers&lt;/a&gt; where he stated
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Suppose Twitter wants to make their offering much more competitive and at the
same time much more attractive to developers. Sure, as &lt;/em&gt;&lt;a href="http://www.avc.com/a_vc/2010/04/the-twitter-platform.html"&gt;&lt;em&gt;Fred
Wilson telegraphed&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, some developers are going to get rolled over, esp
those who camped out on the natural evolutionary path of the platform vendor. But
there are lots of things Twitter Corp can do to create more opportunities for developers,
ones that expand the scope of the platform and make it possible for a thousand flowers
to bloom, a thousand valuable non-trivial flowers. &lt;/em&gt;&lt;a href="http://www.scripting.com/stories/2010/04/09/#p4"&gt;&lt;em&gt;&lt;img border="0" alt="Permalink to this paragraph" src="http://www.scripting.com/images/2001/09/20/sharpPermaLink3.gif" width="6" height="9" /&gt;&lt;/em&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a name="p5"&gt;&lt;/a&gt;&lt;em&gt;The largest single thing Twitter could do is open tweet-level
metadata. If I want to write an app for dogs who tweet, let me add a &amp;quot;field&amp;quot;
to a tweet called isDog, a boolean, that tells me that the author of the tweet is
a dog. That way the dog food company who has a Twitter presence can learn that the
tweet is from a dog, from the guy who's developing a special Twitter client just for
dogs, even though Twitter itself has no knowledge of the special needs of dogs. We
can also add a field for breed and age (in dog years of course). Coat type. Toy preference.
A link to his or her owner. Are there children in the household?&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I probably wouldn’t have used the tweeting dog example but the idea is sound. Location
is an example of metadata that is added to tweets which can be used for interesting
applications on top of the core news feed experience as shown by &lt;a href="http://beta.twittervision.com/"&gt;Twittervision&lt;/a&gt; and &lt;a href="http://www.bing.com/twitter/maps"&gt;Bing's
Twitter Maps&lt;/a&gt;. I think there’s an opportunity to build interesting things in this
space especially if developers can invent new types of metadata without relying on
Twitter to first bless new fields like they’ve had to do with location (although their
current implementation is still inadequate in my opinion). 
&lt;/p&gt;
&lt;p&gt;
Over the next few months, Twitter will likely continue to encroach on territory which
was once assumed to belong to 3rd party developers. The question is whether Twitter
will replace these opportunities they’ve taken away with new opportunities or instead
if they’ve simply used developers as a means to an end and now they are no longer
useful?
&lt;/p&gt;
&lt;p&gt;
&lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Notorious+BIG&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Notorious
B.I.G.&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Notorious+BIG+One+More+Chance&amp;amp;x=0&amp;amp;y=0"&gt;One
More Chance&lt;/a&gt; &lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://www.25hoursaday.com/weblog/images/music_note.gif" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=a7dabc88-96a2-46f1-b1d7-91de7528389a" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,a7dabc88-96a2-46f1-b1d7-91de7528389a.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=b00b3839-d8d6-4669-ba1c-06debd6baf84</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,b00b3839-d8d6-4669-ba1c-06debd6baf84.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,b00b3839-d8d6-4669-ba1c-06debd6baf84.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b00b3839-d8d6-4669-ba1c-06debd6baf84</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I initially planned to write up some detailed thoughts on the <a href="http://www.youtube.com/watch?v=v_UyVmITiYQ">Google
Wave video</a> and the <a href="http://www.waveprotocol.org/">Google Wave Federation
protocol</a>. However the combination of the fact that literally millions of people
have watched the video [according to YouTube] and I’ve had enough private conversations
with others that have influenced my thinking that I’d rather not post something that
makes it seem like I’m taking credit for the ideas of others. That said, I thought
it would still be useful to share some of the most insightful commentary I’ve seen
on Google Wave from various developer blogs. 
</p>
        <p>
Sam Ruby writes in his post <a href="http://intertwingly.net/blog/2009/05/31/Google-Wave">Google
Wave</a> 
</p>
        <blockquote>
          <p>
            <em>At one level, </em>
            <a href="http://wave.google.com/">
              <em>Google Wave</em>
            </a>
            <em> is
clearly a </em>
            <a href="http://agylen.com/2009/05/28/bullshit-graphs/">
              <em>bold statement</em>
            </a>
            <em> that
“this is the type of application that every browser should be able to run natively
without needing to resort to a plugin”.  At to give Google credit, they have
been working relentlessly towards that vision, addressing everything from </em>
            <a href="http://www.eweek.com/c/a/Search-Engines/Google-Chromes-JavaScript-is-Powered-with-a-V8-Engine/3/">
              <em>garbage
collection issues</em>
            </a>
            <em>, to </em>
            <a href="http://www.andrejkoelewijn.com/wp/2009/05/30/google-wave-killer-app-for-html-5/">
              <em>enabling
drag and drop of photos</em>
            </a>
            <em>, to providing compelling content (e.g., </em>
            <a href="http://maps.google.com/">
              <em>Google
Maps</em>
            </a>
            <em>, </em>
            <a href="http://mail.google.com/mail/">
              <em>GMail</em>
            </a>
            <em>,
and now </em>
            <a href="http://radar.oreilly.com/2009/05/google-wave-what-might-email-l.html">
              <em>Google
Wave</em>
            </a>
            <em>).</em>
            <br />
… 
<br /><em>But stepping back a bit, the entire and </em><a href="http://www.pcworld.com/businesscenter/blogs/bizfeed/165653/html5_could_be_the_os_killer.html"><em>much
hyped</em></a><em></em><a href="http://radar.oreilly.com/2009/05/google-bets-big-on-html-5.html"><em>HTML5
interface</em></a><em> is just a facade.  That’s not a criticism, in fact that’s
generally the </em><a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2_1_2"><em>way
the web works</em></a><em>.  What makes Google Wave particularly interesting
is that there is an </em><a href="http://www.waveprotocol.org/"><em>API</em></a><em> which
operates directly on the repository.  Furthermore, you can host your own server,
and such servers federate using XMPP.</em></p>
          <p>
            <em>These servers are not merely passive, they can actively </em>
            <a href="http://code.google.com/apis/wave/extensions/robots/index.html#Events">
              <em>interact
with</em>
            </a>
            <em> processes called “robots” using HTTP (More specifically, </em>
            <a href="http://json-rpc.org/">
              <em>JSON-RPC</em>
            </a>
            <em> over
POST).  Once invoked, these robots have access to a full range of </em>
            <a href="http://code.google.com/apis/wave/extensions/robots/index.html#HandlingEvents">
              <em>operations</em>
            </a>
            <em> (</em>
            <a href="http://wave-robot-java-client.googlecode.com/svn/trunk/doc/index.html">
              <em>Java</em>
            </a>
            <em>, </em>
            <a href="http://wave-robot-python-client.googlecode.com/svn/trunk/pydocs/index.html">
              <em>Python</em>
            </a>
            <em>). 
The </em>
            <a href="http://code.google.com/p/wave-robot-python-client/source/browse/#svn/trunk/src/waveapi">
              <em>Python
library implementation looks</em>
            </a>
            <em> relatively straightforward, and would be
relatively easy to port to, say Ruby.</em>
          </p>
        </blockquote>
        <p>
This dichotomy pointed out by Sam is very interesting. One the one hand, there is
the Google Wave web application which pushes the boundaries of what it means to be
a rich web application that simply uses Javascript and the HTML DOM. This is a companion
step in Google’s transition to taking an active role in the future of building Web
applications where previous steps have included <a href="http://dev.w3.org/html5/spec/Overview.html">Google
representatives drafting the HTML 5 specification</a>, <a href="http://gears.google.com">Google
Gears</a> and <a href="http://chrome.google.com">Google Chrome</a>. However where
things get interesting is that the API makes it possible to build alternate client
applications (e.g. a .NET Wave client written in C#) and even build services that
interact with users regardless of which Wave client they are using. 
</p>
        <p>
Joe Gregorio has more on these APIs in his blog post <a href="http://bitworking.org/news/431/wave-first-thoughts">Wave
Protocol Thoughts</a> where he writes 
</p>
        <blockquote>
          <p>
            <em>There are actually 3 protocols and 2 APIs that are used in Wave: </em>
          </p>
          <ul>
            <li>
              <em>Federation (XMPP) </em>
            </li>
            <li>
              <em>The robot protocol (JSONRPC) </em>
            </li>
            <li>
              <em>The gadget API (OpenSocial) </em>
            </li>
            <li>
              <em>The wave embed API (Javascript) </em>
            </li>
            <li>
              <em>The client-server protocol (As defined by GWT) </em>
            </li>
          </ul>
          <p>
            <em>The last one in that list is really nothing that needs to be, or will probably
ever be documented, it is generated by GWT and when you build your own Wave client
you will need to define how it talks to your Wave server. The rest of the protocols
and APIs are based on existing technologies. </em>
          </p>
          <p>
            <em>The robot protocol looks very easy to use, </em>
            <a href="http://code.google.com/p/google-wave-resources/source/browse/trunk/samples/extensions/robots/python/yasr/smiley.py">
              <em>here
is the code for an admittedly simple robot</em>
            </a>
            <em>. Now some people have commented
that Wave reminds them of Lotus Notes, and I'm sure with a little thought you could
extend that to Exchange and Groove. The difference is that the extension model with
Wave is events over HTTP, which makes it language agnostic, a feature you get when
you define things in terms of protocols. That is, as long as you can stand up an HTTP
server and parse JSON, you can create robots for Wave, which is a huge leap forward
compared to the extension models for Notes, Exchange and Groove, which are all "object"
based extension models. In the "object" based extension model the application
exposes "objects" that are bound to locally that you manipulate to control
the application, which means that your language choices are limited to those that
have bindings into that object model. </em>
          </p>
        </blockquote>
        <p>
As someone’s whose first paying job in the software industry was an internship where
I had to write Outlook automation scripts to trigger special behaviors when people
sent or modified <a href="http://office.microsoft.com/en-us/outlook/HA012293681033.aspx">Outlook
task requests</a>, I can appreciate the novelty of moving away from a programming
model based on building a plugin in an application’s object model and instead <a href="http://code.google.com/apis/wave/extensions/robots/index.html">building
a Web service and having the web application notify you when it is time to act</a> which
is the way the Wave robot protocol works. Now that I’ve been exposed to this idea,
it seems doubly weird that Google also shipped <a href="http://www.google.com/google-d-s/scripts/scripts.html">Google
Apps Script</a> within weeks of this announcement.  
</p>
        <p>
Nick Gall writes in his post <a href="http://ironick.typepad.com/ironick/2009/06/my-2-on-google-wave-www-is-a-unidirectional-web-of-published-documents----wave-is-a-bidirectional-web-of-instant-messages.html">My
2¢ on Google Wave: WWW is a Unidirectional Web of Published Documents -- Wave is a
bidirectional Web of Instant Messages</a> that 
</p>
        <blockquote>
          <p>
            <em>Whether or not the Wave client succeeds, Wave is undoubtedly going to have a major
impact on how application designers approach web applications. The analogy would be
that even if Google Maps had "failed" to become the dominant map site/service,
it still had major impact on web app design.</em>
          </p>
        </blockquote>
        <p>
I suspect this as well. Specifically I have doubts about the viability of the communications
paradigm shift that Google Wave is trying to force taking hold. On the other hand,
I’m sure there are thousands of Web developers out there right now asking themselves
"would my app be better if users could see each other’s edits in real time?","should
we add a playback feature to our service as well" [<em>ed note - wikipedia could
really use this]</em> and "why don’t we support seamless drag and drop in our
application?". All inspired by their exposure to Google Wave. 
</p>
        <p>
Finally, I've ruminated publicly that I see a number of parallels between Google Wave
and the <a href="http://dev.live.com/blogs/devlive/archive/2008/04/22/279.aspx">announcement
of Live Mesh</a>. The one interesting parallel worth calling out is that both products/visions/platforms
are most powerful when there is a world of different providers each exposing their
data types to one or more of these rich user applications (i.e. a Mesh client or Wave
client). Thus far I think Google has done a better job than we did with Live Mesh
in being very upfront about this realization and evangelizing to developers that they
participate as providers. Of course, the proof will be in the pudding in a year or
so when we see just how many services have what it takes to implement a truly interoperable
federated provider model for Google Wave. 
</p>
        <img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Eminem&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Eminem</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Eminem+Underground/Ken Kaniff&amp;x=0&amp;y=0">Underground/Ken
Kaniff</a><img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /><img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b00b3839-d8d6-4669-ba1c-06debd6baf84" /></body>
      <title>Developers on Google Wave</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,b00b3839-d8d6-4669-ba1c-06debd6baf84.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2009/06/04/DevelopersOnGoogleWave.aspx</link>
      <pubDate>Thu, 04 Jun 2009 15:11:59 GMT</pubDate>
      <description>&lt;p&gt;
I initially planned to write up some detailed thoughts on the &lt;a href="http://www.youtube.com/watch?v=v_UyVmITiYQ"&gt;Google
Wave video&lt;/a&gt; and the &lt;a href="http://www.waveprotocol.org/"&gt;Google Wave Federation
protocol&lt;/a&gt;. However the combination of the fact that literally millions of people
have watched the video [according to YouTube] and I’ve had enough private conversations
with others that have influenced my thinking that I’d rather not post something that
makes it seem like I’m taking credit for the ideas of others. That said, I thought
it would still be useful to share some of the most insightful commentary I’ve seen
on Google Wave from various developer blogs. 
&lt;/p&gt;
&lt;p&gt;
Sam Ruby writes in his post &lt;a href="http://intertwingly.net/blog/2009/05/31/Google-Wave"&gt;Google
Wave&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;At one level, &lt;/em&gt;&lt;a href="http://wave.google.com/"&gt;&lt;em&gt;Google Wave&lt;/em&gt;&lt;/a&gt;&lt;em&gt; is
clearly a &lt;/em&gt;&lt;a href="http://agylen.com/2009/05/28/bullshit-graphs/"&gt;&lt;em&gt;bold statement&lt;/em&gt;&lt;/a&gt;&lt;em&gt; that
“this is the type of application that every browser should be able to run natively
without needing to resort to a plugin”.&amp;#160; At to give Google credit, they have
been working relentlessly towards that vision, addressing everything from &lt;/em&gt;&lt;a href="http://www.eweek.com/c/a/Search-Engines/Google-Chromes-JavaScript-is-Powered-with-a-V8-Engine/3/"&gt;&lt;em&gt;garbage
collection issues&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, to &lt;/em&gt;&lt;a href="http://www.andrejkoelewijn.com/wp/2009/05/30/google-wave-killer-app-for-html-5/"&gt;&lt;em&gt;enabling
drag and drop of photos&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, to providing compelling content (e.g., &lt;/em&gt;&lt;a href="http://maps.google.com/"&gt;&lt;em&gt;Google
Maps&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href="http://mail.google.com/mail/"&gt;&lt;em&gt;GMail&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
and now &lt;/em&gt;&lt;a href="http://radar.oreilly.com/2009/05/google-wave-what-might-email-l.html"&gt;&lt;em&gt;Google
Wave&lt;/em&gt;&lt;/a&gt;&lt;em&gt;).&lt;/em&gt; 
&lt;br /&gt;
… 
&lt;br /&gt;
&lt;em&gt;But stepping back a bit, the entire and &lt;/em&gt;&lt;a href="http://www.pcworld.com/businesscenter/blogs/bizfeed/165653/html5_could_be_the_os_killer.html"&gt;&lt;em&gt;much
hyped&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;a href="http://radar.oreilly.com/2009/05/google-bets-big-on-html-5.html"&gt;&lt;em&gt;HTML5
interface&lt;/em&gt;&lt;/a&gt;&lt;em&gt; is just a facade.&amp;#160; That’s not a criticism, in fact that’s
generally the &lt;/em&gt;&lt;a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2_1_2"&gt;&lt;em&gt;way
the web works&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&amp;#160; What makes Google Wave particularly interesting
is that there is an &lt;/em&gt;&lt;a href="http://www.waveprotocol.org/"&gt;&lt;em&gt;API&lt;/em&gt;&lt;/a&gt;&lt;em&gt; which
operates directly on the repository.&amp;#160; Furthermore, you can host your own server,
and such servers federate using XMPP.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;These servers are not merely passive, they can actively &lt;/em&gt;&lt;a href="http://code.google.com/apis/wave/extensions/robots/index.html#Events"&gt;&lt;em&gt;interact
with&lt;/em&gt;&lt;/a&gt;&lt;em&gt; processes called “robots” using HTTP (More specifically, &lt;/em&gt;&lt;a href="http://json-rpc.org/"&gt;&lt;em&gt;JSON-RPC&lt;/em&gt;&lt;/a&gt;&lt;em&gt; over
POST).&amp;#160; Once invoked, these robots have access to a full range of &lt;/em&gt;&lt;a href="http://code.google.com/apis/wave/extensions/robots/index.html#HandlingEvents"&gt;&lt;em&gt;operations&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (&lt;/em&gt;&lt;a href="http://wave-robot-java-client.googlecode.com/svn/trunk/doc/index.html"&gt;&lt;em&gt;Java&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href="http://wave-robot-python-client.googlecode.com/svn/trunk/pydocs/index.html"&gt;&lt;em&gt;Python&lt;/em&gt;&lt;/a&gt;&lt;em&gt;).&amp;#160;
The &lt;/em&gt;&lt;a href="http://code.google.com/p/wave-robot-python-client/source/browse/#svn/trunk/src/waveapi"&gt;&lt;em&gt;Python
library implementation looks&lt;/em&gt;&lt;/a&gt;&lt;em&gt; relatively straightforward, and would be
relatively easy to port to, say Ruby.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This dichotomy pointed out by Sam is very interesting. One the one hand, there is
the Google Wave web application which pushes the boundaries of what it means to be
a rich web application that simply uses Javascript and the HTML DOM. This is a companion
step in Google’s transition to taking an active role in the future of building Web
applications where previous steps have included &lt;a href="http://dev.w3.org/html5/spec/Overview.html"&gt;Google
representatives drafting the HTML 5 specification&lt;/a&gt;, &lt;a href="http://gears.google.com"&gt;Google
Gears&lt;/a&gt; and &lt;a href="http://chrome.google.com"&gt;Google Chrome&lt;/a&gt;. However where
things get interesting is that the API makes it possible to build alternate client
applications (e.g. a .NET Wave client written in C#) and even build services that
interact with users regardless of which Wave client they are using. 
&lt;/p&gt;
&lt;p&gt;
Joe Gregorio has more on these APIs in his blog post &lt;a href="http://bitworking.org/news/431/wave-first-thoughts"&gt;Wave
Protocol Thoughts&lt;/a&gt; where he writes 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;There are actually 3 protocols and 2 APIs that are used in Wave: &lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Federation (XMPP) &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The robot protocol (JSONRPC) &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The gadget API (OpenSocial) &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The wave embed API (Javascript) &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The client-server protocol (As defined by GWT) &lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;em&gt;The last one in that list is really nothing that needs to be, or will probably
ever be documented, it is generated by GWT and when you build your own Wave client
you will need to define how it talks to your Wave server. The rest of the protocols
and APIs are based on existing technologies. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The robot protocol looks very easy to use, &lt;/em&gt;&lt;a href="http://code.google.com/p/google-wave-resources/source/browse/trunk/samples/extensions/robots/python/yasr/smiley.py"&gt;&lt;em&gt;here
is the code for an admittedly simple robot&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Now some people have commented
that Wave reminds them of Lotus Notes, and I'm sure with a little thought you could
extend that to Exchange and Groove. The difference is that the extension model with
Wave is events over HTTP, which makes it language agnostic, a feature you get when
you define things in terms of protocols. That is, as long as you can stand up an HTTP
server and parse JSON, you can create robots for Wave, which is a huge leap forward
compared to the extension models for Notes, Exchange and Groove, which are all &amp;quot;object&amp;quot;
based extension models. In the &amp;quot;object&amp;quot; based extension model the application
exposes &amp;quot;objects&amp;quot; that are bound to locally that you manipulate to control
the application, which means that your language choices are limited to those that
have bindings into that object model. &lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As someone’s whose first paying job in the software industry was an internship where
I had to write Outlook automation scripts to trigger special behaviors when people
sent or modified &lt;a href="http://office.microsoft.com/en-us/outlook/HA012293681033.aspx"&gt;Outlook
task requests&lt;/a&gt;, I can appreciate the novelty of moving away from a programming
model based on building a plugin in an application’s object model and instead &lt;a href="http://code.google.com/apis/wave/extensions/robots/index.html"&gt;building
a Web service and having the web application notify you when it is time to act&lt;/a&gt; which
is the way the Wave robot protocol works. Now that I’ve been exposed to this idea,
it seems doubly weird that Google also shipped &lt;a href="http://www.google.com/google-d-s/scripts/scripts.html"&gt;Google
Apps Script&lt;/a&gt; within weeks of this announcement.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Nick Gall writes in his post &lt;a href="http://ironick.typepad.com/ironick/2009/06/my-2-on-google-wave-www-is-a-unidirectional-web-of-published-documents----wave-is-a-bidirectional-web-of-instant-messages.html"&gt;My
2¢ on Google Wave: WWW is a Unidirectional Web of Published Documents -- Wave is a
bidirectional Web of Instant Messages&lt;/a&gt; that 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Whether or not the Wave client succeeds, Wave is undoubtedly going to have a major
impact on how application designers approach web applications. The analogy would be
that even if Google Maps had &amp;quot;failed&amp;quot; to become the dominant map site/service,
it still had major impact on web app design.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I suspect this as well. Specifically I have doubts about the viability of the communications
paradigm shift that Google Wave is trying to force taking hold. On the other hand,
I’m sure there are thousands of Web developers out there right now asking themselves
&amp;quot;would my app be better if users could see each other’s edits in real time?&amp;quot;,&amp;quot;should
we add a playback feature to our service as well&amp;quot; [&lt;em&gt;ed note - wikipedia could
really use this]&lt;/em&gt; and &amp;quot;why don’t we support seamless drag and drop in our
application?&amp;quot;. All inspired by their exposure to Google Wave. 
&lt;/p&gt;
&lt;p&gt;
Finally, I've ruminated publicly that I see a number of parallels between Google Wave
and the &lt;a href="http://dev.live.com/blogs/devlive/archive/2008/04/22/279.aspx"&gt;announcement
of Live Mesh&lt;/a&gt;. The one interesting parallel worth calling out is that both products/visions/platforms
are most powerful when there is a world of different providers each exposing their
data types to one or more of these rich user applications (i.e. a Mesh client or Wave
client). Thus far I think Google has done a better job than we did with Live Mesh
in being very upfront about this realization and evangelizing to developers that they
participate as providers. Of course, the proof will be in the pudding in a year or
so when we see just how many services have what it takes to implement a truly interoperable
federated provider model for Google Wave. 
&lt;/p&gt;
&lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Eminem&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Eminem&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Eminem+Underground/Ken Kaniff&amp;amp;x=0&amp;amp;y=0"&gt;Underground/Ken
Kaniff&lt;/a&gt; &lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt;&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b00b3839-d8d6-4669-ba1c-06debd6baf84" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,b00b3839-d8d6-4669-ba1c-06debd6baf84.aspx</comments>
      <category>Platforms</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=0756234c-dd36-49e5-a17b-076f2d8f0384</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,0756234c-dd36-49e5-a17b-076f2d8f0384.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,0756234c-dd36-49e5-a17b-076f2d8f0384.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=0756234c-dd36-49e5-a17b-076f2d8f0384</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In <a title="Dare Obasanjo aka Carnage4Life: Progress report on Facebook integration into RSS Bandit (Colossus release)" href="http://www.25hoursaday.com/weblog/2009/05/10/ProgressReportOnFacebookIntegrationIntoRSSBanditColossusRelease.aspx">my
previous post</a> I talk about adding support for reading and commenting on your Facebook
news feed in RSS Bandit. This functionality is made possible by the <a href="http://developers.facebook.com/news.php?blog=1&amp;story=225">recently
announced Facebook Open Stream API</a>. As I worked through the code in my few free
moments I was alternately impressed and frustrated by the Open Stream API. On the
one hand, the functionality the API provides is greatly enabling and has already unleashed
a bounty of innovation as evidenced by the growing number of applications for interacting
with your Facebook news feed on the desktop (e.g. <a href="http://desktop.seesmic.com/">Seesmic</a>, <a href="http://www.tweetdeck.com/beta/">Tweetdeck</a>, <a href="http://www.sobees.com/bdule">bdule</a>,
etc). On the other hand, figuring out there are a few quirks of the API that make
the web developer in me cringe and the desktop developer want to beg for mercy. 
</p>
        <p>
Below are my opinions on the Open Stream API, the purpose of sharing is so other developers
who plan to use the API may avoid some of the pitfalls I did and also to share feedback
with my peers at Facebook and elsewhere on best practices in providing activity stream
APIs.  
</p>
        <h3>Good: Lots of options for getting at the data  
</h3>
        <p>
Most API calls at Facebook have two entry points. You can either call a “REST-like”
URL endpoint via HTTP GET or perform a SQL-like query via <a href="http://wiki.developers.facebook.com/index.php/FQL">FQL</a> on
a generic end point. For interacting with the Facebook news feed, you have <a href="http://wiki.developers.facebook.com/index.php/Stream.get">stream.get</a> and <a href="http://wiki.developers.facebook.com/index.php/Stream.getComments">stream.getComments</a> as
the REST-like methods for accessing the news feed and a comment thread for a particular
feed item respectively.  With FQL, you can perform queries against the <a href="http://wiki.developers.facebook.com/index.php/Stream_(FQL)">stream
(FQL)</a> and <a href="http://wiki.developers.facebook.com/index.php/Comment_(FQL)">comment
(FQL)</a> to get the same results. 
</p>
        <p>
Both mechanisms give you the option of getting back the data as XML or JSON. Below
are example of what HTTP requests to retrieve your news feed look like using both
approaches  
</p>
        <blockquote>
          <p>
stream.get REQUEST: 
<br /><code>http://api.facebook.com/restserver.php?v=1.0&amp;method=stream.get&amp;format=XML&amp;viewer_id={0}&amp;session_key={1}&amp;api_key={2}&amp;call_id={3}&amp;sig={4} </code></p>
          <p>
FQL REQUEST: 
<br /><code>http://api.facebook.com/restserver.php?v=1.0&amp;method=fql.query&amp;format=XML&amp;call_id={0}&amp;session_key={1}&amp;api_key={2}&amp;sig={3}&amp;query={4}</code><br />
FQL QUERY: 
<br /><code>select post_id, source_id, created_time, actor_id, target_id, app_id, message,
attachment, comments, likes, permalink, attribution, type from stream where filter_key
in (select filter_key FROM stream_filter where uid = {0} and type = 'newsfeed') and
created_time &gt;= {1} order by created_time desc limit 50</code></p>
        </blockquote>
        <p>
I ended up using <code>stream.get</code> over FQL because the only benefit I see to
using FQL is being able to filter some of the result fields or combine data from multiple
tables, neither of which I needed in this instance. I chose XML as the output format
over JSON because I transform the results of the Facebook API request into an Atom
feed and then hand it down to the regular Atom feed parsing code in RSS Bandit. It
was much easier for me to handle this transformation using XSLT over XML results as
opposed to procedural code over a JSON result set. 
</p>
        <p>
There’s also a third mechanism for getting news feed data out of Facebook that would
have been perfect for my needs. You can <a title="Facebook Developers Wiki - Using Activity Streams" href="http://wiki.developers.facebook.com/index.php/Using_Activity_Streams">access
the news feed using the nascent activity streams standard</a> which returns the data
as an Atom feeds with certain extensions specific to social network activity stream.
I couldn’t get this to work probably due to user error on my part (more on this later)
but if I had, the structure of the GET request would have been along the lines of 
</p>
        <blockquote>Activity Streams REQUEST: 
<br /><code>http://www.facebook.com/activitystreams/feed.php?source_id={0}&amp;app_id={1}&amp;session_key={2}&amp;sig={3}&amp;v=0.7&amp;read&amp;updated_time={4}</code></blockquote>
        <p>
If not for the initial problems I had figuring out which parameters to pass to APIs
and the concern about building on an API that isn’t yet at version 1.0, the Activity
Stream API would have been perfect for my needs. 
</p>
        <p>
Kudos to the Facebook team for providing such a rich and varied set of options for
getting the news feed out of their system. There’s something for every temperament. 
</p>
        <h3>Bad: Misuse of HTTP status codes
</h3>
        <p>
The Facebook API documentation describes the platform as “REST-like” and not <a href="http://en.wikipedia.org/wiki/REST">RESTful</a>.
They sure weren’t kidding. For the most part, when I’ve discussed the problems with
APIs that aren’t completely RESTful the negatives to such an approach have seemed
aesthetic in nature as opposed to being practical problems. Below are some of the
practical problems I faced because the Facebook APIs do not use HTTP status codes
in a manner consistent with the rest of the Web. 
</p>
        <p>
In HTTP, there are existing error codes which clients can interpret in a consistent
manner and provide consistent feedback to users when they occur. Now consider this
excerpt from the documentation on using Facebook’s activity stream API
</p>
        <blockquote>
          <h5>
            <em>Response Codes</em>
          </h5>
          <p>
            <em>Like most HTTP responses, Facebook Activity Streams responses include a response
header, which always includes a traditional response code and a short response message.
The supported response codes include: </em>
          </p>
          <ul>
            <li>
              <em>200 Code provided whenever the Facebook servers were able to accommodate the request
and provide a response. </em>
            </li>
            <li>
              <em>304 Code provided whenever the request header included If-Modified-Since and no
new posts have been generated since the specified time. 
<br /><b>Note:</b> Code 304 will never be returned if If-Modified-Since isn't included in
the request header. </em>
            </li>
            <li>
              <em>
                <font color="#ff0000">401 Code provided whenever the URL omits one or more of
the required parameters.</font>
              </em>
            </li>
            <li>
              <em>403 Code provided whenever the URL is syntactically valid, but the user hasn't
granted the required extended permission. </em>
            </li>
            <li>
              <em>404 Code provided whenever the URL is syntactically valid, but the signature is
incorrect, or the session key is invalid.</em>
            </li>
          </ul>
        </blockquote>
        <p>
You might notice that an HTTP 401 is used to indicate that the request is improperly
formed. However, let’s see what <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">RFC
2616</a> has to say about the 401 status code as well as how to communicate badly
formed arguments 
</p>
        <blockquote>
          <h5>
            <em>400 Bad Request</em>
          </h5>
          <p>
            <em>The request could not be understood by the server due to malformed syntax. The
client SHOULD NOT repeat the request without modifications. </em>
          </p>
          <h5>
            <em>401 Unauthorized</em>
          </h5>
          <p>
            <em>The request requires user authentication. The response MUST include a WWW-Authenticate
header field (section 14.47) containing a challenge applicable to the requested resource.
The client MAY repeat the request with a suitable Authorization header field (section </em>
            <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.8">
              <em>14.8</em>
            </a>
            <em>).
If the request already included Authorization credentials, then the 401 response indicates
that authorization has been refused for those credentials. If the 401 response contains
the same challenge as the prior response, and the user agent has already attempted
authentication at least once, then the user SHOULD be presented the entity that was
given in the response, since that entity might include relevant diagnostic information.
HTTP access authentication is explained in "HTTP Authentication: Basic and Digest
Access Authentication"</em>
          </p>
        </blockquote>
        <p>
According to the HTTP specification excerpted above, the status code to return on
missing parameters should be 400 not 401. The practical problem with returning HTTP
401 in this case is that applications like RSS Bandit may have code paths that prompt
the user to check or re-enter their credentials because an authentication error has
occurred. We now have to special case getting a 401 from Facebook’s servers versus
any other server on the Web. Thankfully, this error should be limited to development
time unless Facebook changes their API in a backwards incompatible manner by requiring
new parameters to their methods. 
</p>
        <p>
A bigger problem is that Facebook returns HTTP 200 which traditionally means <font color="#008000">success </font>in
regular occurring error conditions. Specifically, when a user’s session key expires
a successful response is sent containing an error document. In RSS Bandit, we already
have a processing pipeline that hands off successful responses containing an XML document
to the RSS/Atom parsing layer. With Facebook’s behavior I had two choices 
</p>
        <ol>
          <li>
            <p>
Modify the RSS/Atom parsing layer to understand Facebook error documents and then
kick back an error up to the user interface asking the user to re-enter their credentials.
This was particularly hacky because that layer doesn’t really have a connection to
the main UI thread nor should it. 
</p>
          </li>
          <li>
            <p>
Pre-process the XML document before handing it to the RSS/Atom parsing layer. This
implies an intermediate step in between dispatching on the response status and actually
processing the document. 
</p>
          </li>
        </ol>
        <p>
Option #2 proved more palatable since there was already an intermediate step needed
to transform the results of <code>stream.get</code> to an Atom feed. If I’d used the
Activity Streams API as was my initial plan then the decision may have been harder
to make. 
</p>
        <h3>Good: Well thought out model for authorizing access to user data
</h3>
        <p>
A number of application platforms work by giving a user all-or-nothing access to the
user’s data. My favorite example of this bad practice is Twitter which for a long
time made this situation even worse by requiring the applications to collect the person’s
username and password. The <a href="http://scobleizer.com/2009/01/01/twitter-spam-effective-or-idiotic/">controversy
around Twply</a> earlier this year shows exactly why giving applications more access
to a user’s data than they need is bad. Twply only needed access to a user’s @replies
but given that there was no way to only give it access to just that aspect of a user’s
Twitter data, it also got the ability to post tweets on their behalf and did so in
a spammy manner. 
</p>
        <p>
The Facebook API has a notion of <a href="http://wiki.developers.facebook.com/index.php/Extended_permissions">extended
permissions</a> which are access rights that require special opt-in from the user
given that the data or functionality is sensitive and can be abused. The current set
of extended permissions in the Facebook API is provided below 
</p>
        <table border="1">
          <tbody>
            <tr>
              <th>
Permission 
</th>
              <th>
Description 
</th>
            </tr>
            <tr>
              <td>
publish_stream 
</td>
              <td>
Lets your application or site post <a title="Stream.publish" href="/index.php/Stream.publish">content</a>, <a title="Stream.addComment" href="/index.php/Stream.addComment">comments</a>,
and <a title="Stream.addLike" href="/index.php/Stream.addLike">likes</a> to a user's
profile and in the streams of the user's friends without prompting the user. 
<p>
This permission is a superset of the status_update, photo_upload, video_upload, create_note,
and share_item extended permissions, so if you haven't prompted users for those permissions
yet, you need only prompt them for publish_stream. 
</p><p><b>Note:</b> At this time, while the Open Stream API is in beta, the only Facebook
users that can grant your application the <code>publish_stream</code> permission are
the <b>developers</b> of your application. 
</p></td>
            </tr>
            <tr>
              <td>
read_stream 
</td>
              <td>
Lets your application or site access a <a title="Stream.get" href="/index.php/Stream.get">user's
stream</a> and display it. This includes all of the posts in a user's stream. You
need an active session with the user to get this data. 
</td>
            </tr>
            <tr>
              <td>
email 
</td>
              <td>
This permission allows an application to send email to its user. This permission can
be obtained only through the <a title="Fb:prompt-permission" href="/index.php/Fb:prompt-permission">fb:prompt-permission</a> tag
or the <a title="UsageNotes/Forms" href="/index.php/UsageNotes/Forms#Prompting_a_User_for_an_Extended_Permission">promptpermission</a> attribute.
When the user accepts, you can send him/her an email via <a title="Notifications.sendEmail" href="/index.php/Notifications.sendEmail">notifications.sendEmail</a> or
directly to the <a title="User (FQL)" href="/index.php/User_%28FQL%29">proxied_email
FQL field</a>. 
</td>
            </tr>
            <tr>
              <td>
offline_access 
</td>
              <td>
This permission grants an application access to user data when the user is offline
or doesn't have an active session. This permission can be obtained only through the <a title="Fb:prompt-permission" href="/index.php/Fb:prompt-permission">fb:prompt-permission</a> tag
or the <a title="UsageNotes/Forms" href="/index.php/UsageNotes/Forms#Prompting_a_User_for_an_Extended_Permission">promptpermission</a> attribute. 
</td>
            </tr>
            <tr>
              <td>
create_event 
</td>
              <td>
This permission allows an app to create and modify events for a user via the <a title="Events.create" href="/index.php/Events.create">events.create</a>, <a title="Events.edit" href="/index.php/Events.edit">events.edit</a> and <a title="Events.cancel" href="/index.php/Events.cancel">events.cancel</a> methods. 
</td>
            </tr>
            <tr>
              <td>
rsvp_event 
</td>
              <td>
This permission allows an app to RSVP to an event on behalf of a user via the <a title="Events.rsvp" href="/index.php/Events.rsvp">events.rsvp</a> method. 
</td>
            </tr>
            <tr>
              <td>
sms 
</td>
              <td>
This permission allows a <a title="Mobile" href="/index.php/Mobile">mobile</a> application
to send messages to the user and respond to messages from the user via text message. 
</td>
            </tr>
            <tr>
              <td>
status_update 
</td>
              <td>
This permission grants your application the ability to update a user's or Facebook
Page's status with the <a title="Status.set" href="/index.php/Status.set">status.set</a> or <a title="Users.setStatus" href="/index.php/Users.setStatus">users.setStatus</a> method. 
<p><b>Note:</b> You should prompt users for the publish_stream permission instead, since
it includes the ability to update a user's status. 
</p></td>
            </tr>
            <tr>
              <td>
photo_upload 
</td>
              <td>
This permission relaxes requirements on the <a title="Photos.upload" href="/index.php/Photos.upload">photos.upload</a> and <a title="Photos.addTag" href="/index.php/Photos.addTag">photos.addTag</a> methods.
If the user grants this permission, photos uploaded by the application will bypass
the pending state and the user will not have to manually approve the photos each time. 
<p><b>Note:</b> You should prompt users for the publish_stream permission instead, since
it includes the ability to upload a photo. 
</p></td>
            </tr>
            <tr>
              <td>
video_upload 
</td>
              <td>
This permission allows an application to provide the mechanism for a user to <a title="Video.upload" href="/index.php/Video.upload">upload
videos</a> to their profile. 
<p><b>Note:</b> You should prompt users for the publish_stream permission instead, since
it includes the ability to upload a video. 
</p></td>
            </tr>
            <tr>
              <td>
create_note 
</td>
              <td>
This permission allows an application to provide the mechanism for a user to <a title="Notes.create" href="/index.php/Notes.create">write</a>, <a title="Notes.edit" href="/index.php/Notes.edit">edit</a>,
and <a title="Notes.delete" href="/index.php/Notes.delete">delete</a> notes on their
profile. 
<p><b>Note:</b> You should prompt users for the publish_stream permission instead, since
it includes the ability to let a user write notes. 
</p></td>
            </tr>
            <tr>
              <td>
share_item 
</td>
              <td>
This permission allows an application to provide the mechanism for a user to <a title="Links.post" href="/index.php/Links.post">post
links</a> to their profile. 
<p><b>Note:</b> You should prompt users for the publish_stream permission instead, since
it includes the ability to let a user share links. 
</p></td>
            </tr>
          </tbody>
        </table>
        <h3> 
</h3>
        <h3> 
</h3>
        <h3>Bad: Too many prompts for desktop applications
</h3>
        <p>
Although I’ve praised the extended permissions model, it currently leads to a cumbersome
experience for desktop applications. Installing Facebook desktop applications like <a href="http://www.sobees.com/bdule">bdule</a> or <a href="http://www.facebook.com/apps/application.php?id=75647677556">Facebook
for Adobe Air</a> requires running through three separate permissions screens. The
user has to login, then grant the read_stream extended permission followed by the
publish_stream extended permission. Granted, the latter two only need to be done once
but they still affect the out of box experience fairly negatively in my opinion. 
</p>
        <p>
In RSS Bandit, I’ve attempted to reduce this by delaying the prompt for publish_stream
permission until the first time a user tries to comment on a news feed item from within
the application. Streamlining this experience will be a boon for application developers
who want the entire experience to be smooth and painless. The documentation on the <a href="http://wiki.developers.facebook.com/index.php/Using_the_Open_Stream_API">documentation
the Open Streams API page</a> states that there are options for streamlining these
requests but they only apply to Web applications not desktop apps. <img style="vertical-align: middle" title="Sad" alt="Sad" src="http://shared.live.com/o5ZS870nhiJMYQrZY6kNyQ/emoticons/smile_sad.gif" /></p>
        <h3>Bad: Plethora of application identifiers and authentication requirements is a
stumbling block for beginners
</h3>
        <p>
The official documentation on the Facebook API doesn’t do a good job of connecting
all the dots when it comes to understanding how to make calls to the service. For
example, when you read the <a href="http://wiki.developers.facebook.com/index.php/Stream.get">documentation
for stream.get</a> it is not obvious from that page what endpoint to make requests
to OR that every Facebook API call has a set of required parameters beyond the ones
listed on that page. In fact, I was stumped for about a week or so trying to figure
out the magical incantations to get the right set of parameters for API calls and
the right data to put in these parameters until I stumbled on a <a href="http://forum.developers.facebook.com/viewtopic.php?id=21155">Facebook
forum post creating the 'sig' parameter</a> which solved my problems. I believe I
once saw this information in the Facebook API documents but after ten minutes of searching
just now I can’t seem to find it so perhaps it was in my imagination. 
</p>
        <p>
Part of the problem is the varied number of identifiers that you have to keep straight
as an application developer including your 
</p>
        <ul>
          <li>
application ID 
</li>
          <li>
API key 
</li>
          <li>
application secret 
</li>
          <li>
session key 
</li>
          <li>
client secret 
</li>
        </ul>
        <p>
The fact that various APIs take different combinations of the above lead to more than
one confusing moment for me. Eventually I figured it out but I felt like I was being
hazed as I was going through the process. 
</p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=0756234c-dd36-49e5-a17b-076f2d8f0384" />
      </body>
      <title>Some thoughts on using the Facebook Open Stream API</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,0756234c-dd36-49e5-a17b-076f2d8f0384.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2009/05/11/SomeThoughtsOnUsingTheFacebookOpenStreamAPI.aspx</link>
      <pubDate>Mon, 11 May 2009 15:02:33 GMT</pubDate>
      <description>&lt;p&gt;
In &lt;a title="Dare Obasanjo aka Carnage4Life: Progress report on Facebook integration into RSS Bandit (Colossus release)" href="http://www.25hoursaday.com/weblog/2009/05/10/ProgressReportOnFacebookIntegrationIntoRSSBanditColossusRelease.aspx"&gt;my
previous post&lt;/a&gt; I talk about adding support for reading and commenting on your Facebook
news feed in RSS Bandit. This functionality is made possible by the &lt;a href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=225"&gt;recently
announced Facebook Open Stream API&lt;/a&gt;. As I worked through the code in my few free
moments I was alternately impressed and frustrated by the Open Stream API. On the
one hand, the functionality the API provides is greatly enabling and has already unleashed
a bounty of innovation as evidenced by the growing number of applications for interacting
with your Facebook news feed on the desktop (e.g. &lt;a href="http://desktop.seesmic.com/"&gt;Seesmic&lt;/a&gt;, &lt;a href="http://www.tweetdeck.com/beta/"&gt;Tweetdeck&lt;/a&gt;, &lt;a href="http://www.sobees.com/bdule"&gt;bdule&lt;/a&gt;,
etc). On the other hand, figuring out there are a few quirks of the API that make
the web developer in me cringe and the desktop developer want to beg for mercy. 
&lt;/p&gt;
&lt;p&gt;
Below are my opinions on the Open Stream API, the purpose of sharing is so other developers
who plan to use the API may avoid some of the pitfalls I did and also to share feedback
with my peers at Facebook and elsewhere on best practices in providing activity stream
APIs.&amp;#160; 
&lt;/p&gt;
&lt;h3&gt;Good: Lots of options for getting at the data&amp;#160; 
&lt;/h3&gt;
&lt;p&gt;
Most API calls at Facebook have two entry points. You can either call a “REST-like”
URL endpoint via HTTP GET or perform a SQL-like query via &lt;a href="http://wiki.developers.facebook.com/index.php/FQL"&gt;FQL&lt;/a&gt; on
a generic end point. For interacting with the Facebook news feed, you have &lt;a href="http://wiki.developers.facebook.com/index.php/Stream.get"&gt;stream.get&lt;/a&gt; and &lt;a href="http://wiki.developers.facebook.com/index.php/Stream.getComments"&gt;stream.getComments&lt;/a&gt; as
the REST-like methods for accessing the news feed and a comment thread for a particular
feed item respectively.&amp;#160; With FQL, you can perform queries against the &lt;a href="http://wiki.developers.facebook.com/index.php/Stream_(FQL)"&gt;stream
(FQL)&lt;/a&gt; and &lt;a href="http://wiki.developers.facebook.com/index.php/Comment_(FQL)"&gt;comment
(FQL)&lt;/a&gt; to get the same results. 
&lt;/p&gt;
&lt;p&gt;
Both mechanisms give you the option of getting back the data as XML or JSON. Below
are example of what HTTP requests to retrieve your news feed look like using both
approaches&amp;#160; 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
stream.get REQUEST: 
&lt;br /&gt;
&lt;code&gt;http://api.facebook.com/restserver.php?v=1.0&amp;amp;method=stream.get&amp;amp;format=XML&amp;amp;viewer_id={0}&amp;amp;session_key={1}&amp;amp;api_key={2}&amp;amp;call_id={3}&amp;amp;sig={4} &lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
FQL REQUEST: 
&lt;br /&gt;
&lt;code&gt;http://api.facebook.com/restserver.php?v=1.0&amp;amp;method=fql.query&amp;amp;format=XML&amp;amp;call_id={0}&amp;amp;session_key={1}&amp;amp;api_key={2}&amp;amp;sig={3}&amp;amp;query={4}&lt;/code&gt; 
&lt;br /&gt;
FQL QUERY: 
&lt;br /&gt;
&lt;code&gt;select post_id, source_id, created_time, actor_id, target_id, app_id, message,
attachment, comments, likes, permalink, attribution, type from stream where filter_key
in (select filter_key FROM stream_filter where uid = {0} and type = 'newsfeed') and
created_time &amp;gt;= {1} order by created_time desc limit 50&lt;/code&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I ended up using &lt;code&gt;stream.get&lt;/code&gt; over FQL because the only benefit I see to
using FQL is being able to filter some of the result fields or combine data from multiple
tables, neither of which I needed in this instance. I chose XML as the output format
over JSON because I transform the results of the Facebook API request into an Atom
feed and then hand it down to the regular Atom feed parsing code in RSS Bandit. It
was much easier for me to handle this transformation using XSLT over XML results as
opposed to procedural code over a JSON result set. 
&lt;/p&gt;
&lt;p&gt;
There’s also a third mechanism for getting news feed data out of Facebook that would
have been perfect for my needs. You can &lt;a title="Facebook Developers Wiki - Using Activity Streams" href="http://wiki.developers.facebook.com/index.php/Using_Activity_Streams"&gt;access
the news feed using the nascent activity streams standard&lt;/a&gt; which returns the data
as an Atom feeds with certain extensions specific to social network activity stream.
I couldn’t get this to work probably due to user error on my part (more on this later)
but if I had, the structure of the GET request would have been along the lines of 
&lt;/p&gt;
&lt;blockquote&gt;Activity Streams REQUEST: 
&lt;br /&gt;
&lt;code&gt;http://www.facebook.com/activitystreams/feed.php?source_id={0}&amp;amp;app_id={1}&amp;amp;session_key={2}&amp;amp;sig={3}&amp;amp;v=0.7&amp;amp;read&amp;amp;updated_time={4}&lt;/code&gt;&lt;/blockquote&gt; 
&lt;p&gt;
If not for the initial problems I had figuring out which parameters to pass to APIs
and the concern about building on an API that isn’t yet at version 1.0, the Activity
Stream API would have been perfect for my needs. 
&lt;/p&gt;
&lt;p&gt;
Kudos to the Facebook team for providing such a rich and varied set of options for
getting the news feed out of their system. There’s something for every temperament. 
&lt;/p&gt;
&lt;h3&gt;Bad: Misuse of HTTP status codes
&lt;/h3&gt;
&lt;p&gt;
The Facebook API documentation describes the platform as “REST-like” and not &lt;a href="http://en.wikipedia.org/wiki/REST"&gt;RESTful&lt;/a&gt;.
They sure weren’t kidding. For the most part, when I’ve discussed the problems with
APIs that aren’t completely RESTful the negatives to such an approach have seemed
aesthetic in nature as opposed to being practical problems. Below are some of the
practical problems I faced because the Facebook APIs do not use HTTP status codes
in a manner consistent with the rest of the Web. 
&lt;/p&gt;
&lt;p&gt;
In HTTP, there are existing error codes which clients can interpret in a consistent
manner and provide consistent feedback to users when they occur. Now consider this
excerpt from the documentation on using Facebook’s activity stream API
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;h5&gt;&lt;em&gt;Response Codes&lt;/em&gt;
&lt;/h5&gt;
&lt;p&gt;
&lt;em&gt;Like most HTTP responses, Facebook Activity Streams responses include a response
header, which always includes a traditional response code and a short response message.
The supported response codes include: &lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;200 Code provided whenever the Facebook servers were able to accommodate the request
and provide a response. &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;304 Code provided whenever the request header included If-Modified-Since and no
new posts have been generated since the specified time. 
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; Code 304 will never be returned if If-Modified-Since isn't included in
the request header. &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;font color="#ff0000"&gt;401 Code provided whenever the URL omits one or more of
the required parameters.&lt;/font&gt; &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;403 Code provided whenever the URL is syntactically valid, but the user hasn't
granted the required extended permission. &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;404 Code provided whenever the URL is syntactically valid, but the signature is
incorrect, or the session key is invalid.&lt;/em&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
You might notice that an HTTP 401 is used to indicate that the request is improperly
formed. However, let’s see what &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"&gt;RFC
2616&lt;/a&gt; has to say about the 401 status code as well as how to communicate badly
formed arguments 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;h5&gt;&lt;em&gt;400 Bad Request&lt;/em&gt;
&lt;/h5&gt;
&lt;p&gt;
&lt;em&gt;The request could not be understood by the server due to malformed syntax. The
client SHOULD NOT repeat the request without modifications. &lt;/em&gt;
&lt;/p&gt;
&lt;h5&gt;&lt;em&gt;401 Unauthorized&lt;/em&gt;
&lt;/h5&gt;
&lt;p&gt;
&lt;em&gt;The request requires user authentication. The response MUST include a WWW-Authenticate
header field (section 14.47) containing a challenge applicable to the requested resource.
The client MAY repeat the request with a suitable Authorization header field (section &lt;/em&gt;&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.8"&gt;&lt;em&gt;14.8&lt;/em&gt;&lt;/a&gt;&lt;em&gt;).
If the request already included Authorization credentials, then the 401 response indicates
that authorization has been refused for those credentials. If the 401 response contains
the same challenge as the prior response, and the user agent has already attempted
authentication at least once, then the user SHOULD be presented the entity that was
given in the response, since that entity might include relevant diagnostic information.
HTTP access authentication is explained in &amp;quot;HTTP Authentication: Basic and Digest
Access Authentication&amp;quot;&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
According to the HTTP specification excerpted above, the status code to return on
missing parameters should be 400 not 401. The practical problem with returning HTTP
401 in this case is that applications like RSS Bandit may have code paths that prompt
the user to check or re-enter their credentials because an authentication error has
occurred. We now have to special case getting a 401 from Facebook’s servers versus
any other server on the Web. Thankfully, this error should be limited to development
time unless Facebook changes their API in a backwards incompatible manner by requiring
new parameters to their methods. 
&lt;/p&gt;
&lt;p&gt;
A bigger problem is that Facebook returns HTTP 200 which traditionally means &lt;font color="#008000"&gt;success &lt;/font&gt;in
regular occurring error conditions. Specifically, when a user’s session key expires
a successful response is sent containing an error document. In RSS Bandit, we already
have a processing pipeline that hands off successful responses containing an XML document
to the RSS/Atom parsing layer. With Facebook’s behavior I had two choices 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
Modify the RSS/Atom parsing layer to understand Facebook error documents and then
kick back an error up to the user interface asking the user to re-enter their credentials.
This was particularly hacky because that layer doesn’t really have a connection to
the main UI thread nor should it. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Pre-process the XML document before handing it to the RSS/Atom parsing layer. This
implies an intermediate step in between dispatching on the response status and actually
processing the document. 
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Option #2 proved more palatable since there was already an intermediate step needed
to transform the results of &lt;code&gt;stream.get&lt;/code&gt; to an Atom feed. If I’d used the
Activity Streams API as was my initial plan then the decision may have been harder
to make. 
&lt;/p&gt;
&lt;h3&gt;Good: Well thought out model for authorizing access to user data
&lt;/h3&gt;
&lt;p&gt;
A number of application platforms work by giving a user all-or-nothing access to the
user’s data. My favorite example of this bad practice is Twitter which for a long
time made this situation even worse by requiring the applications to collect the person’s
username and password. The &lt;a href="http://scobleizer.com/2009/01/01/twitter-spam-effective-or-idiotic/"&gt;controversy
around Twply&lt;/a&gt; earlier this year shows exactly why giving applications more access
to a user’s data than they need is bad. Twply only needed access to a user’s @replies
but given that there was no way to only give it access to just that aspect of a user’s
Twitter data, it also got the ability to post tweets on their behalf and did so in
a spammy manner. 
&lt;/p&gt;
&lt;p&gt;
The Facebook API has a notion of &lt;a href="http://wiki.developers.facebook.com/index.php/Extended_permissions"&gt;extended
permissions&lt;/a&gt; which are access rights that require special opt-in from the user
given that the data or functionality is sensitive and can be abused. The current set
of extended permissions in the Facebook API is provided below 
&lt;/p&gt;
&lt;table border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;
Permission 
&lt;/th&gt;
&lt;th&gt;
Description 
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
publish_stream 
&lt;/td&gt;
&lt;td&gt;
Lets your application or site post &lt;a title="Stream.publish" href="/index.php/Stream.publish"&gt;content&lt;/a&gt;, &lt;a title="Stream.addComment" href="/index.php/Stream.addComment"&gt;comments&lt;/a&gt;,
and &lt;a title="Stream.addLike" href="/index.php/Stream.addLike"&gt;likes&lt;/a&gt; to a user's
profile and in the streams of the user's friends without prompting the user. 
&lt;p&gt;
This permission is a superset of the status_update, photo_upload, video_upload, create_note,
and share_item extended permissions, so if you haven't prompted users for those permissions
yet, you need only prompt them for publish_stream. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Note:&lt;/b&gt; At this time, while the Open Stream API is in beta, the only Facebook
users that can grant your application the &lt;code&gt;publish_stream&lt;/code&gt; permission are
the &lt;b&gt;developers&lt;/b&gt; of your application. 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
read_stream 
&lt;/td&gt;
&lt;td&gt;
Lets your application or site access a &lt;a title="Stream.get" href="/index.php/Stream.get"&gt;user's
stream&lt;/a&gt; and display it. This includes all of the posts in a user's stream. You
need an active session with the user to get this data. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
email 
&lt;/td&gt;
&lt;td&gt;
This permission allows an application to send email to its user. This permission can
be obtained only through the &lt;a title="Fb:prompt-permission" href="/index.php/Fb:prompt-permission"&gt;fb:prompt-permission&lt;/a&gt; tag
or the &lt;a title="UsageNotes/Forms" href="/index.php/UsageNotes/Forms#Prompting_a_User_for_an_Extended_Permission"&gt;promptpermission&lt;/a&gt; attribute.
When the user accepts, you can send him/her an email via &lt;a title="Notifications.sendEmail" href="/index.php/Notifications.sendEmail"&gt;notifications.sendEmail&lt;/a&gt; or
directly to the &lt;a title="User (FQL)" href="/index.php/User_%28FQL%29"&gt;proxied_email
FQL field&lt;/a&gt;. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
offline_access 
&lt;/td&gt;
&lt;td&gt;
This permission grants an application access to user data when the user is offline
or doesn't have an active session. This permission can be obtained only through the &lt;a title="Fb:prompt-permission" href="/index.php/Fb:prompt-permission"&gt;fb:prompt-permission&lt;/a&gt; tag
or the &lt;a title="UsageNotes/Forms" href="/index.php/UsageNotes/Forms#Prompting_a_User_for_an_Extended_Permission"&gt;promptpermission&lt;/a&gt; attribute. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
create_event 
&lt;/td&gt;
&lt;td&gt;
This permission allows an app to create and modify events for a user via the &lt;a title="Events.create" href="/index.php/Events.create"&gt;events.create&lt;/a&gt;, &lt;a title="Events.edit" href="/index.php/Events.edit"&gt;events.edit&lt;/a&gt; and &lt;a title="Events.cancel" href="/index.php/Events.cancel"&gt;events.cancel&lt;/a&gt; methods. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
rsvp_event 
&lt;/td&gt;
&lt;td&gt;
This permission allows an app to RSVP to an event on behalf of a user via the &lt;a title="Events.rsvp" href="/index.php/Events.rsvp"&gt;events.rsvp&lt;/a&gt; method. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
sms 
&lt;/td&gt;
&lt;td&gt;
This permission allows a &lt;a title="Mobile" href="/index.php/Mobile"&gt;mobile&lt;/a&gt; application
to send messages to the user and respond to messages from the user via text message. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
status_update 
&lt;/td&gt;
&lt;td&gt;
This permission grants your application the ability to update a user's or Facebook
Page's status with the &lt;a title="Status.set" href="/index.php/Status.set"&gt;status.set&lt;/a&gt; or &lt;a title="Users.setStatus" href="/index.php/Users.setStatus"&gt;users.setStatus&lt;/a&gt; method. 
&lt;p&gt;
&lt;b&gt;Note:&lt;/b&gt; You should prompt users for the publish_stream permission instead, since
it includes the ability to update a user's status. 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
photo_upload 
&lt;/td&gt;
&lt;td&gt;
This permission relaxes requirements on the &lt;a title="Photos.upload" href="/index.php/Photos.upload"&gt;photos.upload&lt;/a&gt; and &lt;a title="Photos.addTag" href="/index.php/Photos.addTag"&gt;photos.addTag&lt;/a&gt; methods.
If the user grants this permission, photos uploaded by the application will bypass
the pending state and the user will not have to manually approve the photos each time. 
&lt;p&gt;
&lt;b&gt;Note:&lt;/b&gt; You should prompt users for the publish_stream permission instead, since
it includes the ability to upload a photo. 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
video_upload 
&lt;/td&gt;
&lt;td&gt;
This permission allows an application to provide the mechanism for a user to &lt;a title="Video.upload" href="/index.php/Video.upload"&gt;upload
videos&lt;/a&gt; to their profile. 
&lt;p&gt;
&lt;b&gt;Note:&lt;/b&gt; You should prompt users for the publish_stream permission instead, since
it includes the ability to upload a video. 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
create_note 
&lt;/td&gt;
&lt;td&gt;
This permission allows an application to provide the mechanism for a user to &lt;a title="Notes.create" href="/index.php/Notes.create"&gt;write&lt;/a&gt;, &lt;a title="Notes.edit" href="/index.php/Notes.edit"&gt;edit&lt;/a&gt;,
and &lt;a title="Notes.delete" href="/index.php/Notes.delete"&gt;delete&lt;/a&gt; notes on their
profile. 
&lt;p&gt;
&lt;b&gt;Note:&lt;/b&gt; You should prompt users for the publish_stream permission instead, since
it includes the ability to let a user write notes. 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
share_item 
&lt;/td&gt;
&lt;td&gt;
This permission allows an application to provide the mechanism for a user to &lt;a title="Links.post" href="/index.php/Links.post"&gt;post
links&lt;/a&gt; to their profile. 
&lt;p&gt;
&lt;b&gt;Note:&lt;/b&gt; You should prompt users for the publish_stream permission instead, since
it includes the ability to let a user share links. 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&amp;#160;
&lt;/h3&gt;
&lt;h3&gt;&amp;#160;
&lt;/h3&gt;
&lt;h3&gt;Bad: Too many prompts for desktop applications
&lt;/h3&gt;
&lt;p&gt;
Although I’ve praised the extended permissions model, it currently leads to a cumbersome
experience for desktop applications. Installing Facebook desktop applications like &lt;a href="http://www.sobees.com/bdule"&gt;bdule&lt;/a&gt; or &lt;a href="http://www.facebook.com/apps/application.php?id=75647677556"&gt;Facebook
for Adobe Air&lt;/a&gt; requires running through three separate permissions screens. The
user has to login, then grant the read_stream extended permission followed by the
publish_stream extended permission. Granted, the latter two only need to be done once
but they still affect the out of box experience fairly negatively in my opinion. 
&lt;/p&gt;
&lt;p&gt;
In RSS Bandit, I’ve attempted to reduce this by delaying the prompt for publish_stream
permission until the first time a user tries to comment on a news feed item from within
the application. Streamlining this experience will be a boon for application developers
who want the entire experience to be smooth and painless. The documentation on the &lt;a href="http://wiki.developers.facebook.com/index.php/Using_the_Open_Stream_API"&gt;documentation
the Open Streams API page&lt;/a&gt; states that there are options for streamlining these
requests but they only apply to Web applications not desktop apps. &lt;img style="vertical-align: middle" title="Sad" alt="Sad" src="http://shared.live.com/o5ZS870nhiJMYQrZY6kNyQ/emoticons/smile_sad.gif" /&gt; 
&lt;/p&gt;
&lt;h3&gt;Bad: Plethora of application identifiers and authentication requirements is a
stumbling block for beginners
&lt;/h3&gt;
&lt;p&gt;
The official documentation on the Facebook API doesn’t do a good job of connecting
all the dots when it comes to understanding how to make calls to the service. For
example, when you read the &lt;a href="http://wiki.developers.facebook.com/index.php/Stream.get"&gt;documentation
for stream.get&lt;/a&gt; it is not obvious from that page what endpoint to make requests
to OR that every Facebook API call has a set of required parameters beyond the ones
listed on that page. In fact, I was stumped for about a week or so trying to figure
out the magical incantations to get the right set of parameters for API calls and
the right data to put in these parameters until I stumbled on a &lt;a href="http://forum.developers.facebook.com/viewtopic.php?id=21155"&gt;Facebook
forum post creating the 'sig' parameter&lt;/a&gt; which solved my problems. I believe I
once saw this information in the Facebook API documents but after ten minutes of searching
just now I can’t seem to find it so perhaps it was in my imagination. 
&lt;/p&gt;
&lt;p&gt;
Part of the problem is the varied number of identifiers that you have to keep straight
as an application developer including your 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
application ID 
&lt;/li&gt;
&lt;li&gt;
API key 
&lt;/li&gt;
&lt;li&gt;
application secret 
&lt;/li&gt;
&lt;li&gt;
session key 
&lt;/li&gt;
&lt;li&gt;
client secret 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The fact that various APIs take different combinations of the above lead to more than
one confusing moment for me. Eventually I figured it out but I felt like I was being
hazed as I was going through the process. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=0756234c-dd36-49e5-a17b-076f2d8f0384" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,0756234c-dd36-49e5-a17b-076f2d8f0384.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=b67d215d-d5fe-4558-b7cf-3c540c01cea7</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,b67d215d-d5fe-4558-b7cf-3c540c01cea7.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,b67d215d-d5fe-4558-b7cf-3c540c01cea7.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b67d215d-d5fe-4558-b7cf-3c540c01cea7</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Over the past few days I've been mulling over the recent news from Yahoo! that <a title="Yahoo Developer Network Blog: Introducing Y!OS 1.0 - live today!" href="http://developer.yahoo.net/blog/archives/2008/10/yos_10_launch.html">they
are building a Facebook-like platform based on OpenSocial</a>. I find this interesting
given that a number of people have come to the conclusion that Facebook is slowly
killing it's widget platform in order to replace it with <a href="http://developers.facebook.com/news.php?blog=1&amp;story=108">Facebook
Connect</a>. 
</p>
        <p>
The key reason developers believe Facebook is killing of its platform is captured
in Nick O'Neill's post entitled <a href="http://www.allfacebook.com/2008/10/scott-rafer-the-facebook-platform-is-dead/">Scott
Rafer: The Facebook Platform is Dead</a> which states 
</p>
        <blockquote>
          <p>
            <em>When speaking at the Facebook developer conference today in Berlin, Scott Rafer
declared that Facebook platform dead. He posted statistics including one that I posted
that suggests </em>
            <a href="http://www.allfacebook.com/2008/09/the-future-of-widgets-on-facebook-dead/">
              <em>Facebook
widgets are dead</em>
            </a>
            <em>. Lookery’s own statistics from Quantcast suggest that
their publisher traffic has been almost halved since the new site design was released.
Ultimately, I think we may see an increase in traffic as users become educated on
the new design but there is no doubt that developers were impacted significantly. </em>
          </p>
          <p>
            <em>So what is Scott’s solution for developers looking to thrive following the shift
to the new design? Leave the platform and jump on the Facebook Connect opportunity.</em>
          </p>
        </blockquote>
        <p>
The bottom line is that by moving applications off of the profile page in their recent
redesign, Facebook has reduced the visibility of these application thus reducing their
page views and their ability to spread virally. Some may think that the impact of
these changes is unforeseen, however the Facebook team is <a title="Facebook Blog: Data Insights in the Cards" href="http://blog.facebook.com/blog.php?post=36404072130">obsessive
about testing the impact of their UX changes</a> so it is extremely unlikely that
they aren't aware that the redesign would negatively impact Facebook applications. 
</p>
        <p>
The question to ask then is why Facebook would knowingly damaging a platform which
has been uniformly praised across the industry and has had established Web players
like Google and Yahoo! scrambling to deploy copycat efforts? Alex Iskold over at ReadWriteWeb
believes he has the answer in his post <a href="http://www.readwriteweb.com/archives/why_platforms_are_letting_us_down.php">Why
Platforms Are Letting Us Down - And What They Should Do About It</a> which contains
the following excerpt 
</p>
        <blockquote>
          <p>
            <em>When the Facebook platform was </em>
            <a href="http://www.readwriteweb.com/archives/facebook_grows_up.php">
              <em>unveiled</em>
            </a>
            <em> in
2007, it was called genius. Never before had a company in a single stroke enabled
others to tap into millions of its users completely free. The platform was </em>
            <a href="http://www.readwriteweb.com/archives/the_impact_of_facebooks_platform.php">
              <em>hailed
as a game changer</em>
            </a>
            <em> under the famous mantra "we built it and they
will come". And they did come, hundreds of companies rushing to write Facebook
applications. Companies and VC funds focused specifically on Facebook apps.</em>
          </p>
          <p>
            <em>It really did look like a revolution, but it </em>
            <a href="http://www.readwriteweb.com/archives/facebook_platform_fanfare_revisited.php">
              <em>didn't
last</em>
            </a>
            <em>. The first reason was that Facebook apps quickly arranged themselves
on a power law curve. A handful of apps (think Vampires, Byte Me and Sell My Friends)
landed millions of users, but those in the pack had hardly any. The second problem
was, ironically, the bloat. Users polluted their profiles with Facebook apps and no
one could find anything in their profiles. Facebook used to be simple - pictures,
wall, friends. Now each profile features a zoo of heterogenous apps, each one trying
to grab the user's attention to take advantage of the network effect. Users are confused.</em>
          </p>
          <p>
            <em>Worst of all, the platform had no infrastructure to <strong>monetize the applications</strong>.
When Sheryl Sandberg arrived on the scene and looked at the balance sheet, she spotted
the hefty expense that was the Facebook platform. Trying to live up to a huge valuation
isn't easy, and in the absense of big revenues people rush to cut costs. Since it
was both an expense and users were confused less than a year after its glorious launch,
Facebook decided to revamp its platform.</em>
          </p>
          <p>
            <em>The </em>
            <a href="http://www.readwriteweb.com/archives/facebook_redesign_to_go_live_tomorrow.php">
              <em>latest
release of Facebook</em>
            </a>
            <em>, which was released in July, makes it nearly impossible
for new applications to take advantage of the network effect. Now users must first
install the application, then find it under the application menu or one of the tabs,
then check a bunch of boxes to add it to their profile (old applications are grand-daddied
in). Facebook has sent a clear message to developers - <strong>the platform is no
longer a priority</strong>.</em>
          </p>
        </blockquote>
        <p>
Alex's assertion is that after Facebook looked at the pros and cons of their widget
platform, the company came to the conclusion that the platform was turning into a
cost center instead of being away to improve the value of Facebook to its users. There
is evidence that applications built on Facebook's platform did cause negative reactions
from its users. For example, there was the creation of the "This has got to stop…pointless
applications are ruining Facebook" group which at its height had <a title="Infoworld | Social Tech | This has got to stop" href="http://weblog.infoworld.com/social-media-360/archives/2008/01/social_media_cl.html">half
a million Facebook users protesting the behavior of Facebook apps</a>. In addition,
the creation of Facebook's <a href="http://developers.facebook.com/greatapps.php">Great
Apps program</a> along with the <a href="http://developers.facebook.com/get_started.php?tab=principles">guiding
principles for building Facebook applications</a> implies that the Facebook team realized
that applications being built on their platform typically don't have their users best
interests at heart. 
</p>
        <p>
This brings up the interesting point that although there has been <a href="http://ventureexplorer.typepad.com/ventureexplorer/2007/10/making-money-fr.html">a
lot of discussion on how Facebook apps make money</a> there haven't been similar conversations
on how the application platform improves Facebook's bottom line. There is definitely
a win-win equation when so-called "great apps" like <a href="http://apps.facebook.com/ilike">iLike</a> and <a href="http://apps.facebook.com/causes">Causes</a>,
which positively increase user engagement, are built on Facebook's platform. However
there is also a long tail of applications that try their best to <u>spread virally</u> at
the cost of decreasing user satisfaction in the Facebook experience. These dissatisfied
users likely end up reducing their usage of Facebook thus actually costing Facebook
users and page views. It is quite possible that the few "great apps" built
on the Facebook platform do not outweigh the amount of not-so-great apps built on
the platform which have caused users to protest in the past. This would confirm Alex
Iskold's suspicions about why Facebook has started sabotaging the popularity of applications
built on its platform and has started emphasizing partnerships via Facebook Connect. 
</p>
        <hr />
        <p>
A similar situation has occurred with regards to the Java platform and Sun Microsystems.
The sentiment is captured in a Javaworl article by Josh Fruhlinger entitled <a title="http://www.javaworld.com/community/?q=node/1595" href="http://www.javaworld.com/community/?q=node/1595">Sun
melting down, and where's Java?</a> which contains the following excerpt 
</p>
        <blockquote>
          <p>
            <em>one of the most interesting things about the coverage of the company's problems
is how Java figures into the conversation, which is exactly not at all. In most of
the articles, the word only appears as Sun's stock ticker; the closest I could find
to a mention is in </em>
            <a href="http://ap.google.com/article/ALeqM5jChZMpBmKAik91WVYeMBgR3vOoegD93UGE3G0">
              <em>this
AP story</em>
            </a>
            <em>, which notes that "Sun's strategy of developing free, 'open-source'
software and giving it away to spur sales of its high-end computer servers and support
services hasn't paid off as investors would like." Even longtime tech journalist
Ashlee Vance, when gamely badgering Jon Schwartz for the New York Time about whether </em>
            <a href="http://bits.blogs.nytimes.com/2008/10/09/sun-microsystems-a-lesson-in-failed-cosmetic-surgery/">
              <em>Sun
would sell its hardware division and focus on software</em>
            </a>
            <em>, only mentions
Solaris and MySQL in discussing the latter.</em>
          </p>
          <p>
            <em>Those in the Java community no doubt believe that Java is too big to fail, that
Sun can't abandon it because it's too important, even if it can't tangibly be tied
to anything profitable. But if Sun's investors eventually dismember the company to
try to extract what value is left in it, I'm not sure where Java will fit into that
plan.</em>
          </p>
        </blockquote>
        <p>
        </p>
        <p>
          <a title="http://www.allfacebook.com/2008/10/scott-rafer-the-facebook-platform-is-dead/" href="http://www.allfacebook.com/2008/10/scott-rafer-the-facebook-platform-is-dead/">
          </a>
        </p>
        <p>
It is interesting to note that after a decade of investment in the Java platform,
it is hard to point to what concrete benefits Sun has gotten from being the originator
and steward of the Java platform and programming language. Definitely another example
of a platform that may have benefited applications built on it yet which didn't really
benefit the platform vendor as expected. 
</p>
        <p>
The lesson here is that building a platform isn't just about making the developers
who use the platform successful but also making sure that the platform itself furthers
the goals of its developers in the first place. 
</p>
        <p>
          <img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Kardinal Offishall&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Kardinal
Offishall</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Kardinal Offishall+Dangerous  (Feat. Akon)&amp;x=0&amp;y=0">Dangerous
(Feat. Akon)</a><img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b67d215d-d5fe-4558-b7cf-3c540c01cea7" />
      </body>
      <title>Platform Monetization is a Two Way Street: Lessons from Facebook and Sun Microsystems</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,b67d215d-d5fe-4558-b7cf-3c540c01cea7.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/10/31/PlatformMonetizationIsATwoWayStreetLessonsFromFacebookAndSunMicrosystems.aspx</link>
      <pubDate>Fri, 31 Oct 2008 08:49:09 GMT</pubDate>
      <description>&lt;p&gt;
Over the past few days I've been mulling over the recent news from Yahoo! that &lt;a title="Yahoo Developer Network Blog: Introducing Y!OS 1.0 - live today!" href="http://developer.yahoo.net/blog/archives/2008/10/yos_10_launch.html"&gt;they
are building a Facebook-like platform based on OpenSocial&lt;/a&gt;. I find this interesting
given that a number of people have come to the conclusion that Facebook is slowly
killing it's widget platform in order to replace it with &lt;a href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=108"&gt;Facebook
Connect&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The key reason developers believe Facebook is killing of its platform is captured
in Nick O'Neill's post entitled &lt;a href="http://www.allfacebook.com/2008/10/scott-rafer-the-facebook-platform-is-dead/"&gt;Scott
Rafer: The Facebook Platform is Dead&lt;/a&gt; which states 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;When speaking at the Facebook developer conference today in Berlin, Scott Rafer
declared that Facebook platform dead. He posted statistics including one that I posted
that suggests &lt;/em&gt;&lt;a href="http://www.allfacebook.com/2008/09/the-future-of-widgets-on-facebook-dead/"&gt;&lt;em&gt;Facebook
widgets are dead&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Lookery’s own statistics from Quantcast suggest that
their publisher traffic has been almost halved since the new site design was released.
Ultimately, I think we may see an increase in traffic as users become educated on
the new design but there is no doubt that developers were impacted significantly. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;So what is Scott’s solution for developers looking to thrive following the shift
to the new design? Leave the platform and jump on the Facebook Connect opportunity.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The bottom line is that by moving applications off of the profile page in their recent
redesign, Facebook has reduced the visibility of these application thus reducing their
page views and their ability to spread virally. Some may think that the impact of
these changes is unforeseen, however the Facebook team is &lt;a title="Facebook Blog: Data Insights in the Cards" href="http://blog.facebook.com/blog.php?post=36404072130"&gt;obsessive
about testing the impact of their UX changes&lt;/a&gt; so it is extremely unlikely that
they aren't aware that the redesign would negatively impact Facebook applications. 
&lt;/p&gt;
&lt;p&gt;
The question to ask then is why Facebook would knowingly damaging a platform which
has been uniformly praised across the industry and has had established Web players
like Google and Yahoo! scrambling to deploy copycat efforts? Alex Iskold over at ReadWriteWeb
believes he has the answer in his post &lt;a href="http://www.readwriteweb.com/archives/why_platforms_are_letting_us_down.php"&gt;Why
Platforms Are Letting Us Down - And What They Should Do About It&lt;/a&gt; which contains
the following excerpt 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;When the Facebook platform was &lt;/em&gt;&lt;a href="http://www.readwriteweb.com/archives/facebook_grows_up.php"&gt;&lt;em&gt;unveiled&lt;/em&gt;&lt;/a&gt;&lt;em&gt; in
2007, it was called genius. Never before had a company in a single stroke enabled
others to tap into millions of its users completely free. The platform was &lt;/em&gt;&lt;a href="http://www.readwriteweb.com/archives/the_impact_of_facebooks_platform.php"&gt;&lt;em&gt;hailed
as a game changer&lt;/em&gt;&lt;/a&gt;&lt;em&gt; under the famous mantra &amp;quot;we built it and they
will come&amp;quot;. And they did come, hundreds of companies rushing to write Facebook
applications. Companies and VC funds focused specifically on Facebook apps.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;It really did look like a revolution, but it &lt;/em&gt;&lt;a href="http://www.readwriteweb.com/archives/facebook_platform_fanfare_revisited.php"&gt;&lt;em&gt;didn't
last&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. The first reason was that Facebook apps quickly arranged themselves
on a power law curve. A handful of apps (think Vampires, Byte Me and Sell My Friends)
landed millions of users, but those in the pack had hardly any. The second problem
was, ironically, the bloat. Users polluted their profiles with Facebook apps and no
one could find anything in their profiles. Facebook used to be simple - pictures,
wall, friends. Now each profile features a zoo of heterogenous apps, each one trying
to grab the user's attention to take advantage of the network effect. Users are confused.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Worst of all, the platform had no infrastructure to &lt;strong&gt;monetize the applications&lt;/strong&gt;.
When Sheryl Sandberg arrived on the scene and looked at the balance sheet, she spotted
the hefty expense that was the Facebook platform. Trying to live up to a huge valuation
isn't easy, and in the absense of big revenues people rush to cut costs. Since it
was both an expense and users were confused less than a year after its glorious launch,
Facebook decided to revamp its platform.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The &lt;/em&gt;&lt;a href="http://www.readwriteweb.com/archives/facebook_redesign_to_go_live_tomorrow.php"&gt;&lt;em&gt;latest
release of Facebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, which was released in July, makes it nearly impossible
for new applications to take advantage of the network effect. Now users must first
install the application, then find it under the application menu or one of the tabs,
then check a bunch of boxes to add it to their profile (old applications are grand-daddied
in). Facebook has sent a clear message to developers - &lt;strong&gt;the platform is no
longer a priority&lt;/strong&gt;.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Alex's assertion is that after Facebook looked at the pros and cons of their widget
platform, the company came to the conclusion that the platform was turning into a
cost center instead of being away to improve the value of Facebook to its users. There
is evidence that applications built on Facebook's platform did cause negative reactions
from its users. For example, there was the creation of the &amp;quot;This has got to stop…pointless
applications are ruining Facebook&amp;quot; group which at its height had &lt;a title="Infoworld | Social Tech | This has got to stop" href="http://weblog.infoworld.com/social-media-360/archives/2008/01/social_media_cl.html"&gt;half
a million Facebook users protesting the behavior of Facebook apps&lt;/a&gt;. In addition,
the creation of Facebook's &lt;a href="http://developers.facebook.com/greatapps.php"&gt;Great
Apps program&lt;/a&gt; along with the &lt;a href="http://developers.facebook.com/get_started.php?tab=principles"&gt;guiding
principles for building Facebook applications&lt;/a&gt; implies that the Facebook team realized
that applications being built on their platform typically don't have their users best
interests at heart. 
&lt;/p&gt;
&lt;p&gt;
This brings up the interesting point that although there has been &lt;a href="http://ventureexplorer.typepad.com/ventureexplorer/2007/10/making-money-fr.html"&gt;a
lot of discussion on how Facebook apps make money&lt;/a&gt; there haven't been similar conversations
on how the application platform improves Facebook's bottom line. There is definitely
a win-win equation when so-called &amp;quot;great apps&amp;quot; like &lt;a href="http://apps.facebook.com/ilike"&gt;iLike&lt;/a&gt; and &lt;a href="http://apps.facebook.com/causes"&gt;Causes&lt;/a&gt;,
which positively increase user engagement, are built on Facebook's platform. However
there is also a long tail of applications that try their best to &lt;u&gt;spread virally&lt;/u&gt; at
the cost of decreasing user satisfaction in the Facebook experience. These dissatisfied
users likely end up reducing their usage of Facebook thus actually costing Facebook
users and page views. It is quite possible that the few &amp;quot;great apps&amp;quot; built
on the Facebook platform do not outweigh the amount of not-so-great apps built on
the platform which have caused users to protest in the past. This would confirm Alex
Iskold's suspicions about why Facebook has started sabotaging the popularity of applications
built on its platform and has started emphasizing partnerships via Facebook Connect. 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
A similar situation has occurred with regards to the Java platform and Sun Microsystems.
The sentiment is captured in a Javaworl article by Josh Fruhlinger entitled &lt;a title="http://www.javaworld.com/community/?q=node/1595" href="http://www.javaworld.com/community/?q=node/1595"&gt;Sun
melting down, and where's Java?&lt;/a&gt; which contains the following excerpt 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;one of the most interesting things about the coverage of the company's problems
is how Java figures into the conversation, which is exactly not at all. In most of
the articles, the word only appears as Sun's stock ticker; the closest I could find
to a mention is in &lt;/em&gt;&lt;a href="http://ap.google.com/article/ALeqM5jChZMpBmKAik91WVYeMBgR3vOoegD93UGE3G0"&gt;&lt;em&gt;this
AP story&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, which notes that &amp;quot;Sun's strategy of developing free, 'open-source'
software and giving it away to spur sales of its high-end computer servers and support
services hasn't paid off as investors would like.&amp;quot; Even longtime tech journalist
Ashlee Vance, when gamely badgering Jon Schwartz for the New York Time about whether &lt;/em&gt;&lt;a href="http://bits.blogs.nytimes.com/2008/10/09/sun-microsystems-a-lesson-in-failed-cosmetic-surgery/"&gt;&lt;em&gt;Sun
would sell its hardware division and focus on software&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, only mentions
Solaris and MySQL in discussing the latter.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Those in the Java community no doubt believe that Java is too big to fail, that
Sun can't abandon it because it's too important, even if it can't tangibly be tied
to anything profitable. But if Sun's investors eventually dismember the company to
try to extract what value is left in it, I'm not sure where Java will fit into that
plan.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://www.allfacebook.com/2008/10/scott-rafer-the-facebook-platform-is-dead/" href="http://www.allfacebook.com/2008/10/scott-rafer-the-facebook-platform-is-dead/"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
It is interesting to note that after a decade of investment in the Java platform,
it is hard to point to what concrete benefits Sun has gotten from being the originator
and steward of the Java platform and programming language. Definitely another example
of a platform that may have benefited applications built on it yet which didn't really
benefit the platform vendor as expected. 
&lt;/p&gt;
&lt;p&gt;
The lesson here is that building a platform isn't just about making the developers
who use the platform successful but also making sure that the platform itself furthers
the goals of its developers in the first place. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Kardinal Offishall&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Kardinal
Offishall&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Kardinal Offishall+Dangerous  (Feat. Akon)&amp;amp;x=0&amp;amp;y=0"&gt;Dangerous
(Feat. Akon)&lt;/a&gt; &lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b67d215d-d5fe-4558-b7cf-3c540c01cea7" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,b67d215d-d5fe-4558-b7cf-3c540c01cea7.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=f6ea3ddb-5a0a-4ee7-89c2-a7751bce2fd5</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,f6ea3ddb-5a0a-4ee7-89c2-a7751bce2fd5.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,f6ea3ddb-5a0a-4ee7-89c2-a7751bce2fd5.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f6ea3ddb-5a0a-4ee7-89c2-a7751bce2fd5</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just because you aren't attending Microsoft's Professional Developer Conference doesn't
mean you can't follow the announcements. The most exciting announcement so far [from
my perspective] has been <a href="http://www.microsoft.com/azure/">Windows Azure</a> which
is described as follows from <a href="http://www.microsoft.com/azure/whatisazure.mspx">the
official site</a></p>
        <blockquote>
          <p>
            <em>The Azure™ Services Platform (Azure) is an internet-scale cloud services platform
hosted in Microsoft data centers, which provides an operating system and a set of
developer services that can be used individually or together. Azure’s flexible and
interoperable platform can be used to build new applications to run from the cloud
or enhance existing applications with cloud-based capabilities. Its open architecture
gives developers the choice to build web applications, applications running on connected
devices, PCs, servers, or hybrid solutions offering the best of online and on-premises.</em>
          </p>
          <p>
            <em>Azure reduces the need for up-front technology purchases, and it enables developers
to quickly and easily create applications running in the cloud by using their existing
skills with the Microsoft Visual Studio development environment and the Microsoft
.NET Framework. In addition to managed code languages supported by .NET, Azure will
support more programming languages and development environments in the near future.
Azure simplifies maintaining and operating applications by providing on-demand compute
and storage to host, scale, and manage web and connected applications. Infrastructure
management is automated with a platform that is designed for high availability and
dynamic scaling to match usage needs with the option of a pay-as-you-go pricing model.
Azure provides an open, standards-based and interoperable environment with support
for multiple internet protocols, including HTTP, REST, SOAP, and XML.</em>
          </p>
        </blockquote>
        <p>
It will be interesting to read what developers make of this announcement and what
kind of apps start getting built on this platform. I'll also be on the look out for
any in depth discussions on the platform, there is lots to chew on in this announcement. 
</p>
        <p>
For a quick overview of what Azure means to developers, take a look at <a href="http://www.microsoft.com/azure/business.mspx">Azure
for Business</a> and <a href="http://www.microsoft.com/azure/webdev.mspx">Azure for
Web Developers</a>.  
</p>
        <p>
          <img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Guns N' Roses&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Guns
N' Roses</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Guns N' Roses+Welcome to the Jungle&amp;x=0&amp;y=0">Welcome
to the Jungle</a><img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=f6ea3ddb-5a0a-4ee7-89c2-a7751bce2fd5" />
      </body>
      <title>Microsoft Announces Windows Azure</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,f6ea3ddb-5a0a-4ee7-89c2-a7751bce2fd5.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/10/27/MicrosoftAnnouncesWindowsAzure.aspx</link>
      <pubDate>Mon, 27 Oct 2008 17:39:04 GMT</pubDate>
      <description>&lt;p&gt;
Just because you aren't attending Microsoft's Professional Developer Conference doesn't
mean you can't follow the announcements. The most exciting announcement so far [from
my perspective] has been &lt;a href="http://www.microsoft.com/azure/"&gt;Windows Azure&lt;/a&gt; which
is described as follows from &lt;a href="http://www.microsoft.com/azure/whatisazure.mspx"&gt;the
official site&lt;/a&gt; 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;The Azure™ Services Platform (Azure) is an internet-scale cloud services platform
hosted in Microsoft data centers, which provides an operating system and a set of
developer services that can be used individually or together. Azure’s flexible and
interoperable platform can be used to build new applications to run from the cloud
or enhance existing applications with cloud-based capabilities. Its open architecture
gives developers the choice to build web applications, applications running on connected
devices, PCs, servers, or hybrid solutions offering the best of online and on-premises.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Azure reduces the need for up-front technology purchases, and it enables developers
to quickly and easily create applications running in the cloud by using their existing
skills with the Microsoft Visual Studio development environment and the Microsoft
.NET Framework. In addition to managed code languages supported by .NET, Azure will
support more programming languages and development environments in the near future.
Azure simplifies maintaining and operating applications by providing on-demand compute
and storage to host, scale, and manage web and connected applications. Infrastructure
management is automated with a platform that is designed for high availability and
dynamic scaling to match usage needs with the option of a pay-as-you-go pricing model.
Azure provides an open, standards-based and interoperable environment with support
for multiple internet protocols, including HTTP, REST, SOAP, and XML.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
It will be interesting to read what developers make of this announcement and what
kind of apps start getting built on this platform. I'll also be on the look out for
any in depth discussions on the platform, there is lots to chew on in this announcement. 
&lt;/p&gt;
&lt;p&gt;
For a quick overview of what Azure means to developers, take a look at &lt;a href="http://www.microsoft.com/azure/business.mspx"&gt;Azure
for Business&lt;/a&gt; and &lt;a href="http://www.microsoft.com/azure/webdev.mspx"&gt;Azure for
Web Developers&lt;/a&gt;.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Guns N' Roses&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Guns
N' Roses&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Guns N' Roses+Welcome to the Jungle&amp;amp;x=0&amp;amp;y=0"&gt;Welcome
to the Jungle&lt;/a&gt; &lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=f6ea3ddb-5a0a-4ee7-89c2-a7751bce2fd5" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,f6ea3ddb-5a0a-4ee7-89c2-a7751bce2fd5.aspx</comments>
      <category>Platforms</category>
      <category>Windows Live</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=8d0777b1-d74a-482e-805f-55f1af6880a8</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,8d0777b1-d74a-482e-805f-55f1af6880a8.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,8d0777b1-d74a-482e-805f-55f1af6880a8.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=8d0777b1-d74a-482e-805f-55f1af6880a8</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Tim Bray has a thought provoking post on embracing cloud computing entitled <a href="http://www.tbray.org/ongoing/When/200x/2008/10/14/Cloudy-Times">Get
In the Cloud</a> where he brings up the problem of vendor lock-in. He writes 
</p>
        <blockquote>
          <p>
            <em>
              <u>Tech Issue</u> · But there are two problems. The small problem is that we haven’t
quite figured out the architectural sweet spot for cloud platforms. Is it Amazon’s
EC2/S3 “Naked virtual whitebox” model? Is it a Platform-as-a-service flavor like Google
App Engine? We just don’t know yet; stay tuned. </em>
          </p>
          <p>
            <em>
              <u>Big Issue</u> · I mean a really big issue: if cloud computing is going to take
off, it absolutely, totally, must be lockin-free. What that means if that I’m deploying
my app on Vendor X’s platform, there have to be other vendors Y and Z such that I
can pull my app and its data off X and it’ll all run with minimal tweaks on either
Y or Z. </em>
          </p>
          <p>
            <em>At the moment, I don’t think either the Amazon or Google offerings qualify.</em>
          </p>
          <p>
            <em>Are we so deranged here in the twenty-first century that we’re going to re-enact,
wide-eyed, the twin tragedies of the great desktop-suite lock-in and the great proprietary-SQL
lock-in? You know, the ones where you give a platform vendor control over your IT
budget? Gimme a break.</em>
          </p>
          <p>
            <em>I’m simply not interested in any cloud offering at any level unless it offers
zero barrier-to-exit.</em>
          </p>
        </blockquote>
        <p>
Tim's post is about cloud platforms but I think it is useful to talk about avoiding
lock-in when taking a bet on cloud based applications as well as when embracing cloud
based platforms. This is especially true when you consider that moving from one application
to another is a similar yet smaller scoped problem compared to moving from one Web
development platform to another. 
</p>
        <p>
So let's say your organization wants to move from a cloud based office suite like <a href="http://www.google.com/apps/intl/en/business/index.html">Google
Apps for Business</a> to <a href="http://www.zoho.com/">Zoho</a>. The first question
you have to ask yourself is whether it is possible to extract all of your organization's
data from one service and import it <u>without data loss</u> into another. For business
documents this should be straightforward thanks to standards like <a href="http://en.wikipedia.org/wiki/OpenDocument">ODF</a> and <a href="http://en.wikipedia.org/wiki/Office_Open_XML">OOXML</a>.
However there are points to consider such as whether there is an automated way to
perform such bulk imports and exports or whether individuals have to manually export
and/or import their online documents to these standard formats. Thus the second question
is how expensive it is for your organization to move the data. The cost includes everything
from the potential organizational downtime to account for switching services to the
actual IT department cost of moving all the data. At this point, you then have to
weigh the impact of all the links and references to your organization's data that
will be broken by your switch. I don't just mean links to documents returning 404
because you have switched from being hosted at google.com to zoho.com but more insidious
problems like the broken experience of anyone who is using the calendar or document
sharing feature of the service to give specific people access to their data. Also
you have to ensure that email that is sent to your organization after the switch goes
to the right place. Making this aspect of the transition smooth will likely be the
most difficult part of the migration since it requires more control over application
resources than application service providers typically give their customers. Finally,
you will have to evaluate which features you will lose by switching applications and
ensure that none of them is mission critical to your business. 
</p>
        <p>
Despite all of these concerns, switching hosted application providers is mostly a
tractable problem. Standard data formats make data migration feasible although it
might be unwieldy to extract the data from the service. In addition, Internet technologies
like SMTP and HTTP all have built in ways to handle forwarding/redirecting references
so that they aren't broken. However although the technology makes it possible, the
majority of hosted application providers fall far short of making it easy to <u>fully
migrate</u> to or away from their service without significant effort. 
</p>
        <p>
When it comes to cloud computing platforms, you have all of the same problems described
above and a few extra ones. The key wrinkle with cloud computing platforms is that
there is no standardization of the APIs and platform technologies that underlie these
services. The APIs provided by Amazon's cloud computing platform (<a href="http://aws.amazon.com/ec2/">EC2</a>/<a href="http://aws.amazon.com/s3/">S3</a>/<a href="aws.amazon.com/ebs">EBS</a>/etc)
are radically different from those provided by Google App Engine (<a href="http://code.google.com/appengine/docs/datastore/">Datastore
API</a>/<a href="http://code.google.com/appengine/docs/python/">Python runtime</a>/<a href="http://code.google.com/appengine/docs/images/">Images
API</a>/etc). For zero lock-in to occur in this space, there need to be multiple providers
of the same underlying APIs. Otherwise, migrating between cloud computing platforms
will be more like switching your application from Ruby on Rails and MySQL to Django
and PostgreSQL (i.e. a complete rewrite). 
</p>
        <p>
In response to Tim Bray's post, Dewitt Clinton of Google <a href="http://www.tbray.org/ongoing/When/200x/2008/10/14/Cloudy-Times#c1224084071.570560">left
a comment</a> which is excerpted below
</p>
        <blockquote>
          <p>
            <em>That's why I asked -- you can already do that in both the case of Amazon's services
and App Engine. Sure, in the case of EC2 and S3 you'll need to find a new place to
host the image and a new backend for the data, but Amazon isn't trying to stop you
from doing that. (Actually not sure about the AMI format licensing, but I assumed
it was supposed to be open.)</em>
          </p>
          <p>
            <em>In App Engine's case people can run the open source userland stack (which exposes
the API you code to) on other providers any time the want, and there are plenty of
open source bigtable implementations to chose from. Granted, bulk export of data is
still a bit of a manual process, but it is doable even today and we're working to
make it even easier.</em>
          </p>
          <p>
            <em>Ae you saying that lock-in is avoided only once the alternative hosts exist?</em>
          </p>
          <p>
            <em>But how does Amazon or Google facilitate that, beyond getting licensing correct
and open sourcing as much code as they can? Obviously we can't be the ones setting
up the alternative instances. (Though we can cheer for them, like we did when we saw
the App Engine API implemented on top of EC2 and S3.)</em>
          </p>
          <p>
            <em>To Doug Cutting's very good point, the way Amazon and Google (and everyone else
in this space) seem to be trying to compete is by offering the best value, in terms
of reliability (uptime, replication) and performance (data locality, latency, etc)
and monitoring and management tools. Which is as it should be.</em>
          </p>
        </blockquote>
        <p>
Although Dewitt is correct that Google and Amazon are not explicitly trying to lock-in
customers to their platform, the fact is that today if a customer has heavily invested
in either platform then there isn't a straightforward way for customers to extricate
themselves from the platform and switch to another vendor. In addition there <u>is
not</u> a competitive marketplace of vendors providing standard/interoperable platforms
as there are with email hosting or Web hosting providers. 
</p>
        <p>
As long as these conditions remain the same, it may be that lock-in is too strong
a word describe the situation but it is clear that the options facing adopters of
cloud computing platforms aren't great when it comes to vendor choice. 
</p>
        <p>
          <img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Britney Spears&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Britney
Spears</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Britney Spears+Womanizer&amp;x=0&amp;y=0">Womanizer</a><img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=8d0777b1-d74a-482e-805f-55f1af6880a8" />
      </body>
      <title>Cloud Computing and Vendor Lock-In</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,8d0777b1-d74a-482e-805f-55f1af6880a8.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/10/19/CloudComputingAndVendorLockIn.aspx</link>
      <pubDate>Sun, 19 Oct 2008 07:47:46 GMT</pubDate>
      <description>&lt;p&gt;
Tim Bray has a thought provoking post on embracing cloud computing entitled &lt;a href="http://www.tbray.org/ongoing/When/200x/2008/10/14/Cloudy-Times"&gt;Get
In the Cloud&lt;/a&gt; where he brings up the problem of vendor lock-in. He writes 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;&lt;u&gt;Tech Issue&lt;/u&gt; · But there are two problems. The small problem is that we haven’t
quite figured out the architectural sweet spot for cloud platforms. Is it Amazon’s
EC2/S3 “Naked virtual whitebox” model? Is it a Platform-as-a-service flavor like Google
App Engine? We just don’t know yet; stay tuned. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;u&gt;Big Issue&lt;/u&gt; · I mean a really big issue: if cloud computing is going to take
off, it absolutely, totally, must be lockin-free. What that means if that I’m deploying
my app on Vendor X’s platform, there have to be other vendors Y and Z such that I
can pull my app and its data off X and it’ll all run with minimal tweaks on either
Y or Z. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;At the moment, I don’t think either the Amazon or Google offerings qualify.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Are we so deranged here in the twenty-first century that we’re going to re-enact,
wide-eyed, the twin tragedies of the great desktop-suite lock-in and the great proprietary-SQL
lock-in? You know, the ones where you give a platform vendor control over your IT
budget? Gimme a break.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;I’m simply not interested in any cloud offering at any level unless it offers
zero barrier-to-exit.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Tim's post is about cloud platforms but I think it is useful to talk about avoiding
lock-in when taking a bet on cloud based applications as well as when embracing cloud
based platforms. This is especially true when you consider that moving from one application
to another is a similar yet smaller scoped problem compared to moving from one Web
development platform to another. 
&lt;/p&gt;
&lt;p&gt;
So let's say your organization wants to move from a cloud based office suite like &lt;a href="http://www.google.com/apps/intl/en/business/index.html"&gt;Google
Apps for Business&lt;/a&gt; to &lt;a href="http://www.zoho.com/"&gt;Zoho&lt;/a&gt;. The first question
you have to ask yourself is whether it is possible to extract all of your organization's
data from one service and import it &lt;u&gt;without data loss&lt;/u&gt; into another. For business
documents this should be straightforward thanks to standards like &lt;a href="http://en.wikipedia.org/wiki/OpenDocument"&gt;ODF&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Office_Open_XML"&gt;OOXML&lt;/a&gt;.
However there are points to consider such as whether there is an automated way to
perform such bulk imports and exports or whether individuals have to manually export
and/or import their online documents to these standard formats. Thus the second question
is how expensive it is for your organization to move the data. The cost includes everything
from the potential organizational downtime to account for switching services to the
actual IT department cost of moving all the data. At this point, you then have to
weigh the impact of all the links and references to your organization's data that
will be broken by your switch. I don't just mean links to documents returning 404
because you have switched from being hosted at google.com to zoho.com but more insidious
problems like the broken experience of anyone who is using the calendar or document
sharing feature of the service to give specific people access to their data. Also
you have to ensure that email that is sent to your organization after the switch goes
to the right place. Making this aspect of the transition smooth will likely be the
most difficult part of the migration since it requires more control over application
resources than application service providers typically give their customers. Finally,
you will have to evaluate which features you will lose by switching applications and
ensure that none of them is mission critical to your business. 
&lt;/p&gt;
&lt;p&gt;
Despite all of these concerns, switching hosted application providers is mostly a
tractable problem. Standard data formats make data migration feasible although it
might be unwieldy to extract the data from the service. In addition, Internet technologies
like SMTP and HTTP all have built in ways to handle forwarding/redirecting references
so that they aren't broken. However although the technology makes it possible, the
majority of hosted application providers fall far short of making it easy to &lt;u&gt;fully
migrate&lt;/u&gt; to or away from their service without significant effort. 
&lt;/p&gt;
&lt;p&gt;
When it comes to cloud computing platforms, you have all of the same problems described
above and a few extra ones. The key wrinkle with cloud computing platforms is that
there is no standardization of the APIs and platform technologies that underlie these
services. The APIs provided by Amazon's cloud computing platform (&lt;a href="http://aws.amazon.com/ec2/"&gt;EC2&lt;/a&gt;/&lt;a href="http://aws.amazon.com/s3/"&gt;S3&lt;/a&gt;/&lt;a href="aws.amazon.com/ebs"&gt;EBS&lt;/a&gt;/etc)
are radically different from those provided by Google App Engine (&lt;a href="http://code.google.com/appengine/docs/datastore/"&gt;Datastore
API&lt;/a&gt;/&lt;a href="http://code.google.com/appengine/docs/python/"&gt;Python runtime&lt;/a&gt;/&lt;a href="http://code.google.com/appengine/docs/images/"&gt;Images
API&lt;/a&gt;/etc). For zero lock-in to occur in this space, there need to be multiple providers
of the same underlying APIs. Otherwise, migrating between cloud computing platforms
will be more like switching your application from Ruby on Rails and MySQL to Django
and PostgreSQL (i.e. a complete rewrite). 
&lt;/p&gt;
&lt;p&gt;
In response to Tim Bray's post, Dewitt Clinton of Google &lt;a href="http://www.tbray.org/ongoing/When/200x/2008/10/14/Cloudy-Times#c1224084071.570560"&gt;left
a comment&lt;/a&gt; which is excerpted below
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;That's why I asked -- you can already do that in both the case of Amazon's services
and App Engine. Sure, in the case of EC2 and S3 you'll need to find a new place to
host the image and a new backend for the data, but Amazon isn't trying to stop you
from doing that. (Actually not sure about the AMI format licensing, but I assumed
it was supposed to be open.)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;In App Engine's case people can run the open source userland stack (which exposes
the API you code to) on other providers any time the want, and there are plenty of
open source bigtable implementations to chose from. Granted, bulk export of data is
still a bit of a manual process, but it is doable even today and we're working to
make it even easier.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Ae you saying that lock-in is avoided only once the alternative hosts exist?&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;But how does Amazon or Google facilitate that, beyond getting licensing correct
and open sourcing as much code as they can? Obviously we can't be the ones setting
up the alternative instances. (Though we can cheer for them, like we did when we saw
the App Engine API implemented on top of EC2 and S3.)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;To Doug Cutting's very good point, the way Amazon and Google (and everyone else
in this space) seem to be trying to compete is by offering the best value, in terms
of reliability (uptime, replication) and performance (data locality, latency, etc)
and monitoring and management tools. Which is as it should be.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Although Dewitt is correct that Google and Amazon are not explicitly trying to lock-in
customers to their platform, the fact is that today if a customer has heavily invested
in either platform then there isn't a straightforward way for customers to extricate
themselves from the platform and switch to another vendor. In addition there &lt;u&gt;is
not&lt;/u&gt; a competitive marketplace of vendors providing standard/interoperable platforms
as there are with email hosting or Web hosting providers. 
&lt;/p&gt;
&lt;p&gt;
As long as these conditions remain the same, it may be that lock-in is too strong
a word describe the situation but it is clear that the options facing adopters of
cloud computing platforms aren't great when it comes to vendor choice. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Britney Spears&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Britney
Spears&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Britney Spears+Womanizer&amp;amp;x=0&amp;amp;y=0"&gt;Womanizer&lt;/a&gt; &lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=8d0777b1-d74a-482e-805f-55f1af6880a8" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,8d0777b1-d74a-482e-805f-55f1af6880a8.aspx</comments>
      <category>Platforms</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=b2b365eb-7b04-4dba-911b-8008e83e020a</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,b2b365eb-7b04-4dba-911b-8008e83e020a.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,b2b365eb-7b04-4dba-911b-8008e83e020a.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b2b365eb-7b04-4dba-911b-8008e83e020a</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Werner Vogels, CTO of Amazon, writes in his blog post <a href="http://www.allthingsdistributed.com/2008/09/amazon_ec2_with_microsoft_wind.html">Expanding
the Cloud: Microsoft Windows Server on Amazon EC2</a> that 
</p>
        <blockquote>
          <p>
            <em>With </em>
            <a href="http://aws.amazon.com/windows/">
              <em>today's announcement</em>
            </a>
            <em> that
Microsoft Windows Server is available on </em>
            <a href="http://aws.amazon.com/ec2">
              <em>Amazon
EC2</em>
            </a>
            <em> we can now run the majority of popular software systems in the cloud.
Windows Server ranked very high on the list of requests by customers so we are happy
that we will be able to provide this. </em>
          </p>
          <p>
            <em>One particular area that customers have been asking for </em>
            <a href="http://aws.amazon.com/windows/">
              <em>Amazon
EC2 with Windows Server</em>
            </a>
            <em> was for Windows Media transcoding and streaming.
There is a range of excellent codecs available for Windows Media and there is a large
amount of legacy content in those formats. In past weeks I met with a number of folks
from the entertainment industry and often their first question was: when can we run
on windows? </em>
          </p>
          <p>
            <em>There are many different reasons why customers have requested Windows Server;
for example many customers want to run ASP.NET websites using Internet Information
Server and use Microsoft SQL Server as their database. Amazon EC2 running Windows
Server enables this scenario for building scalable websites. In addition, several
customers would like to maintain a global single Windows-based desktop environment
using Microsoft Remote Desktop, and Amazon EC2 is a scalable and dependable platform
on which to do so.</em>
          </p>
        </blockquote>
        <p>
This is great news. I'm starting a month long vacation as a precursor to my paternity
leave since <u>the baby</u> is due next week and was looking to do some long overdue
hacking in-between burping the baby and changing diapers. My choices were 
</p>
        <ul>
          <li>
Facebook platform app 
</li>
          <li>
Google App Engine app</li>
          <li>
EC2/S3/EBS app 
</li>
        </ul>
        <p>
The problem with Amazon was the need to use Linux which I haven't seriously messed
with since my college days running SuSe. If I could use Windows Server and ASP.NET
while still learning the nuances of EC2/S3/EBS that would be quite sweet. 
</p>
        <p>
I wonder how who I need to holler at to get in the Windows Server on EC2 beta? Maybe <a href="http://nothing-more.blogspot.com/">Derek</a> can
hook me up. Hmmmmm. 
</p>
        <p>
          <img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Lil Wayne&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Lil
Wayne</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Lil Wayne+Best Rapper Alive [Explicit]&amp;x=0&amp;y=0">Best
Rapper Alive [Explicit]</a><img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b2b365eb-7b04-4dba-911b-8008e83e020a" />
      </body>
      <title>Windows Server on Amazon EC2?</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,b2b365eb-7b04-4dba-911b-8008e83e020a.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/10/01/WindowsServerOnAmazonEC2.aspx</link>
      <pubDate>Wed, 01 Oct 2008 15:22:25 GMT</pubDate>
      <description>&lt;p&gt;
Werner Vogels, CTO of Amazon, writes in his blog post &lt;a href="http://www.allthingsdistributed.com/2008/09/amazon_ec2_with_microsoft_wind.html"&gt;Expanding
the Cloud: Microsoft Windows Server on Amazon EC2&lt;/a&gt; that 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;With &lt;/em&gt;&lt;a href="http://aws.amazon.com/windows/"&gt;&lt;em&gt;today's announcement&lt;/em&gt;&lt;/a&gt;&lt;em&gt; that
Microsoft Windows Server is available on &lt;/em&gt;&lt;a href="http://aws.amazon.com/ec2"&gt;&lt;em&gt;Amazon
EC2&lt;/em&gt;&lt;/a&gt;&lt;em&gt; we can now run the majority of popular software systems in the cloud.
Windows Server ranked very high on the list of requests by customers so we are happy
that we will be able to provide this. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;One particular area that customers have been asking for &lt;/em&gt;&lt;a href="http://aws.amazon.com/windows/"&gt;&lt;em&gt;Amazon
EC2 with Windows Server&lt;/em&gt;&lt;/a&gt;&lt;em&gt; was for Windows Media transcoding and streaming.
There is a range of excellent codecs available for Windows Media and there is a large
amount of legacy content in those formats. In past weeks I met with a number of folks
from the entertainment industry and often their first question was: when can we run
on windows? &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;There are many different reasons why customers have requested Windows Server;
for example many customers want to run ASP.NET websites using Internet Information
Server and use Microsoft SQL Server as their database. Amazon EC2 running Windows
Server enables this scenario for building scalable websites. In addition, several
customers would like to maintain a global single Windows-based desktop environment
using Microsoft Remote Desktop, and Amazon EC2 is a scalable and dependable platform
on which to do so.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is great news. I'm starting a month long vacation as a precursor to my paternity
leave since &lt;u&gt;the baby&lt;/u&gt; is due next week and was looking to do some long overdue
hacking in-between burping the baby and changing diapers. My choices were 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Facebook platform app 
&lt;/li&gt;
&lt;li&gt;
Google App Engine app&lt;/li&gt;
&lt;li&gt;
EC2/S3/EBS app 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The problem with Amazon was the need to use Linux which I haven't seriously messed
with since my college days running SuSe. If I could use Windows Server and ASP.NET
while still learning the nuances of EC2/S3/EBS that would be quite sweet. 
&lt;/p&gt;
&lt;p&gt;
I wonder how who I need to holler at to get in the Windows Server on EC2 beta? Maybe &lt;a href="http://nothing-more.blogspot.com/"&gt;Derek&lt;/a&gt; can
hook me up. Hmmmmm. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Lil Wayne&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Lil
Wayne&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Lil Wayne+Best Rapper Alive [Explicit]&amp;amp;x=0&amp;amp;y=0"&gt;Best
Rapper Alive [Explicit]&lt;/a&gt; &lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b2b365eb-7b04-4dba-911b-8008e83e020a" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,b2b365eb-7b04-4dba-911b-8008e83e020a.aspx</comments>
      <category>Platforms</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=73974a96-b961-4295-81c6-b392104f9dcf</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,73974a96-b961-4295-81c6-b392104f9dcf.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,73974a96-b961-4295-81c6-b392104f9dcf.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=73974a96-b961-4295-81c6-b392104f9dcf</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm in the market for a new phone and I've been considering getting an <a href="http://www.apple.com/iphone/features/wireless.html">iPhone
3G</a> to replace my <a href="http://reviews.cnet.com/smartphones/at-t-tilt/4505-6452_7-32638455.html">AT&amp;T
Tilt</a> (aka HTC Kaiser). The Tilt is a great PDA (thanks to Windows Mobile 6) and
I love the slide out QWERTY keyboard. My main problems with it are the <em>relatively</em> huge
physical size, small amount of storage space and needing two hands if I want to send
email or text messages. 
</p>
        <p>
Although I've recently seen a lot of hype around Google's Android operating system
and <a href="http://t-mobileg1.com/">T-Mobile G1</a> (aka the HTC Dream), I haven't
had any interest in it since it has no support for integrating with Microsoft Exchange
which is the only reason I want a smart phone in the first place. However I have found
it interesting that a lot of recent blog posts about the iPhone are about how it is
in a weak position against Android because Google's open approach will trump Apple's
closed approach with regards to their developer platform. 
</p>
        <p>
A typical example of this trend in iPhone coverage is Antionio Cangiano's blog post
entitled <a href="http://antoniocangiano.com/2008/09/25/dont-alienate-developers/">Don't
Alienate Developers</a> which is excerpted below 
</p>
        <blockquote>
          <p>
            <em>Apple, a company that is generally considered far from “sinister” or “evil”, on
the other hand, is trying their best to alienate developers. 
<br />
… 
<br />
Their first idiotic move was to place an NDA on a finished product like the iPhone
SDK (including the final version). 
<br />
… 
<br />
Apple then decided that it was a good idea to charge people for the privilege to develop
for the iPhone: $99 
<br />
…</em>
            <br />
            <em>These were two blatant mistakes, but, if you can believe it, Apple managed to
alienate developers further still. A few thousand people put up with the NDA on the
SDK, with the cost of the Standard Program, and with the lengthy and bureaucratic
process it takes to access the only viable distribution channel, the iPhone App Store.
Some of them spent months trying to create excellent, innovative applications for
the iPhone, only to see their work rejected for no good reason other than that it
competed with Apple’s own products (e.g. Podcaster) or was inconvenient for their
business partner AT&amp;T (e.g. NetShare).</em>
            <br />
            <em>…</em>
            <br />
            <em>I fail to see Apple’s usual business insight and only see blind greed, the kind
that acts as a highly effective cautionary tale against developing for Apple’s platforms. <font color="#ff0000">This
all comes at a time when Google is promoting a truly open platform, Android, which
poses a few challenges due to the heterogeneous nature of the devices it will be deployed
on</font>, but is equally interesting from a technical standpoint. Google even went
so far as to award ten million dollars in prize money through a contest that they
held, to attract new developers and applications. Android is definitely welcoming
new developers and it’s doing so free from glaring restrictions and limitations. </em>
            <em>I
suspect that many will put up with Java, to get a cup of freedom.</em>
          </p>
        </blockquote>
        <p>
This kind of thinking is particularly naive because it fails to consider <a title="Dare Obasanjo aka Carnage4Life - The 3 Laws of Platform Adoption: Why Developers Choose Platforms and What it Means to You" href="http://www.25hoursaday.com/weblog/2008/09/08/The3LawsOfPlatformAdoptionWhyDevelopersChoosePlatformsAndWhatItMeansToYou.aspx">why
developers adopt platforms</a> in the first place. Developers go where the users are.
Users go where they can get the best user experience for the right price. Openness
of the platform only helps if it improves the user experience, thus attracting more
users and reinforcing the virtuous cycle. 
</p>
        <p>
Rory Blyth recently a very insightful which compared to "open" approach
taken with the Windows Mobile developer ecosystem with the "closed" approach
of Apple's iPhone ecosystem. In his post entitled <a href="http://www.neopoleon.com/home/blogs/neo/archive/2008/09/16/31739.aspx">iPhone
vs. Windows Mobile - Apple vs. Microsoft - It's the Little Things</a> Rory wrote 
</p>
        <blockquote>
          <p>
            <em>Here, from what I've learned, is how iPhone and Windows Mobile rate against these
criteria.</em>
          </p>
          <p>
            <em>
              <strong>----</strong> Windows Mobile</em>
          </p>
          <li>
            <em>
              <u>My access to your money:</u> If you have a WM device, you probably have money.
Even with carrier "discounts" they're not cheap. If you know what to get,
it's worth the moolah, and you'll take advantage of what your chosen device has to
offer by downloading apps that make use of it. This is as easy as: </em>
            <ol>
              <li>
                <em>Trying to figure out where the big app stores are. There are a few, and they don't
all support Windows Mobile, nor do they all have apps that will run on whatever version
of WM you've got. It can be frustrating because Microsoft's practice of renaming products
and slapping weird version numbers on things that are meaningless without context
can easily leave you wondering what version of Windows Mobile you have (and wondering
if what you've got is  the same as/compatible with PocketPC, WinCE, PPC, etc.). </em>
              </li>
              <li>
                <em>If not big stores, then searching the small independents where devs post their
stuff on sites that look like they were made with a beta release of the first version
of FrontPage. </em>
              </li>
              <li>
                <em>When you find an app, you go through whatever arbitrary transaction process the
store/dev is using. This might mean creating an account with a site you'll never return
to, handing your credit card info over to an independent whose trustworthiness is
unknown, or even going through PayPal and then having to wait for the dev to check
his email and manually respond with a serial number (or whatever). </em>
              </li>
              <li>
                <em>Run the app on your desktop which will kick off </em>
                <a href="http://en.wikipedia.org/wiki/ActiveSync">
                  <em>ActiveSync</em>
                </a>
                <em>'s
install bits that install stuff on your PC in addition to the device. </em>
              </li>
              <li>
                <em>After clicking "Yes" or "I think so" or "Sure" on
a few dialog boxes that pop up on the desktop and on the device, a CAB file is opened
on the device and a local installer runs. This can mean more dialog boxes, and it
can also mean having to make choices about things you don't understand (many users
aren't going to comprehend the impact/difference between installing to the device's
memory or to an expansion card). </em>
              </li>
              <li>
                <em>Run the app! Easy as 1-2-3-4-5-6!</em>
              </li>
            </ol>
            <p>
              <em>…</em>
            </p>
          </li>
        </blockquote>
        <blockquote>
          <li>
            <em>
              <u>App distribution options and ease of install for the customer:</u> As you may
have figured out from my "Easy as 1-2-3-4-5-6!" list above, finding, buying,
and installing apps on WM devices has always been a pain in the ass. Going back to
my first PocketPC (the first </em>
            <a href="http://en.wikipedia.org/wiki/IPAQ">
              <em>iPaq</em>
            </a>
            <em> (the
3630)), I wondered why I needed ActiveSync just to install some stupid little app.
ActiveSync makes sense if, say, I'm syncing something with the desktop like mail or
calendar data, but it doesn't make sense if I'm installing Super Solitaire 5000 Deluxe
Color Edition. Where do you sell your app? How do you get the word out? I haven't
looked into it for a while because it frustrated me so much in the past. I'm going
to take a look again, and, because I plan to target one specific platform for my app,
I also plan to develop for others. In the case of Windows Mobile, I'm hoping Microsoft
copies Apple's model. </em>
            <p>
              <em>
                <strong>----</strong> Apple's iPhone</em>
            </p>
            <p>
              <em>…</em>
            </p>
          </li>
        </blockquote>
        <blockquote>
          <li>
            <em>
              <u>App distribution options and ease of install for the customer:</u> Apple users
have been bitching about using iTunes to install iPhone software. If they had any
idea what it's like with other platforms, they'd shut it. While iTunes as an app store
feels wrong and stupid and lame and stupid to me, at least iTunes is an app everybody
has nowadays (aight - not everybody, but many, and that's good enough). Not that it
matters much - with the introduction of </em>
            <a href="http://www.apple.com/iphone/appstore/">
              <em>Apple's
App Store</em>
            </a>
            <em>, you can browse apps on your phone, pay for, and install them
without having to do some stupid syncing thing. You could be out at a bar where </em>
            <a href="http://www.neopoleon.com/home/blogs/neo/archive/2007/08/10/26627.aspx">
              <em>Jolene
Blalock</em>
            </a>
            <em> is hitting on you, and without having to run home to your iMac,
you can buy, install, and run a crossword game before you've even had the chance to
realize you've just made the biggest mistake in your life by ignoring her. And when
you do realize it, and you see Jolene running off with another man, at least you'll
have your crossword puzzles.</em>
          </li>
        </blockquote>
        <p>
This is just one example of how a "closed" approach where a vendor supplies
the entire end-to-end user experience provides a superior experience to an "open"
approach where the vendor leaves it up to other developers to fill in the gaps. Apple's
approach seems to be working well for developers some of whom are making <a title="GadgetLab from Wired: iPhone Developers Go From Rags to Riches" href="http://blog.wired.com/gadgets/2008/09/indie-developer.html">hundreds
of thousands of dollars a month</a> thanks to how good of a job Apple has done in
making it easy for users to find, purchase and install applications on their iPhones. 
</p>
        <p>
The key thing Apple has brought to the table is building a user experience that its
customers love to use instead of one that they merely tolerate. Getting this right
is way more important than the "openness" of the ecosystem. Customers and
developers can put up with a closed ecosystem that limits choice as long as it improves
the quality of the user experience. Where Google Android has to shine is in building
a better user experience for the same price or a comparable experience at a lower
price. Everything else is just noise. 
</p>
        <p>
Don't take my word for it, here's what the John Wang of HTC [Chief Marketing Officer
of the company that is shipping the first Google Android phone] has to say about the
topic in <a title="DigiTimes: Android and Windows Mobile smartphones are complementary, says HTC" href="http://www.digitimes.com/news/a20080925PD213.html">an
article from Digitimes</a></p>
        <blockquote>
          <p>
            <em>Some believe the success of Android handsets will rely on their open source platform.
However, this is not true since Linux-based handsets have already been on the market
for a while, Wang argued.</em>
          </p>
          <p>
            <em>
              <font color="#ff0000">The key element is innovation</font>, said Wang, noting
that the T-Mobile G1 is being rolled by combining Google's Internet services, HTC's
proven capability in smartphone manufacturing, and T-Mobile's telecom network resources.</em>
          </p>
        </blockquote>
        <p>
Apple is definitely ticking off developers but until another vendor shows up with
a phone whose hardware <u>and</u> software provides a better experience for customers
then it will continue to get the lions share of attention from top mobile developers. 
</p>
        <p>
        </p>
        <p>
          <a title="http://antoniocangiano.com/2008/09/25/dont-alienate-developers/" href="http://antoniocangiano.com/2008/09/25/dont-alienate-developers/">
          </a>
        </p>
        <img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /> Now
Playing: <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=T.I.&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">T.I.</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=T.I.+Whatever You Like&amp;x=0&amp;y=0">Whatever
You Like</a><img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /><img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=73974a96-b961-4295-81c6-b392104f9dcf" /></body>
      <title>User Experience is ALL that Matters</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,73974a96-b961-4295-81c6-b392104f9dcf.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/09/28/UserExperienceIsALLThatMatters.aspx</link>
      <pubDate>Sun, 28 Sep 2008 20:51:54 GMT</pubDate>
      <description>&lt;p&gt;
I'm in the market for a new phone and I've been considering getting an &lt;a href="http://www.apple.com/iphone/features/wireless.html"&gt;iPhone
3G&lt;/a&gt; to replace my &lt;a href="http://reviews.cnet.com/smartphones/at-t-tilt/4505-6452_7-32638455.html"&gt;AT&amp;amp;T
Tilt&lt;/a&gt; (aka HTC Kaiser). The Tilt is a great PDA (thanks to Windows Mobile 6) and
I love the slide out QWERTY keyboard. My main problems with it are the &lt;em&gt;relatively&lt;/em&gt; huge
physical size, small amount of storage space and needing two hands if I want to send
email or text messages. 
&lt;/p&gt;
&lt;p&gt;
Although I've recently seen a lot of hype around Google's Android operating system
and &lt;a href="http://t-mobileg1.com/"&gt;T-Mobile G1&lt;/a&gt; (aka the HTC Dream), I haven't
had any interest in it since it has no support for integrating with Microsoft Exchange
which is the only reason I want a smart phone in the first place. However I have found
it interesting that a lot of recent blog posts about the iPhone are about how it is
in a weak position against Android because Google's open approach will trump Apple's
closed approach with regards to their developer platform. 
&lt;/p&gt;
&lt;p&gt;
A typical example of this trend in iPhone coverage is Antionio Cangiano's blog post
entitled &lt;a href="http://antoniocangiano.com/2008/09/25/dont-alienate-developers/"&gt;Don't
Alienate Developers&lt;/a&gt; which is excerpted below 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Apple, a company that is generally considered far from “sinister” or “evil”, on
the other hand, is trying their best to alienate developers. 
&lt;br /&gt;
… 
&lt;br /&gt;
Their first idiotic move was to place an NDA on a finished product like the iPhone
SDK (including the final version). 
&lt;br /&gt;
… 
&lt;br /&gt;
Apple then decided that it was a good idea to charge people for the privilege to develop
for the iPhone: $99 
&lt;br /&gt;
…&lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;These were two blatant mistakes, but, if you can believe it, Apple managed to
alienate developers further still. A few thousand people put up with the NDA on the
SDK, with the cost of the Standard Program, and with the lengthy and bureaucratic
process it takes to access the only viable distribution channel, the iPhone App Store.
Some of them spent months trying to create excellent, innovative applications for
the iPhone, only to see their work rejected for no good reason other than that it
competed with Apple’s own products (e.g. Podcaster) or was inconvenient for their
business partner AT&amp;amp;T (e.g. NetShare).&lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;…&lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;I fail to see Apple’s usual business insight and only see blind greed, the kind
that acts as a highly effective cautionary tale against developing for Apple’s platforms. &lt;font color="#ff0000"&gt;This
all comes at a time when Google is promoting a truly open platform, Android, which
poses a few challenges due to the heterogeneous nature of the devices it will be deployed
on&lt;/font&gt;, but is equally interesting from a technical standpoint. Google even went
so far as to award ten million dollars in prize money through a contest that they
held, to attract new developers and applications. Android is definitely welcoming
new developers and it’s doing so free from glaring restrictions and limitations. &lt;/em&gt;&lt;em&gt;I
suspect that many will put up with Java, to get a cup of freedom.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This kind of thinking is particularly naive because it fails to consider &lt;a title="Dare Obasanjo aka Carnage4Life - The 3 Laws of Platform Adoption: Why Developers Choose Platforms and What it Means to You" href="http://www.25hoursaday.com/weblog/2008/09/08/The3LawsOfPlatformAdoptionWhyDevelopersChoosePlatformsAndWhatItMeansToYou.aspx"&gt;why
developers adopt platforms&lt;/a&gt; in the first place. Developers go where the users are.
Users go where they can get the best user experience for the right price. Openness
of the platform only helps if it improves the user experience, thus attracting more
users and reinforcing the virtuous cycle. 
&lt;/p&gt;
&lt;p&gt;
Rory Blyth recently a very insightful which compared to &amp;quot;open&amp;quot; approach
taken with the Windows Mobile developer ecosystem with the &amp;quot;closed&amp;quot; approach
of Apple's iPhone ecosystem. In his post entitled &lt;a href="http://www.neopoleon.com/home/blogs/neo/archive/2008/09/16/31739.aspx"&gt;iPhone
vs. Windows Mobile - Apple vs. Microsoft - It's the Little Things&lt;/a&gt; Rory wrote 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Here, from what I've learned, is how iPhone and Windows Mobile rate against these
criteria.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;----&lt;/strong&gt; Windows Mobile&lt;/em&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;em&gt;&lt;u&gt;My access to your money:&lt;/u&gt; If you have a WM device, you probably have money.
Even with carrier &amp;quot;discounts&amp;quot; they're not cheap. If you know what to get,
it's worth the moolah, and you'll take advantage of what your chosen device has to
offer by downloading apps that make use of it. This is as easy as: &lt;/em&gt; 
&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Trying to figure out where the big app stores are. There are a few, and they don't
all support Windows Mobile, nor do they all have apps that will run on whatever version
of WM you've got. It can be frustrating because Microsoft's practice of renaming products
and slapping weird version numbers on things that are meaningless without context
can easily leave you wondering what version of Windows Mobile you have (and wondering
if what you've got is&amp;#160; the same as/compatible with PocketPC, WinCE, PPC, etc.). &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;If not big stores, then searching the small independents where devs post their
stuff on sites that look like they were made with a beta release of the first version
of FrontPage. &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;When you find an app, you go through whatever arbitrary transaction process the
store/dev is using. This might mean creating an account with a site you'll never return
to, handing your credit card info over to an independent whose trustworthiness is
unknown, or even going through PayPal and then having to wait for the dev to check
his email and manually respond with a serial number (or whatever). &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Run the app on your desktop which will kick off &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/ActiveSync"&gt;&lt;em&gt;ActiveSync&lt;/em&gt;&lt;/a&gt;&lt;em&gt;'s
install bits that install stuff on your PC in addition to the device. &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;After clicking &amp;quot;Yes&amp;quot; or &amp;quot;I think so&amp;quot; or &amp;quot;Sure&amp;quot; on
a few dialog boxes that pop up on the desktop and on the device, a CAB file is opened
on the device and a local installer runs. This can mean more dialog boxes, and it
can also mean having to make choices about things you don't understand (many users
aren't going to comprehend the impact/difference between installing to the device's
memory or to an expansion card). &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Run the app! Easy as 1-2-3-4-5-6!&lt;/em&gt; 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;em&gt;…&lt;/em&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/blockquote&gt; &lt;blockquote&gt; 
&lt;li&gt;
&lt;em&gt;&lt;u&gt;App distribution options and ease of install for the customer:&lt;/u&gt; As you may
have figured out from my &amp;quot;Easy as 1-2-3-4-5-6!&amp;quot; list above, finding, buying,
and installing apps on WM devices has always been a pain in the ass. Going back to
my first PocketPC (the first &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/IPAQ"&gt;&lt;em&gt;iPaq&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (the
3630)), I wondered why I needed ActiveSync just to install some stupid little app.
ActiveSync makes sense if, say, I'm syncing something with the desktop like mail or
calendar data, but it doesn't make sense if I'm installing Super Solitaire 5000 Deluxe
Color Edition. Where do you sell your app? How do you get the word out? I haven't
looked into it for a while because it frustrated me so much in the past. I'm going
to take a look again, and, because I plan to target one specific platform for my app,
I also plan to develop for others. In the case of Windows Mobile, I'm hoping Microsoft
copies Apple's model. &lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;----&lt;/strong&gt; Apple's iPhone&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;…&lt;/em&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/blockquote&gt; &lt;blockquote&gt; 
&lt;li&gt;
&lt;em&gt;&lt;u&gt;App distribution options and ease of install for the customer:&lt;/u&gt; Apple users
have been bitching about using iTunes to install iPhone software. If they had any
idea what it's like with other platforms, they'd shut it. While iTunes as an app store
feels wrong and stupid and lame and stupid to me, at least iTunes is an app everybody
has nowadays (aight - not everybody, but many, and that's good enough). Not that it
matters much - with the introduction of &lt;/em&gt;&lt;a href="http://www.apple.com/iphone/appstore/"&gt;&lt;em&gt;Apple's
App Store&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, you can browse apps on your phone, pay for, and install them
without having to do some stupid syncing thing. You could be out at a bar where &lt;/em&gt;&lt;a href="http://www.neopoleon.com/home/blogs/neo/archive/2007/08/10/26627.aspx"&gt;&lt;em&gt;Jolene
Blalock&lt;/em&gt;&lt;/a&gt;&lt;em&gt; is hitting on you, and without having to run home to your iMac,
you can buy, install, and run a crossword game before you've even had the chance to
realize you've just made the biggest mistake in your life by ignoring her. And when
you do realize it, and you see Jolene running off with another man, at least you'll
have your crossword puzzles.&lt;/em&gt; 
&lt;/li&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is just one example of how a &amp;quot;closed&amp;quot; approach where a vendor supplies
the entire end-to-end user experience provides a superior experience to an &amp;quot;open&amp;quot;
approach where the vendor leaves it up to other developers to fill in the gaps. Apple's
approach seems to be working well for developers some of whom are making &lt;a title="GadgetLab from Wired: iPhone Developers Go From Rags to Riches" href="http://blog.wired.com/gadgets/2008/09/indie-developer.html"&gt;hundreds
of thousands of dollars a month&lt;/a&gt; thanks to how good of a job Apple has done in
making it easy for users to find, purchase and install applications on their iPhones. 
&lt;/p&gt;
&lt;p&gt;
The key thing Apple has brought to the table is building a user experience that its
customers love to use instead of one that they merely tolerate. Getting this right
is way more important than the &amp;quot;openness&amp;quot; of the ecosystem. Customers and
developers can put up with a closed ecosystem that limits choice as long as it improves
the quality of the user experience. Where Google Android has to shine is in building
a better user experience for the same price or a comparable experience at a lower
price. Everything else is just noise. 
&lt;/p&gt;
&lt;p&gt;
Don't take my word for it, here's what the John Wang of HTC [Chief Marketing Officer
of the company that is shipping the first Google Android phone] has to say about the
topic in &lt;a title="DigiTimes: Android and Windows Mobile smartphones are complementary, says HTC" href="http://www.digitimes.com/news/a20080925PD213.html"&gt;an
article from Digitimes&lt;/a&gt; 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Some believe the success of Android handsets will rely on their open source platform.
However, this is not true since Linux-based handsets have already been on the market
for a while, Wang argued.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;font color="#ff0000"&gt;The key element is innovation&lt;/font&gt;, said Wang, noting
that the T-Mobile G1 is being rolled by combining Google's Internet services, HTC's
proven capability in smartphone manufacturing, and T-Mobile's telecom network resources.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Apple is definitely ticking off developers but until another vendor shows up with
a phone whose hardware &lt;u&gt;and&lt;/u&gt; software provides a better experience for customers
then it will continue to get the lions share of attention from top mobile developers. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://antoniocangiano.com/2008/09/25/dont-alienate-developers/" href="http://antoniocangiano.com/2008/09/25/dont-alienate-developers/"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=T.I.&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;T.I.&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=T.I.+Whatever You Like&amp;amp;x=0&amp;amp;y=0"&gt;Whatever
You Like&lt;/a&gt; &lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt;&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=73974a96-b961-4295-81c6-b392104f9dcf" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,73974a96-b961-4295-81c6-b392104f9dcf.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=faa389b5-eada-4376-91ae-6893445de147</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,faa389b5-eada-4376-91ae-6893445de147.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,faa389b5-eada-4376-91ae-6893445de147.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=faa389b5-eada-4376-91ae-6893445de147</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been thinking a lot about platform adoption recently. I guess it is the combination
of the upcoming <a href="http://www.microsoftpdc.com/">Microsoft PDC</a> and watching
the various moves in the area of social networking platforms like <a href="http://code.google.com/apis/opensocial/">OpenSocial</a> and <a href="http://developers.facebook.com/fbopen/">fbOpen</a>.
One thing that is abundantly clear is that the dynamics that drive platform adoption
are amazingly consistent regardless of whether you are talking about operating system
platforms like Windows' Win32 and *nix's POSIX, cloud computing platforms like Amazon's
EC2 + EBS + S3 and Google App Engine, or even data access APIs like the Flickr API
and Google's GData. 
</p>
        <p>
When a developer adopts a platform, there is a value exchange between the developer
and the software vendor. The more value that is provided to developers by the platform
vendor, the more developers are attracted to the platform. Although this seems self
evident, where providers of platforms go astray is that they often don't understand
the value developers actually want out of software platforms and instead operate from
an <em>if we build it they will come</em> mentality.  
</p>
        <p>
There are three main benefits adoption of one platform over another can offer a developer.
These benefits are captured in the following "laws" of platform adoption   
</p>
        <ol>
          <li>
            <p>
              <u>Developers adopt a platform when it offers differentiation from competitors:</u> In
competitive software markets, building an application that stands out from the crowd
is important. Platforms or technologies that enable developers to provide features
that are unique to the application, even just temporarily, are thus valuable to developers
in such markets. Typically, if these features are truly valuable to end users this
leads to a "keeping up with the Joneses" effect where the majority applications
in that space eventually adopt this platform. Recent examples of this include <a href="http://en.wikipedia.org/wiki/Flash_Video">Flash
video</a>, <a href="http://adaptivepath.com/ideas/essays/archives/000385.php">AJAX</a> and
the <a href="http://www.flickr.com/services/api/">Flickr API</a>. 
</p>
          </li>
          <li>
            <p>
              <u>
                <u>Developers adopt a platform when it </u>reduces the cost of software development:</u> Building
software is a labor intensive, complicated and error prone process <a title="Coding Horror: The Long, Dismal History of Software Project Failure" href="http://www.codinghorror.com/blog/archives/000588.html">which
often results in failure</a>. This makes software development an expensive undertaking.
Platforms which reduce the cost of development are thus very valuable to developers.
Platforms like Java and the .NET Framework reduced the cost of software development
compared to building applications using C and C++. In recent years, platforms based
on dynamic languages such as Ruby On Rails and Django have become increasingly popular
for building Web applications as they offer simpler development options compared to
using "enterprise" platforms like Java. 
</p>
          </li>
          <li>
            <p>
              <u>
                <u>Developers adopt a platform when it </u>provides reach and/or better distribution:</u> Every
platform choice places a limit on which users the developer can reach. Building a
Facebook application limits you to building applications for Facebook users, building
an iPhone application limits you to people running Apple's phone and building an AJAX
application limits you to users of modern browsers who don't have JavaScript disabled.
In all of the aforementioned cases, the reach of the application platform is in the
millions of users. Additionally, in all of the aforementioned cases there are alternative
platforms that developers could choose that do not as many addressable end users and
thus have less reach.  
</p>
            <p>
Distribution is another value add that modern platforms have begun to offer which
augments the reach of the platform. The Facebook platform offers <a href="http://www.insidefacebook.com/2007/10/22/new-data-on-facebook-application-virality/">several
viral distribution mechanisms for applications</a> which enables applications to get
noticed by end users and spread organically among users without explicit action by
the developer. The Apple iPhone has the <a href="http://www.apple.com/iphone/appstore/">App
Store</a> which is the single, well-integrated entry point for users to discover and
purchase applications for the device. Thus even though the iPhone may have users than
other smart phone platforms, targeting the iPhone platform may still be more attractive
than targeting other platforms due to its superior distribution channel for applications
built on its platform.  
</p>
          </li>
        </ol>
        <p>
Sometimes developers adopt platforms due to external effects such as management mandate
or peer pressure but even in these cases the underlying justification is usually one
or more of the benefits above. These laws mean different things for the various participants
in the software ecosystem. 
</p>
        <ul>
          <li>
            <p>
For software vendors, they clarify that delivering a software platform isn't just
about delivering a technology or a set of APIs. The value proposition to developers
with regards to the three laws of adoption must be clearly shown to get developers
to accept the platform. Smart platform vendors should pick one or more of these axes
as the value proposition of their platform and hammer it home. Good examples of these
approaches include how <a title="TechCrunch: OpenSocial Now Reaches 350 Million Users, And Growing" href="http://www.techcrunch.com/2008/08/20/opensocial-now-reaches-350-million-users-and-growing/">Google
has been hammering home the 'reach' benefit of adopting OpenSocial</a> or <a title="The Pragmatic Bookshelf: What's all this fuss about Erlang?" href="http://www.pragmaticprogrammer.com/articles/erlang.html">how
Erlang evangelists have been pitching it as a solution to the multicore crises</a> given
that building concurrent applications is still an expensive endeavor in today's popular
programming languages.  
</p>
          </li>
          <li>
            <p>
For developers, they explain how to evaluate a platform and why some platforms get
traction among their peers while others do not. So if you are a fan of the Common
Lisp or <a href="http://pownce.com/api/">the Pownce API</a>, these laws of platform
adoption explain why developers have flocked to other platforms in their stead. 
</p>
          </li>
        </ul>
        <p>
          <b>Now Playing:</b>
          <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Pink&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Pink</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Pink+So What&amp;x=0&amp;y=0">So
What</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=faa389b5-eada-4376-91ae-6893445de147" />
      </body>
      <title>The 3 Laws of Platform Adoption: Why Developers Choose Platforms and What it Means to You</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,faa389b5-eada-4376-91ae-6893445de147.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/09/08/The3LawsOfPlatformAdoptionWhyDevelopersChoosePlatformsAndWhatItMeansToYou.aspx</link>
      <pubDate>Mon, 08 Sep 2008 03:36:38 GMT</pubDate>
      <description>&lt;p&gt;
I've been thinking a lot about platform adoption recently. I guess it is the combination
of the upcoming &lt;a href="http://www.microsoftpdc.com/"&gt;Microsoft PDC&lt;/a&gt; and watching
the various moves in the area of social networking platforms like &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt; and &lt;a href="http://developers.facebook.com/fbopen/"&gt;fbOpen&lt;/a&gt;.
One thing that is abundantly clear is that the dynamics that drive platform adoption
are amazingly consistent regardless of whether you are talking about operating system
platforms like Windows' Win32 and *nix's POSIX, cloud computing platforms like Amazon's
EC2 + EBS + S3 and Google App Engine, or even data access APIs like the Flickr API
and Google's GData. 
&lt;/p&gt;
&lt;p&gt;
When a developer adopts a platform, there is a value exchange between the developer
and the software vendor. The more value that is provided to developers by the platform
vendor, the more developers are attracted to the platform. Although this seems self
evident, where providers of platforms go astray is that they often don't understand
the value developers actually want out of software platforms and instead operate from
an &lt;em&gt;if we build it they will come&lt;/em&gt; mentality.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
There are three main benefits adoption of one platform over another can offer a developer.
These benefits are captured in the following &amp;quot;laws&amp;quot; of platform adoption&amp;#160;&amp;#160; 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
&lt;u&gt;Developers adopt a platform when it offers differentiation from competitors:&lt;/u&gt; In
competitive software markets, building an application that stands out from the crowd
is important. Platforms or technologies that enable developers to provide features
that are unique to the application, even just temporarily, are thus valuable to developers
in such markets. Typically, if these features are truly valuable to end users this
leads to a &amp;quot;keeping up with the Joneses&amp;quot; effect where the majority applications
in that space eventually adopt this platform. Recent examples of this include &lt;a href="http://en.wikipedia.org/wiki/Flash_Video"&gt;Flash
video&lt;/a&gt;, &lt;a href="http://adaptivepath.com/ideas/essays/archives/000385.php"&gt;AJAX&lt;/a&gt; and
the &lt;a href="http://www.flickr.com/services/api/"&gt;Flickr API&lt;/a&gt;. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;u&gt;&lt;u&gt;Developers adopt a platform when it &lt;/u&gt;reduces the cost of software development:&lt;/u&gt; Building
software is a labor intensive, complicated and error prone process &lt;a title="Coding Horror: The Long, Dismal History of Software Project Failure" href="http://www.codinghorror.com/blog/archives/000588.html"&gt;which
often results in failure&lt;/a&gt;. This makes software development an expensive undertaking.
Platforms which reduce the cost of development are thus very valuable to developers.
Platforms like Java and the .NET Framework reduced the cost of software development
compared to building applications using C and C++. In recent years, platforms based
on dynamic languages such as Ruby On Rails and Django have become increasingly popular
for building Web applications as they offer simpler development options compared to
using &amp;quot;enterprise&amp;quot; platforms like Java. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;u&gt;&lt;u&gt;Developers adopt a platform when it &lt;/u&gt;provides reach and/or better distribution:&lt;/u&gt; Every
platform choice places a limit on which users the developer can reach. Building a
Facebook application limits you to building applications for Facebook users, building
an iPhone application limits you to people running Apple's phone and building an AJAX
application limits you to users of modern browsers who don't have JavaScript disabled.
In all of the aforementioned cases, the reach of the application platform is in the
millions of users. Additionally, in all of the aforementioned cases there are alternative
platforms that developers could choose that do not as many addressable end users and
thus have less reach.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Distribution is another value add that modern platforms have begun to offer which
augments the reach of the platform. The Facebook platform offers &lt;a href="http://www.insidefacebook.com/2007/10/22/new-data-on-facebook-application-virality/"&gt;several
viral distribution mechanisms for applications&lt;/a&gt; which enables applications to get
noticed by end users and spread organically among users without explicit action by
the developer. The Apple iPhone has the &lt;a href="http://www.apple.com/iphone/appstore/"&gt;App
Store&lt;/a&gt; which is the single, well-integrated entry point for users to discover and
purchase applications for the device. Thus even though the iPhone may have users than
other smart phone platforms, targeting the iPhone platform may still be more attractive
than targeting other platforms due to its superior distribution channel for applications
built on its platform.&amp;#160; 
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Sometimes developers adopt platforms due to external effects such as management mandate
or peer pressure but even in these cases the underlying justification is usually one
or more of the benefits above. These laws mean different things for the various participants
in the software ecosystem. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
For software vendors, they clarify that delivering a software platform isn't just
about delivering a technology or a set of APIs. The value proposition to developers
with regards to the three laws of adoption must be clearly shown to get developers
to accept the platform. Smart platform vendors should pick one or more of these axes
as the value proposition of their platform and hammer it home. Good examples of these
approaches include how &lt;a title="TechCrunch: OpenSocial Now Reaches 350 Million Users, And Growing" href="http://www.techcrunch.com/2008/08/20/opensocial-now-reaches-350-million-users-and-growing/"&gt;Google
has been hammering home the 'reach' benefit of adopting OpenSocial&lt;/a&gt; or &lt;a title="The Pragmatic Bookshelf: What&amp;#39;s all this fuss about Erlang?" href="http://www.pragmaticprogrammer.com/articles/erlang.html"&gt;how
Erlang evangelists have been pitching it as a solution to the multicore crises&lt;/a&gt; given
that building concurrent applications is still an expensive endeavor in today's popular
programming languages.&amp;#160; 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
For developers, they explain how to evaluate a platform and why some platforms get
traction among their peers while others do not. So if you are a fan of the Common
Lisp or &lt;a href="http://pownce.com/api/"&gt;the Pownce API&lt;/a&gt;, these laws of platform
adoption explain why developers have flocked to other platforms in their stead. 
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;b&gt;Now Playing:&lt;/b&gt; &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Pink&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Pink&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Pink+So What&amp;amp;x=0&amp;amp;y=0"&gt;So
What&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=faa389b5-eada-4376-91ae-6893445de147" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,faa389b5-eada-4376-91ae-6893445de147.aspx</comments>
      <category>Platforms</category>
      <category>Programming</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=8025071f-dcb1-4689-ba44-905b93241c71</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,8025071f-dcb1-4689-ba44-905b93241c71.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,8025071f-dcb1-4689-ba44-905b93241c71.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=8025071f-dcb1-4689-ba44-905b93241c71</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been reading about the <a href="http://www.techcrunch.com/2008/08/24/dont-post-the-evidence-unless-it-supports-your-case/">Ning
vs. WidgetLaboratory drama</a> on TechCrunch. The meat of the conflict seems to be
that widgets from WidgetLaboratory were so degrading the user experience of Ning that
they had to be cut off. The relevant excerpts from the most recent TechCrunch story
on the war of words are below 
</p>
        <blockquote>
          <p>
            <em>For those of you not closely following the drama between social network platform
Ning and a popular widget provider called WidgetLaboratory, you can read the background </em>
            <a href="http://www.techcrunch.com/2008/08/22/ning-shuts-down-premium-developer-widgetlaboratory/">
              <em>here</em>
            </a>
            <em>.
On Friday Ning unceremoniously shut down their access to Ning, making all those widgets
vanish.</em>
            <br />
... 
<br /><em>In an email to WL on August 2 (more than three weeks ago), CEO Gina Bianchini
wrote “Our only goal is to have you build your products in such a way that doesn’t
slow down the networks running your products or takedown the Ning Platform with what
you’re doing. Both of those would result in us needing to shutdown WidgetLaboratory
products and that’s has never been our first choice of options. Hopefully, you know
this after 8 months of working with us.”</em></p>
        </blockquote>
        <p>
Ignoring the he said, she said nature of the communication between both companies,
there is a legitimate concern that 3rd party widgets included on the pages of a Web
site can degrade the performance to the extent that the site becomes unusably slow.
In fact, TechCrunch has had similar problems with 3rd party widgets as <a title="TechCrunch Slowdown Today" href="http://www.crunchnotes.com/2007/06/14/techcrunch-slowdown-today/">Mike
Arrington has mentioned on his personal blog</a> which led to him excluding the widgets
from his site. 
</p>
        <p>
Typically, widgets are embedded in a site by including references to Javascript hosted
on a 3rd party site in the page's HTML. This means rendering the page is dependent
on how quickly the script files can be downloaded from the 3rd party site AND how
long it takes for the script to execute especially since it may also fetch data from
one or more servers as well. Thus a slow server or a badly written script can make
every page that embeds the widget unbearably slow to render. Given that the ability
to embed widgets is a key feature of social networking sites, it is important for
such sites to figure out how to isolate their user experience from badly written widgets
or widgets hosted on slow Web servers. 
</p>
        <p>
Below are some best practices that have emerged on how social networking sites can
immunize themselves from the kinds of problems Ning has had with WidgetLaboratory
</p>
        <ol>
          <li>
            <p>
              <u>Host the Scripts Yourself:</u> If you have a popular site, it is quite likely that
you have more resources to handle lots of page views than the typical widget developer.
Thus it makes sense to take away the dependency on externally hosted scripts by hosting
the widgets yourself. Microsoft encourages developers to submit their gadgets to <a href="http://gallery.live.com/">Windows
Live Gallery</a> if they want to build gadgets for <a href="http://my.live.com">my.live.com</a> or <a href="http://spaces.live.com">Windows
Live Spaces</a>. For it's AJAX homepage service, Google does not require developers
to submit gadgets to them for hosting but instead <a href="http://code.google.com/support/bin/answer.py?answer=74910&amp;topic=12389">caches
gadget data for hours at a time</a> which means they are effectively hosting the gadgets
themselves for the majority of the accesses by their users. 
</p>
          </li>
          <li>
            <p>
              <u>Keep External Dependencies off of Pages that Need to Render Quickly:</u> In many
cases, it isn't feasible to host all of the data and content related to widgets that
are being shown on your site. In that case, you should ensure that the key scenarios
on your Web site are insulated from the problems caused by slow or broken 3rd party
widgets. For example, on Facebook viewing someone's profile is a key part of the user
experience that is important to make sure happens as quickly and as smoothly as possible.
For this reason, Facebook caches all 3rd party content that shows up on a user's profile
and requires applications to call <a href="http://wiki.developers.facebook.com/index.php/Profile.setFBML">Profile.SetFBML</a> to
add content to the profile instead of providing a way to directly embed widgets on
a user's profile. 
</p>
          </li>
          <li>
            <p>
              <u>Make It Clear Who Is to Blame if Things go Awry:</u> One of the issues raised by
Ning in their conflict with WidgetLaboratory is that user pages wouldn't render correctly
or would show degraded performance due to WidgetLaboratory's widgets but Ning would
get the support calls. This kind of user confusion is avoided if the user experience
makes it clear when the failure of a page to render correctly is the fault of the
external widget and when it is part of the hosting site. For example, <a href="http://developers.facebook.com/get_started.php?tab=anatomy#canvas">Facebook
Canvas Pages for applications</a> make it clear that the user is using a 3rd party
application and not part of the core Facebook experience. I've seen lots of user <a href="http://www.tojosan.com/2007/11/scrabulous-on-facebook-slow.html">complain</a> about
the <a href="http://www.facebook.com/topic.php?uid=14916117452&amp;topic=6451&amp;post=27152">slowness</a> of
Scrabulous and Scrabble but never seen anyone who thought that Facebook was to blame
and not the application developers. 
</p>
          </li>
        </ol>
        <p>
Following some of these practices would have saved Ning and its users some of their
current grief. 
</p>
        <p>
          <b>Now Playing:</b>
          <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Ice%20Cube&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Ice
Cube</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Ice%20Cube+Get%20Money,%20Spend%20Money,%20No%20Money&amp;x=0&amp;y=0">Get
Money, Spend Money, No Money</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=8025071f-dcb1-4689-ba44-905b93241c71" />
      </body>
      <title>Best Practices for Web Sites Seeking to Prevent Service Degradation due to 3rd Party Widgets</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,8025071f-dcb1-4689-ba44-905b93241c71.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/08/24/BestPracticesForWebSitesSeekingToPreventServiceDegradationDueTo3rdPartyWidgets.aspx</link>
      <pubDate>Sun, 24 Aug 2008 23:48:20 GMT</pubDate>
      <description>&lt;p&gt;
I've been reading about the &lt;a href="http://www.techcrunch.com/2008/08/24/dont-post-the-evidence-unless-it-supports-your-case/"&gt;Ning
vs. WidgetLaboratory drama&lt;/a&gt; on TechCrunch. The meat of the conflict seems to be
that widgets from WidgetLaboratory were so degrading the user experience of Ning that
they had to be cut off. The relevant excerpts from the most recent TechCrunch story
on the war of words are below 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;For those of you not closely following the drama between social network platform
Ning and a popular widget provider called WidgetLaboratory, you can read the background &lt;/em&gt;&lt;a href="http://www.techcrunch.com/2008/08/22/ning-shuts-down-premium-developer-widgetlaboratory/"&gt;&lt;em&gt;here&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.
On Friday Ning unceremoniously shut down their access to Ning, making all those widgets
vanish.&lt;/em&gt; 
&lt;br&gt;
... 
&lt;br&gt;
&lt;em&gt;In an email to WL on August 2 (more than three weeks ago), CEO Gina Bianchini
wrote “Our only goal is to have you build your products in such a way that doesn’t
slow down the networks running your products or takedown the Ning Platform with what
you’re doing. Both of those would result in us needing to shutdown WidgetLaboratory
products and that’s has never been our first choice of options. Hopefully, you know
this after 8 months of working with us.”&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Ignoring the he said, she said nature of the communication between both companies,
there is a legitimate concern that 3rd party widgets included on the pages of a Web
site can degrade the performance to the extent that the site becomes unusably slow.
In fact, TechCrunch has had similar problems with 3rd party widgets as &lt;a title="TechCrunch Slowdown Today" href="http://www.crunchnotes.com/2007/06/14/techcrunch-slowdown-today/"&gt;Mike
Arrington has mentioned on his personal blog&lt;/a&gt; which led to him excluding the widgets
from his site. 
&lt;/p&gt;
&lt;p&gt;
Typically, widgets are embedded in a site by including references to Javascript hosted
on a 3rd party site in the page's HTML. This means rendering the page is dependent
on how quickly the script files can be downloaded from the 3rd party site AND how
long it takes for the script to execute especially since it may also fetch data from
one or more servers as well. Thus a slow server or a badly written script can make
every page that embeds the widget unbearably slow to render. Given that the ability
to embed widgets is a key feature of social networking sites, it is important for
such sites to figure out how to isolate their user experience from badly written widgets
or widgets hosted on slow Web servers. 
&lt;/p&gt;
&lt;p&gt;
Below are some best practices that have emerged on how social networking sites can
immunize themselves from the kinds of problems Ning has had with WidgetLaboratory
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
&lt;u&gt;Host the Scripts Yourself:&lt;/u&gt; If you have a popular site, it is quite likely that
you have more resources to handle lots of page views than the typical widget developer.
Thus it makes sense to take away the dependency on externally hosted scripts by hosting
the widgets yourself. Microsoft encourages developers to submit their gadgets to &lt;a href="http://gallery.live.com/"&gt;Windows
Live Gallery&lt;/a&gt; if they want to build gadgets for &lt;a href="http://my.live.com"&gt;my.live.com&lt;/a&gt; or &lt;a href="http://spaces.live.com"&gt;Windows
Live Spaces&lt;/a&gt;. For it's AJAX homepage service, Google does not require developers
to submit gadgets to them for hosting but instead &lt;a href="http://code.google.com/support/bin/answer.py?answer=74910&amp;amp;topic=12389"&gt;caches
gadget data for hours at a time&lt;/a&gt; which means they are effectively hosting the gadgets
themselves for the majority of the accesses by their users. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;u&gt;Keep External Dependencies off of Pages that Need to Render Quickly:&lt;/u&gt; In many
cases, it isn't feasible to host all of the data and content related to widgets that
are being shown on your site. In that case, you should ensure that the key scenarios
on your Web site are insulated from the problems caused by slow or broken 3rd party
widgets. For example, on Facebook viewing someone's profile is a key part of the user
experience that is important to make sure happens as quickly and as smoothly as possible.
For this reason, Facebook caches all 3rd party content that shows up on a user's profile
and requires applications to call &lt;a href="http://wiki.developers.facebook.com/index.php/Profile.setFBML"&gt;Profile.SetFBML&lt;/a&gt; to
add content to the profile instead of providing a way to directly embed widgets on
a user's profile. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;u&gt;Make It Clear Who Is to Blame if Things go Awry:&lt;/u&gt; One of the issues raised by
Ning in their conflict with WidgetLaboratory is that user pages wouldn't render correctly
or would show degraded performance due to WidgetLaboratory's widgets but Ning would
get the support calls. This kind of user confusion is avoided if the user experience
makes it clear when the failure of a page to render correctly is the fault of the
external widget and when it is part of the hosting site. For example, &lt;a href="http://developers.facebook.com/get_started.php?tab=anatomy#canvas"&gt;Facebook
Canvas Pages for applications&lt;/a&gt; make it clear that the user is using a 3rd party
application and not part of the core Facebook experience. I've seen lots of user &lt;a href="http://www.tojosan.com/2007/11/scrabulous-on-facebook-slow.html"&gt;complain&lt;/a&gt; about
the &lt;a href="http://www.facebook.com/topic.php?uid=14916117452&amp;amp;topic=6451&amp;amp;post=27152"&gt;slowness&lt;/a&gt; of
Scrabulous and Scrabble but never seen anyone who thought that Facebook was to blame
and not the application developers. 
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Following some of these practices would have saved Ning and its users some of their
current grief. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now Playing:&lt;/b&gt; &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Ice%20Cube&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Ice
Cube&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Ice%20Cube+Get%20Money,%20Spend%20Money,%20No%20Money&amp;amp;x=0&amp;amp;y=0"&gt;Get
Money, Spend Money, No Money&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=8025071f-dcb1-4689-ba44-905b93241c71" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,8025071f-dcb1-4689-ba44-905b93241c71.aspx</comments>
      <category>Platforms</category>
      <category>Social Software</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=c573171e-8e62-45b4-b85c-7b411b528e51</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,c573171e-8e62-45b4-b85c-7b411b528e51.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,c573171e-8e62-45b4-b85c-7b411b528e51.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=c573171e-8e62-45b4-b85c-7b411b528e51</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
About a week ago, the Facebook Data team quietly released <a href="http://code.google.com/p/the-cassandra-project/">the
Cassandra Project on Google Code</a>. The Cassandra project has been described as
a cross between Google's BigTable and Amazon's Dynamo storage systems. An overview
of the project is available in <a href="http://www.slideshare.net/jhammerb/data-presentations-cassandra-sigmod/">the
SIGMOD presentation on Cassandra</a> available at SlideShare. A summary of the salient
aspects of the project follows. 
</p>
        <p>
The problem Cassandra is aimed at solving is one that plagues social networking sites
or any other service that has lots of relationships between users and their data.
In such services, data often needs to be denormalized to prevent having to do lots
of joins when performing queries. However this means the system needs to deal with
the increased write traffic due to denormalization. At this point if you're using
a relational database, you realize you're pretty much breaking every major rule of
relational database design. Google tackled this problem by coming up with <a href="http://labs.google.com/papers/bigtable.html">BigTable</a>.
Facebook has followed their lead by developing Cassandra which they admit is inspired
by BigTable.  
</p>
        <p>
The Cassandra data model is fairly straightforward. The entire system is a giant table
with lots of rows. Each row is identified by a unique key. Each row has a column family,
which can be thought of as the schema for the row. A column family can contain thousands
of columns which are a tuple of {name, value, timestamp} and/or super columns which
are a tuple of {name, column+} where column+ means one or more columns. This is very
similar to the data model behind Google's BigTable. 
</p>
        <p>
As I mentioned earlier, denormalized data means you have to be able to handle a lot
more writes than you would if storing data in a normalized relational database. Cassandra
has several optimizations to make writes cheaper. When a write operation occurs, it
doesn't immediately cause a write to the disk. Instead the record is updated in memory
and the write operation is added to the commit log. Periodically the list of pending
writes is processed and write operations are flushed to disk. As part of the flushing
process the set of pending writes is analyzed and redundant writes eliminated. Additionally,
the writes are sorted so that the disk is written to sequentially thus significantly
improving seek time on the hard drive and reducing the impact of random writes to
the system. How important is improving seek time when accessing data on a hard drive?
It can <a href="http://stuartsierra.com/2008/04/17/disk-is-the-new-tape">make the
difference between taking hours versus days</a> to flush a hundred gigabytes of writes
to a disk. <em>Disk is the new tape. </em></p>
        <p>
Cassandra is described as "always writable" which means that a write operation
always returns success even if it fails internally to the system. This is similar
to the model exposed by <a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html">Amazon's
Dynamo</a> which has an <em>eventual consistency</em> model.  From what I've
read, it isn't clear how writes operations that occur during an internal failure are
reconciled and exposed to users of the system. I'm sure someone with more knowledge
can chime in in the comments. 
</p>
        <p>
At first glance, this is a very nice addition to the world of Open Source software
by the Facebook team. Kudos.
</p>
        <p>
Found via <a href="http://perspectives.mvdirona.com/2008/07/12/FacebookReleasesCassandraAsOpenSource.aspx">James
Hamilton</a>. 
</p>
        <p>
PS: Is it me or is this <a href="http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers">the
second significant instance</a> of Facebook Open Sourcing a key infrastructure component
"inspired" by Google internals? 
</p>
        <p>
        </p>
        <p>
        </p>
        <p>
          <b>Now Playing:</b>
          <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Ray J&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Ray
J</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Ray J+Gifts&amp;x=0&amp;y=0">Gifts</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=c573171e-8e62-45b4-b85c-7b411b528e51" />
      </body>
      <title>Project Cassandra: Facebook's Open Source Alternative to Google BigTable</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,c573171e-8e62-45b4-b85c-7b411b528e51.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/07/14/ProjectCassandraFacebooksOpenSourceAlternativeToGoogleBigTable.aspx</link>
      <pubDate>Mon, 14 Jul 2008 11:41:09 GMT</pubDate>
      <description>&lt;p&gt;
About a week ago, the Facebook Data team quietly released &lt;a href="http://code.google.com/p/the-cassandra-project/"&gt;the
Cassandra Project on Google Code&lt;/a&gt;. The Cassandra project has been described as
a cross between Google's BigTable and Amazon's Dynamo storage systems. An overview
of the project is available in &lt;a href="http://www.slideshare.net/jhammerb/data-presentations-cassandra-sigmod/"&gt;the
SIGMOD presentation on Cassandra&lt;/a&gt; available at SlideShare. A summary of the salient
aspects of the project follows. 
&lt;/p&gt;
&lt;p&gt;
The problem Cassandra is aimed at solving is one that plagues social networking sites
or any other service that has lots of relationships between users and their data.
In such services, data often needs to be denormalized to prevent having to do lots
of joins when performing queries. However this means the system needs to deal with
the increased write traffic due to denormalization. At this point if you're using
a relational database, you realize you're pretty much breaking every major rule of
relational database design. Google tackled this problem by coming up with &lt;a href="http://labs.google.com/papers/bigtable.html"&gt;BigTable&lt;/a&gt;.
Facebook has followed their lead by developing Cassandra which they admit is inspired
by BigTable.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
The Cassandra data model is fairly straightforward. The entire system is a giant table
with lots of rows. Each row is identified by a unique key. Each row has a column family,
which can be thought of as the schema for the row. A column family can contain thousands
of columns which are a tuple of {name, value, timestamp} and/or super columns which
are a tuple of {name, column+} where column+ means one or more columns. This is very
similar to the data model behind Google's BigTable. 
&lt;/p&gt;
&lt;p&gt;
As I mentioned earlier, denormalized data means you have to be able to handle a lot
more writes than you would if storing data in a normalized relational database. Cassandra
has several optimizations to make writes cheaper. When a write operation occurs, it
doesn't immediately cause a write to the disk. Instead the record is updated in memory
and the write operation is added to the commit log. Periodically the list of pending
writes is processed and write operations are flushed to disk. As part of the flushing
process the set of pending writes is analyzed and redundant writes eliminated. Additionally,
the writes are sorted so that the disk is written to sequentially thus significantly
improving seek time on the hard drive and reducing the impact of random writes to
the system. How important is improving seek time when accessing data on a hard drive?
It can &lt;a href="http://stuartsierra.com/2008/04/17/disk-is-the-new-tape"&gt;make the
difference between taking hours versus days&lt;/a&gt; to flush a hundred gigabytes of writes
to a disk. &lt;em&gt;Disk is the new tape. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Cassandra is described as &amp;quot;always writable&amp;quot; which means that a write operation
always returns success even if it fails internally to the system. This is similar
to the model exposed by &lt;a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html"&gt;Amazon's
Dynamo&lt;/a&gt; which has an &lt;em&gt;eventual consistency&lt;/em&gt; model.&amp;#160; From what I've
read, it isn't clear how writes operations that occur during an internal failure are
reconciled and exposed to users of the system. I'm sure someone with more knowledge
can chime in in the comments. 
&lt;/p&gt;
&lt;p&gt;
At first glance, this is a very nice addition to the world of Open Source software
by the Facebook team. Kudos.
&lt;/p&gt;
&lt;p&gt;
Found via &lt;a href="http://perspectives.mvdirona.com/2008/07/12/FacebookReleasesCassandraAsOpenSource.aspx"&gt;James
Hamilton&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
PS: Is it me or is this &lt;a href="http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers"&gt;the
second significant instance&lt;/a&gt; of Facebook Open Sourcing a key infrastructure component
&amp;quot;inspired&amp;quot; by Google internals? 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now Playing:&lt;/b&gt; &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Ray J&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Ray
J&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Ray J+Gifts&amp;amp;x=0&amp;amp;y=0"&gt;Gifts&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=c573171e-8e62-45b4-b85c-7b411b528e51" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,c573171e-8e62-45b4-b85c-7b411b528e51.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=898f56ef-0439-4100-90da-08701be03c13</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,898f56ef-0439-4100-90da-08701be03c13.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,898f56ef-0439-4100-90da-08701be03c13.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=898f56ef-0439-4100-90da-08701be03c13</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In the past year both Google and Facebook have released the remote procedure call
(RPC) technologies that are used for communication between servers within their data
centers as Open Source projects.  
</p>
        <p>
          <a href="http://developers.facebook.com/thrift/">Facebook Thrift</a> allows you to
define data types and service interfaces in a <a href="http://developers.facebook.com/thrift/tutorial.thrift">simple
definition file</a>. Taking that file as input, the compiler <a href="http://developers.facebook.com/thrift/Calculator.h">generates
code</a> to be used to easily build RPC clients and servers that communicate seamlessly
across programming languages. It supports the following programming languages; C++,
Java, Python, PHP and Ruby. 
</p>
        <p>
          <a title="http://code.google.com/p/protobuf/" href="http://code.google.com/p/protobuf/">Google
Protocol Buffers</a> allows you to define data types and service interfaces in a <a href="http://code.google.com/apis/protocolbuffers/docs/proto.html">simple
definition file</a>. Taking that file as input, the compiler <a href="http://code.google.com/apis/protocolbuffers/docs/reference/cpp-generated.html">generates
code</a> to be used to easily build RPC clients and servers that communicate seamlessly
across programming languages. It supports the following programming languages; C++,
Java and Python. 
</p>
        <p>
That’s interesting. Didn’t Steve Vinoski recently claim that <a title="Convenience over Correctness" href="http://steve.vinoski.net/blog/2008/07/01/convenience-over-correctness/">RPC
and it's descendants are "fundamentally flawed"</a>? If so, why are Google
and Facebook not only using RPC but proud enough of their usage of yet another distributed
object RPC technology <em>based on binary protocols</em> that they are Open Sourcing
them? Didn’t they get the memo that everyone is now on the REST + JSON/XML bandwagon
(<a href="http://www.tbray.org/ongoing/When/200x/2008/07/07/Atom">preferrably AtomPub</a>)? 
</p>
        <p>
In truth, Google is on the REST + XML band wagon. Google has the Google Data APIs
(<a href="http://code.google.com/apis/gdata/">GData</a>) which is a consistent set
of RESTful APIs for accessing data from Google's services based on the Atom Publishing
Protocol aka RFC 5023. And even Facebook has a set of plain old XML over HTTP APIs
(POX/HTTP) which they <strong>incorrectly</strong> refer to as the <a href="http://wiki.developers.facebook.com/index.php/API">Facebook
REST API</a>. 
</p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
So what is the story here? 
</p>
        <p>
It is all about coupling and how much control you have over the distributed end points.
On the Web where you have little to no control over who talks to your servers or what
technology they use, you want to utilize flexible technologies that make no assumptions
about either end of the communication. This is where RESTful XML-based Web services
shine. However when you have tight control over the service end points (e.g. if they
are all your servers running in your data center) then you can use more optimized
communications technologies that add a layer of tight coupling to your system. An
example of the kind of tight coupling you have to live with is that  Facebook
Thrift requires specific versions of g++ and Java if you plan to talk to it using
code written in either language and you can’t talk to it from a service written in
C#. 
</p>
        <p>
In general, the Web is about openness and loose coupling. Binary protocols that require
specific programming languages and runtimes are the exact opposite of this. However
inside your Web service where you control both ends of the pipe, you can optimize
the interaction between your services and simplify development by going with a binary
RPC based technology. More than likely different parts of your system are already
doing this anyway (e.g. <a href="http://www.danga.com/memcached/">memcached</a> uses
a binary protocol to talk between cache instances, SQL Server uses <a href="http://msdn.microsoft.com/en-us/library/cc448435.aspx">TDS</a> as
the communications protocol between the database and it's clients, etc). 
</p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
Always remember to use the right tool for the job. One size doesn’t fit all when it
comes to technology decisions. 
</p>
        <p>
FURTHER READING 
</p>
        <ul>
          <li>
            <a href="http://keithelder.net/blog/archive/2008/01/17/Exposing-a-WCF-Service-With-Multiple-Bindings-and-Endpoints.aspx">Exposing
a WCF Service With Multiple Bindings and Endpoints</a> – Keith Elder describes how
Windows Communication Foundation (WCF) supports multiple bindings that enable developers
to expose their services in a variety of ways.  A developer can create a service
once and then expose it to support net.tcp:// or http:// and various versions of http://
(Soap1.1, Soap1.2, WS*, JSON, etc).  This can be useful if a service crosses
boundaries between the intranet and the Internet. 
</li>
        </ul>
        <p>
          <b>Now Playing:</b>
          <a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;unfiltered=1&amp;field-keywords=&amp;field-artist=Pink&amp;field-title=&amp;field-label=&amp;field-binding=&amp;sort=relevancerank&amp;Adv-Srch-Music-Album-Submit.x=19&amp;Adv-Srch-Music-Album-Submit.y=6">Pink</a> - <a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;field-keywords=Pink+Family Portrait&amp;x=0&amp;y=0">Family
Portrait</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=898f56ef-0439-4100-90da-08701be03c13" />
      </body>
      <title>The Revenge of RPC: Google Protocol Buffers and Facebook Thrift</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,898f56ef-0439-4100-90da-08701be03c13.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/07/10/TheRevengeOfRPCGoogleProtocolBuffersAndFacebookThrift.aspx</link>
      <pubDate>Thu, 10 Jul 2008 14:23:19 GMT</pubDate>
      <description>&lt;p&gt;
In the past year both Google and Facebook have released the remote procedure call
(RPC) technologies that are used for communication between servers within their data
centers as Open Source projects.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://developers.facebook.com/thrift/"&gt;Facebook Thrift&lt;/a&gt; allows you to
define data types and service interfaces in a &lt;a href="http://developers.facebook.com/thrift/tutorial.thrift"&gt;simple
definition file&lt;/a&gt;. Taking that file as input, the compiler &lt;a href="http://developers.facebook.com/thrift/Calculator.h"&gt;generates
code&lt;/a&gt; to be used to easily build RPC clients and servers that communicate seamlessly
across programming languages. It supports the following programming languages; C++,
Java, Python, PHP and Ruby. 
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://code.google.com/p/protobuf/" href="http://code.google.com/p/protobuf/"&gt;Google
Protocol Buffers&lt;/a&gt; allows you to define data types and service interfaces in a &lt;a href="http://code.google.com/apis/protocolbuffers/docs/proto.html"&gt;simple
definition file&lt;/a&gt;. Taking that file as input, the compiler &lt;a href="http://code.google.com/apis/protocolbuffers/docs/reference/cpp-generated.html"&gt;generates
code&lt;/a&gt; to be used to easily build RPC clients and servers that communicate seamlessly
across programming languages. It supports the following programming languages; C++,
Java and Python. 
&lt;/p&gt;
&lt;p&gt;
That’s interesting. Didn’t Steve Vinoski recently claim that &lt;a title="Convenience over Correctness" href="http://steve.vinoski.net/blog/2008/07/01/convenience-over-correctness/"&gt;RPC
and it's descendants are &amp;quot;fundamentally flawed&amp;quot;&lt;/a&gt;? If so, why are Google
and Facebook not only using RPC but proud enough of their usage of yet another distributed
object RPC technology &lt;em&gt;based on binary protocols&lt;/em&gt; that they are Open Sourcing
them? Didn’t they get the memo that everyone is now on the REST + JSON/XML bandwagon
(&lt;a href="http://www.tbray.org/ongoing/When/200x/2008/07/07/Atom"&gt;preferrably AtomPub&lt;/a&gt;)? 
&lt;/p&gt;
&lt;p&gt;
In truth, Google is on the REST + XML band wagon. Google has the Google Data APIs
(&lt;a href="http://code.google.com/apis/gdata/"&gt;GData&lt;/a&gt;) which is a consistent set
of RESTful APIs for accessing data from Google's services based on the Atom Publishing
Protocol aka RFC 5023. And even Facebook has a set of plain old XML over HTTP APIs
(POX/HTTP) which they &lt;strong&gt;incorrectly&lt;/strong&gt; refer to as the &lt;a href="http://wiki.developers.facebook.com/index.php/API"&gt;Facebook
REST API&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
So what is the story here? 
&lt;/p&gt;
&lt;p&gt;
It is all about coupling and how much control you have over the distributed end points.
On the Web where you have little to no control over who talks to your servers or what
technology they use, you want to utilize flexible technologies that make no assumptions
about either end of the communication. This is where RESTful XML-based Web services
shine. However when you have tight control over the service end points (e.g. if they
are all your servers running in your data center) then you can use more optimized
communications technologies that add a layer of tight coupling to your system. An
example of the kind of tight coupling you have to live with is that&amp;#160; Facebook
Thrift requires specific versions of g++ and Java if you plan to talk to it using
code written in either language and you can’t talk to it from a service written in
C#. 
&lt;/p&gt;
&lt;p&gt;
In general, the Web is about openness and loose coupling. Binary protocols that require
specific programming languages and runtimes are the exact opposite of this. However
inside your Web service where you control both ends of the pipe, you can optimize
the interaction between your services and simplify development by going with a binary
RPC based technology. More than likely different parts of your system are already
doing this anyway (e.g. &lt;a href="http://www.danga.com/memcached/"&gt;memcached&lt;/a&gt; uses
a binary protocol to talk between cache instances, SQL Server uses &lt;a href="http://msdn.microsoft.com/en-us/library/cc448435.aspx"&gt;TDS&lt;/a&gt; as
the communications protocol between the database and it's clients, etc). 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Always remember to use the right tool for the job. One size doesn’t fit all when it
comes to technology decisions. 
&lt;/p&gt;
&lt;p&gt;
FURTHER READING 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://keithelder.net/blog/archive/2008/01/17/Exposing-a-WCF-Service-With-Multiple-Bindings-and-Endpoints.aspx"&gt;Exposing
a WCF Service With Multiple Bindings and Endpoints&lt;/a&gt; – Keith Elder describes how
Windows Communication Foundation (WCF) supports multiple bindings that enable developers
to expose their services in a variety of ways.&amp;#160; A developer can create a service
once and then expose it to support net.tcp:// or http:// and various versions of http://
(Soap1.1, Soap1.2, WS*, JSON, etc).&amp;#160; This can be useful if a service crosses
boundaries between the intranet and the Internet. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;b&gt;Now Playing:&lt;/b&gt; &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Pink&amp;amp;field-title=&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Pink&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Pink+Family Portrait&amp;amp;x=0&amp;amp;y=0"&gt;Family
Portrait&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=898f56ef-0439-4100-90da-08701be03c13" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,898f56ef-0439-4100-90da-08701be03c13.aspx</comments>
      <category>Platforms</category>
      <category>Programming</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=6610ac1c-1984-4c9f-9efb-dd03f1bac524</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,6610ac1c-1984-4c9f-9efb-dd03f1bac524.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,6610ac1c-1984-4c9f-9efb-dd03f1bac524.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6610ac1c-1984-4c9f-9efb-dd03f1bac524</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.gnipcentral.com/">Gnip</a> is a newly launched startup that pitches
itself as a service that aims to “make data portability suck less”. Mike Arrington
describes the service in his post <a href="http://www.techcrunch.com/2008/07/01/gnip-launches-to-ease-the-strain-on-web-services/">Gnip
Launches To Ease The Strain On Web Services</a> which is excerpted below 
</p>
        <blockquote>
          <p>
            <em>A close analogy is a blog ping server (</em>
            <a href="http://www.techcrunch.com/2005/07/08/profile-weblogscom-ping-server/">
              <em>see
our overview here</em>
            </a>
            <em>). Ping servers tell blog search engines like Technorati
and Google Blog Search when a blog has been updated, so the search engines don’t have
to constantly re-index sites just to see if new content has been posted. Instead,
the blog tells the ping server when it updates, which tells the search engines to
drop by and re-index. The creation of the first ping server, Weblogs.com, by Dave
Winer resulted in orders of magnitude better efficiency for blog search engines.</em>
          </p>
          <p>
            <em>
              <img alt="" src="http://www.techcrunch.com/wp-content/uploads/2008/07/gnipchart.jpg" />
            </em>
          </p>
          <p>
            <em>The same thinking basically applies to Gnip. The idea is to gather simple information
from social networks - just a username and the fact that they created new content
(like writing a Twitter message, for example). Gnip then distributes that data to
whoever wants it, and those downstream services can then access the core service’s
API, with proper user authentication, and access the actual data (in our example,
the actual Twitter message).</em>
          </p>
          <p>
            <em>From a user’s perspective, the result is faster data updates across services and
less downtime for services since their APIs won’t be hit as hard.</em>
          </p>
        </blockquote>
        <p>
From my perspective, Gnip also shares some similarity to services like <a href="http://www.feedburner.com">FeedBurner</a> as
well as blog ping servers. The original purpose of blog ping servers was to make it
cheaper for services like <a href="http://www.technorati.com">Technorati</a> and <a href="http://www.readwriteweb.com/archives/blog_search_feedster_quietly_dies.php">Feedster</a> to
index the blogosphere without having to invest in a Google-sized server farm and crawl
the entire Web every couple of minutes. In addition, since blogs often have tiny readerships
and are thus infrequently linked to, crawling alone was not enough to ensure that
they find their way into the search index. It wasn’t about taking load off of the
sites that were doing the pinging. 
</p>
        <p>
On the other hand, FeedBurner hosts a site’s RSS feed as a way to take load off of
their servers and then provides analytics data so the site doesn’t miss out from losing
the direct connection to its subscribers. This is more in line with the expectation
that Gnip will take load off of a service’s API servers. However unlike FeedBurner,
Gnip doesn’t actually store the user data from the social networking site. It simply
stores a record that indicates that “user X on site Y made an update of type Z at
time T”.  The thinking is that web sites will publish a notification to Gnip
whenever their users perform an update. Below is a sample interaction between Digg
and Gnip where Digg notifies Gnip that the users amy and john.doe have dugg two stories. 
</p>
        <blockquote>
          <pre>
            <code>===&gt; POST /publishers/digg/activity.xml Accept: application/xml
Content-Type: application/xml &lt;activities&gt; &lt;activity at="2008-06-08T10:12:42Z"
uid="amy" type="dugg" guid="http://digg.com/odd_stuff/a_story"/&gt; &lt;activity at="2008-06-09T09:14:07Z"
uid="john.doe" type="dugg" guid="http://digg.com/odd_stuff/really_weird"/&gt; &lt;/activities&gt;
&lt;--- 200 OK Content-Type: application/xml &lt;result&gt;Success&lt;/result&gt; 
</code>
          </pre>
        </blockquote>
        <p>
        </p>
        <p>
There are two modes in which "subscribers" can choose to interact with the data published
to Gnip. The first is in a mode similar to how blog search engines interact with the <a href="http://www.weblogs.com/api.html#10">changes.xml
file on Weblogs.com</a> and other blog ping servers. For example, services like <a href="http://www.summize.com">Summize</a> or <a href="http://www.tweetscan.com/">TweetScan</a> can
ask Gnip for the last hour of changes on Twitter instead of whatever mechanism they
are using today to crawl the site. Below is what a sample interaction to retrieve
the most recent updates on Twitter from Gnip would look like 
</p>
        <blockquote>
          <pre>
            <code>===&gt;<br />
GET /publishers/<b>twitter</b>/activity/current.xml<br />
Accept: application/xml<br /><br />
&lt;---<br />
200 OK<br />
Content-Type: application/xml<br /><br />
&lt;activities&gt;<br />
&lt;activity at="2008-06-08T10:12:07Z" uid="john.doe" type="tweet" guid="http://twitter.com/john.doe/statuses/42"/&gt;<br />
&lt;activity at="2008-06-08T10:12:42Z" uid="amy" type="tweet" guid="http://twitter.com/amy/statuses/52"/&gt;<br />
&lt;/activities&gt; </code>
          </pre>
        </blockquote>
        <p>
The main problem with this approach is the same one that affects blog ping servers.
If the rate of updates is more than the ping server can handle then it may begin to
fall behind or lose updates completely. Services that don’t want to risk their content
not being crawled are best off providing their own update stream that applications
can poll periodically. That’s why the folks at Six Apart came up with the <a href="http://updates.sixapart.com/">Six
Apart Update Stream for LiveJournal, TypePad and Vox weblogs</a>. 
</p>
        <p>
The second mode is one that has gotten Twitter fans like Dave Winer <a title="I wish Twitter would partner with Gnip" href="http://www.scripting.com/stories/2008/07/01/iWishTwitterWouldPartnerWi.html">raving
about Gnip being the solution to Twitter’s scaling problems</a>. In this mode, an
application creates a <a href="http://docs.google.com/View?docid=dgkhvp8s_3hhwdmdfb#Collections">collection</a> of
one or more usernames they are interested in. Below is what a collection document
created by the <a href="http://arsecandle.org/twadget/">Twadget</a> application to
indicate that it is interested in my Twitter updates might look like. 
</p>
        <blockquote>
          <p>
&lt;collection name="twadget-carnage4life"&gt;<br />
     &lt;uid name="carnage4life" publisher.name="twitter"/&gt;<br />
&lt;/collection&gt;
</p>
        </blockquote>
        <p>
Then instead of polling Twitter every 5 minutes for updates it polls Gnip every 5
minutes for updates and only talks to Twitter’s servers when Gnip indicates that I’ve
made an update since the last time the application polled Gnip. The interaction between
Twadget and Gnip would then be as follows 
</p>
        <blockquote>
          <pre>
            <code>===&gt;<br />
GET /collections/twadget-carnage4life/activity/current.xml<br />
Accept: application/xml<br />
&lt;---<br />
200 OK<br />
Content-Type: application/xml<br /><br />
&lt;activities&gt;<br />
&lt;activity at="2008-06-08T10:12:07Z" uid="carnage4life" type="tweet" guid="<a title="http://twitter.com/Carnage4Life/statuses/850726804" href="http://twitter.com/Carnage4Life/statuses/850726804">http://twitter.com/Carnage4Life/statuses/850726804</a>"/&gt;</code>
            <code>
            </code>
            <br />
            <code> &lt;/activities&gt; </code>
          </pre>
        </blockquote>
        <p>
Of course, this makes me wonder why one would think that it is feasible for Gnip to
build a system that can handle the API polling traffic of every microblogging and
social networking site out there but it is infeasible for Twitter to figure out how
to handle the polling traffic for their own service. Talk about lowered expectations. <img title="Wink" style="vertical-align: middle" alt="Wink" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/smile_wink.gif" /></p>
        <p>
So what do I think of Gnip? I think the ping server mode may be of some interest for
services that think it is cheaper to have code that pings Gnip after every user update
instead building out an update stream service. However since a lot of sites already
have some equivalent of the <a href="http://twitter.com/public_timeline">public timeline</a> it
isn’t clear that there is a huge <strong><u>need</u></strong> for a ping service.
Crawlers can just hit the public timeline which I <em>assume</em> is what services
like Summize and TweetScan do to keep their indexes of tweets up to date. 
</p>
        <p>
As for using Gnip as a mechanism for reducing the load API clients put on a microblogging
or similar service? Gnip is <strong><u>totally useless</u></strong> for that in it’s
current incarnation. API clients aren’t interested in updates made by single user.
They are interested in all the updates made by all the people the user is following.
So for Twadget to use Gnip to lighten the load it causes on Twitter’s servers on my
behalf, it has to build a collection of all the people I am following in Gnip and
then keep that list of users in sync with whatever that list is on Twitter. But if
it has to constantly poll Twitter for my friend list, isn’t it still putting the same
amount of load on Twitter? I guess this could be fixed by having Twitter publish follower/following
lists to Gnip but that introduces all sorts of interesting technical and privacy issues.
But that doesn’t matter since the folks at Gnip brag <a title="The HOW of Gnip: keep it simple stupid!" href="http://blog.gnipcentral.com/2008/07/04/the-how-of-gnip-keep-it-simple-stupid/">about
only keeping 60 minutes of worth of updates</a> as the “secret sauce” to their scalability.
This means if I shut my Twitter client hasn’t polled Gnip in a 60 minute window (maybe
my laptop is closed) then it doesn’t matter anyway and it has to poll Twitter. 
I suspect someone didn’t finish doing their homework before rushing to “launch” Gnip. 
</p>
        <p>
          <u>PS:</u> One thing that is confusing to me is why all communication between applications
and Gnip needs to be over SSL. The only thing I can see it adding is making it more
expensive for Gnip run their service. I can’t think of any reason why the interactions
described above need to be over a secure channel. 
</p>
        <p>
          <b>Now Playing:</b>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Lil Wayne">Lil
Wayne</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Hustler Musik&amp;artistTerm=Lil Wayne">Hustler
Musik</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=6610ac1c-1984-4c9f-9efb-dd03f1bac524" />
      </body>
      <title>Gnip: FeedBurner + Ping Server for Web APIs</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,6610ac1c-1984-4c9f-9efb-dd03f1bac524.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/07/07/GnipFeedBurnerPingServerForWebAPIs.aspx</link>
      <pubDate>Mon, 07 Jul 2008 13:13:49 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.gnipcentral.com/"&gt;Gnip&lt;/a&gt; is a newly launched startup that pitches
itself as a service that aims to “make data portability suck less”. Mike Arrington
describes the service in his post &lt;a href="http://www.techcrunch.com/2008/07/01/gnip-launches-to-ease-the-strain-on-web-services/"&gt;Gnip
Launches To Ease The Strain On Web Services&lt;/a&gt; which is excerpted below 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;A close analogy is a blog ping server (&lt;/em&gt;&lt;a href="http://www.techcrunch.com/2005/07/08/profile-weblogscom-ping-server/"&gt;&lt;em&gt;see
our overview here&lt;/em&gt;&lt;/a&gt;&lt;em&gt;). Ping servers tell blog search engines like Technorati
and Google Blog Search when a blog has been updated, so the search engines don’t have
to constantly re-index sites just to see if new content has been posted. Instead,
the blog tells the ping server when it updates, which tells the search engines to
drop by and re-index. The creation of the first ping server, Weblogs.com, by Dave
Winer resulted in orders of magnitude better efficiency for blog search engines.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;img alt="" src="http://www.techcrunch.com/wp-content/uploads/2008/07/gnipchart.jpg"&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The same thinking basically applies to Gnip. The idea is to gather simple information
from social networks - just a username and the fact that they created new content
(like writing a Twitter message, for example). Gnip then distributes that data to
whoever wants it, and those downstream services can then access the core service’s
API, with proper user authentication, and access the actual data (in our example,
the actual Twitter message).&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;From a user’s perspective, the result is faster data updates across services and
less downtime for services since their APIs won’t be hit as hard.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
From my perspective, Gnip also shares some similarity to services like &lt;a href="http://www.feedburner.com"&gt;FeedBurner&lt;/a&gt; as
well as blog ping servers. The original purpose of blog ping servers was to make it
cheaper for services like &lt;a href="http://www.technorati.com"&gt;Technorati&lt;/a&gt; and &lt;a href="http://www.readwriteweb.com/archives/blog_search_feedster_quietly_dies.php"&gt;Feedster&lt;/a&gt; to
index the blogosphere without having to invest in a Google-sized server farm and crawl
the entire Web every couple of minutes. In addition, since blogs often have tiny readerships
and are thus infrequently linked to, crawling alone was not enough to ensure that
they find their way into the search index. It wasn’t about taking load off of the
sites that were doing the pinging. 
&lt;/p&gt;
&lt;p&gt;
On the other hand, FeedBurner hosts a site’s RSS feed as a way to take load off of
their servers and then provides analytics data so the site doesn’t miss out from losing
the direct connection to its subscribers. This is more in line with the expectation
that Gnip will take load off of a service’s API servers. However unlike FeedBurner,
Gnip doesn’t actually store the user data from the social networking site. It simply
stores a record that indicates that “user X on site Y made an update of type Z at
time T”.&amp;nbsp; The thinking is that web sites will publish a notification to Gnip
whenever their users perform an update. Below is a sample interaction between Digg
and Gnip where Digg notifies Gnip that the users amy and john.doe have dugg two stories. 
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;===&amp;gt; POST /publishers/digg/activity.xml Accept: application/xml
Content-Type: application/xml &amp;lt;activities&amp;gt; &amp;lt;activity at="2008-06-08T10:12:42Z"
uid="amy" type="dugg" guid="http://digg.com/odd_stuff/a_story"/&amp;gt; &amp;lt;activity at="2008-06-09T09:14:07Z"
uid="john.doe" type="dugg" guid="http://digg.com/odd_stuff/really_weird"/&amp;gt; &amp;lt;/activities&amp;gt;
&amp;lt;--- 200 OK Content-Type: application/xml &amp;lt;result&amp;gt;Success&amp;lt;/result&amp;gt; 
&lt;/pre&gt;&gt;&lt;/blockquote&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
There are two modes in which "subscribers" can choose to interact with the data published
to Gnip. The first is in a mode similar to how blog search engines interact with the &lt;a href="http://www.weblogs.com/api.html#10"&gt;changes.xml
file on Weblogs.com&lt;/a&gt; and other blog ping servers. For example, services like &lt;a href="http://www.summize.com"&gt;Summize&lt;/a&gt; or &lt;a href="http://www.tweetscan.com/"&gt;TweetScan&lt;/a&gt; can
ask Gnip for the last hour of changes on Twitter instead of whatever mechanism they
are using today to crawl the site. Below is what a sample interaction to retrieve
the most recent updates on Twitter from Gnip would look like 
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;===&amp;gt;&lt;br&gt;
GET /publishers/&lt;b&gt;twitter&lt;/b&gt;/activity/current.xml&lt;br&gt;
Accept: application/xml&lt;br&gt;
&lt;br&gt;
&amp;lt;---&lt;br&gt;
200 OK&lt;br&gt;
Content-Type: application/xml&lt;br&gt;
&lt;br&gt;
&amp;lt;activities&amp;gt;&lt;br&gt;
&amp;lt;activity at="2008-06-08T10:12:07Z" uid="john.doe" type="tweet" guid="http://twitter.com/john.doe/statuses/42"/&amp;gt;&lt;br&gt;
&amp;lt;activity at="2008-06-08T10:12:42Z" uid="amy" type="tweet" guid="http://twitter.com/amy/statuses/52"/&amp;gt;&lt;br&gt;
&amp;lt;/activities&amp;gt; &lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt; 
&lt;p&gt;
The main problem with this approach is the same one that affects blog ping servers.
If the rate of updates is more than the ping server can handle then it may begin to
fall behind or lose updates completely. Services that don’t want to risk their content
not being crawled are best off providing their own update stream that applications
can poll periodically. That’s why the folks at Six Apart came up with the &lt;a href="http://updates.sixapart.com/"&gt;Six
Apart Update Stream for LiveJournal, TypePad and Vox weblogs&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The second mode is one that has gotten Twitter fans like Dave Winer &lt;a title="I wish Twitter would partner with Gnip" href="http://www.scripting.com/stories/2008/07/01/iWishTwitterWouldPartnerWi.html"&gt;raving
about Gnip being the solution to Twitter’s scaling problems&lt;/a&gt;. In this mode, an
application creates a &lt;a href="http://docs.google.com/View?docid=dgkhvp8s_3hhwdmdfb#Collections"&gt;collection&lt;/a&gt; of
one or more usernames they are interested in. Below is what a collection document
created by the &lt;a href="http://arsecandle.org/twadget/"&gt;Twadget&lt;/a&gt; application to
indicate that it is interested in my Twitter updates might look like. 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&amp;lt;collection name="twadget-carnage4life"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;uid name="carnage4life" publisher.name="twitter"/&amp;gt;&lt;br&gt;
&amp;lt;/collection&amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Then instead of polling Twitter every 5 minutes for updates it polls Gnip every 5
minutes for updates and only talks to Twitter’s servers when Gnip indicates that I’ve
made an update since the last time the application polled Gnip. The interaction between
Twadget and Gnip would then be as follows 
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;===&amp;gt;&lt;br&gt;
GET /collections/twadget-carnage4life/activity/current.xml&lt;br&gt;
Accept: application/xml&lt;br&gt;
&amp;lt;---&lt;br&gt;
200 OK&lt;br&gt;
Content-Type: application/xml&lt;br&gt;
&lt;br&gt;
&amp;lt;activities&amp;gt;&lt;br&gt;
&amp;lt;activity at="2008-06-08T10:12:07Z" uid="carnage4life" type="tweet" guid="&lt;a title="http://twitter.com/Carnage4Life/statuses/850726804" href="http://twitter.com/Carnage4Life/statuses/850726804"&gt;http://twitter.com/Carnage4Life/statuses/850726804&lt;/a&gt;"/&amp;gt;&lt;/code&gt;&lt;code&gt; &lt;/code&gt;
&lt;br&gt;
&lt;code&gt; &amp;lt;/activities&amp;gt; &lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt; 
&lt;p&gt;
Of course, this makes me wonder why one would think that it is feasible for Gnip to
build a system that can handle the API polling traffic of every microblogging and
social networking site out there but it is infeasible for Twitter to figure out how
to handle the polling traffic for their own service. Talk about lowered expectations. &lt;img title="Wink" style="vertical-align: middle" alt="Wink" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/smile_wink.gif"&gt; 
&lt;/p&gt;
&lt;p&gt;
So what do I think of Gnip? I think the ping server mode may be of some interest for
services that think it is cheaper to have code that pings Gnip after every user update
instead building out an update stream service. However since a lot of sites already
have some equivalent of the &lt;a href="http://twitter.com/public_timeline"&gt;public timeline&lt;/a&gt; it
isn’t clear that there is a huge &lt;strong&gt;&lt;u&gt;need&lt;/u&gt;&lt;/strong&gt; for a ping service.
Crawlers can just hit the public timeline which I &lt;em&gt;assume&lt;/em&gt; is what services
like Summize and TweetScan do to keep their indexes of tweets up to date. 
&lt;/p&gt;
&lt;p&gt;
As for using Gnip as a mechanism for reducing the load API clients put on a microblogging
or similar service? Gnip is &lt;strong&gt;&lt;u&gt;totally useless&lt;/u&gt;&lt;/strong&gt; for that in it’s
current incarnation. API clients aren’t interested in updates made by single user.
They are interested in all the updates made by all the people the user is following.
So for Twadget to use Gnip to lighten the load it causes on Twitter’s servers on my
behalf, it has to build a collection of all the people I am following in Gnip and
then keep that list of users in sync with whatever that list is on Twitter. But if
it has to constantly poll Twitter for my friend list, isn’t it still putting the same
amount of load on Twitter? I guess this could be fixed by having Twitter publish follower/following
lists to Gnip but that introduces all sorts of interesting technical and privacy issues.
But that doesn’t matter since the folks at Gnip brag &lt;a title="The HOW of Gnip: keep it simple stupid!" href="http://blog.gnipcentral.com/2008/07/04/the-how-of-gnip-keep-it-simple-stupid/"&gt;about
only keeping 60 minutes of worth of updates&lt;/a&gt; as the “secret sauce” to their scalability.
This means if I shut my Twitter client hasn’t polled Gnip in a 60 minute window (maybe
my laptop is closed) then it doesn’t matter anyway and it has to poll Twitter.&amp;nbsp;
I suspect someone didn’t finish doing their homework before rushing to “launch” Gnip. 
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;PS:&lt;/u&gt; One thing that is confusing to me is why all communication between applications
and Gnip needs to be over SSL. The only thing I can see it adding is making it more
expensive for Gnip run their service. I can’t think of any reason why the interactions
described above need to be over a secure channel. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now Playing:&lt;/b&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Lil Wayne"&gt;Lil
Wayne&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Hustler Musik&amp;amp;artistTerm=Lil Wayne"&gt;Hustler
Musik&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=6610ac1c-1984-4c9f-9efb-dd03f1bac524" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,6610ac1c-1984-4c9f-9efb-dd03f1bac524.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=9a778e9f-da8f-40e5-a17b-f9fcd398700d</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,9a778e9f-da8f-40e5-a17b-f9fcd398700d.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,9a778e9f-da8f-40e5-a17b-f9fcd398700d.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=9a778e9f-da8f-40e5-a17b-f9fcd398700d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Late last week, the folks on the Google Data APIs blog announced that <a title="OAuth for Google Data APIs" href="http://googledataapis.blogspot.com/2008/06/oauth-for-google-data-apis.html">Google
will now be supporting OAuth</a> as the delegated authentication mechanism for all
Google Data APIs. This move is meant to encourage the various online services that
provide APIs that access a user’s data in the “cloud” to stop reinventing the wheel
when it comes to delegated authentication and standardize on a single approach. 
</p>
        <p>
Every well-designed Web API that provides access to a customer’s data in the cloud
utilizes a delegated authentication mechanism which allows users to grant 3rd party
applications access to their data without having to give the application their username
and password. There is a good analogy for this practice in the <a href="http://oauth.net/about/">OAuth:
Introduction page</a> which is excerpted below 
</p>
        <blockquote>
          <h5>What is it For?
</h5>
          <p>
Many luxury cars today come with a valet key. It is a special key you give the parking
attendant and unlike your regular key, will not allow the car to drive more than a
mile or two. Some valet keys will not open the trunk, while others will block access
to your onboard cell phone address book. Regardless of what restrictions the valet
key imposes, the idea is very clever. You give someone limited access to your car
with a special key, while using your regular key to unlock everything.
</p>
          <p>
Everyday new website offer services which tie together functionality from other sites.
A photo lab printing your online photos, a social network using your address book
to look for friends, and APIs to build your own desktop application version of a popular
site. These are all great services – what is not so great about some of the implementations
available today is their request for your username and password to the other site.
When you agree to share your secret credentials, not only you expose your password
to someone else (yes, that same password you also use for online banking), you also
give them full access to do as they wish. They can do anything they wanted – even
change your password and lock you out.
</p>
          <p>
This is what OAuth does, it allows the you the User to grant access to your private
resources on one site (which is called the Service Provider), to another site (called
Consumer, not to be confused with you, the User). While OpenID is all about using
a single identity to sign into many sites, OAuth is about giving access to your stuff
without sharing your identity at all (or its secret parts).
</p>
        </blockquote>
        <p>
So every service provider invented their own protocol to do this, all of which are
different but have the same basic components. Today we have <a href="http://code.google.com/apis/gdata/authsub.html">Google
AuthSub</a>, <a href="http://developer.yahoo.com/auth/">Yahoo! BBAuth</a>, <a href="http://msdn.microsoft.com/en-us/library/cc287637.aspx">Windows
Live DelAuth</a>, <a href="http://dev.aol.com/api/openauth">AOL OpenAuth</a>, the <a href="http://www.flickr.com/services/api/auth.spec.html">Flickr
Authentication API</a>, the <a href="http://developers.facebook.com/documentation.php?doc=auth">Facebook
Authentication API</a> and others. All different, proprietary solutions to the same
problem. 
</p>
        <p>
This ends up being problematic for developers because if you want to build an application
that talks to multiple services you not only have to deal with the different APIs
provided by these services but also the different authorization/authentication models
they utilize as well. In a world where “social aggregation” is becoming more commonplace
with services like <a href="http://www.plaxo.com/tour">Plaxo Pulse</a> &amp; <a href="http://friendfeed.com/about/">FriendFeed</a> and
more applications are trying to bridge the desktop/cloud divide like <a href="http://www.melsam.com/outsync/">OutSync</a> and <a title="RSS Bandit Syncs RSS Feeds Between Desktop and Google Reader" href="http://lifehacker.com/396865/rss-bandit-syncs-rss-feeds-between-desktop-and-google-reader">RSS
Bandit</a>, it sucks that these applications have to rewrite the same type of code
over and over again to deal with the basic task of getting permission to access a
user’s data. Standardizing on OAuth is meant to fix that. A number of startups like
Digg &amp; Twitter as well as major players like Yahoo and Google have promised to
support it, so this should make the lives of developers easier. 
</p>
        <p>
Of course, we still have work to do as an industry when it comes to the constant wheel
reinvention in the area of Web APIs. Chris Messina points to another place where every
major service provider has invented a different proprietary protocol for doing the
same task in his post <a title="http://factoryjoe.com/blog/2008/06/04/inventing-contact-schemas-for-fun-and-profit-ugh/" href="http://factoryjoe.com/blog/2008/06/04/inventing-contact-schemas-for-fun-and-profit-ugh/">Inventing
contact schemas for fun and profit! (Ugh)</a> where he writes
</p>
        <blockquote>
          <p>
            <em>And then </em>
            <a href="http://code.google.com/apis/contacts/">
              <em>there</em>
            </a>
            <em>
            </em>
            <a href="http://msdn.microsoft.com/en-us/library/bb463989.aspx">
              <em>were</em>
            </a>
            <em>
            </em>
            <a href="http://developer.yahoo.com/addressbook/">
              <em>three</em>
            </a>
            <br />
            <em>... 
<br />
Today, Yahoo! </em>
            <a href="http://developer.yahoo.net/blog/archives/2008/06/addressbook_api.html">
              <em>announced
the public availability</em>
            </a>
            <em> of their own </em>
            <a href="http://developer.yahoo.com/addressbook/">
              <em>Address
Book API</em>
            </a>
            <em>. </em>
          </p>
          <p>
            <em>However, I have to lament yet more needless reinvention of contact schema. Why
is this a problem? Well, as I pointed out about Facebook’s approach to developing
their own platform methods and formats, having to write and debug against yet another
contact schema makes the “tax” of adding support for contact syncing and export increasingly
onerous for sites and web services that want to better serve their customers by letting
them host and maintain their address book elsewhere.</em>
          </p>
          <p>
            <em>This isn’t just a problem that I have with Yahoo!. It’s </em>
            <a href="http://factoryjoe.com/blog/2007/11/01/hcard-for-openid-simple-registration-and-attribute-exchange/">
              <em>something
that I encountered last November</em>
            </a>
            <em> with the </em>
            <a href="http://openid.net/specs/openid-simple-registration-extension-1_0.html">
              <abbr>
                <em>SREG</em>
              </abbr>
            </a>
            <em> and proposed </em>
            <a href="http://www.axschema.org/types/">
              <em>Attribute
Exchange profile definition</em>
            </a>
            <em>. And yet again when </em>
            <a href="http://googledataapis.blogspot.com/2008/03/3-2-1-contact-api-has-landed.html">
              <em>Google
announced their Contacts API</em>
            </a>
            <em>. And then again when </em>
            <a href="http://dev.live.com/blogs/devlive/archive/2008/03/25/237.aspx">
              <em>Microsoft
released theirs</em>
            </a>
            <em>! Over and over again we’re seeing better ways of fighting
the password anti-pattern flow of inviting friends to new social services, but having
to implement support for countless contact schemas. <strong>What we need is one common
contacts interchange format and I strongly suggest that it inherit from vcard with
allowances or extension points for contemporary trends in social networking profile
data.</strong></em>
          </p>
          <p>
            <em>I’ve gone ahead and whipped up a </em>
            <a href="http://spreadsheets.google.com/pub?key=pSGbbhtwI4kN_nJ1GXeQ7Qg">
              <em>comparison
matrix between the primary contact schemas</em>
            </a>
            <em> to demonstrate the mess we’re
in.</em>
          </p>
        </blockquote>
        <p>
Kudos to the folks at Google for trying to force the issue when it comes to standardizing
on a delegated authentication protocol for use on the Web. However there are still
lots of places across the industry where we speak different protocols and thus incur
a needless burden on developers when a single language might do. It would be nice
to see some of this unnecessary redundancy eliminated in the future. 
</p>
        <p>
          <b>Now Playing:</b>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=G-Unit">G-Unit</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=I Like The Way She Do It&amp;artistTerm=G-Unit">I
Like The Way She Do It</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=9a778e9f-da8f-40e5-a17b-f9fcd398700d" />
      </body>
      <title>Some Thoughts on Google Adopting OAuth for GData APIs</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,9a778e9f-da8f-40e5-a17b-f9fcd398700d.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/07/02/SomeThoughtsOnGoogleAdoptingOAuthForGDataAPIs.aspx</link>
      <pubDate>Wed, 02 Jul 2008 12:52:45 GMT</pubDate>
      <description>&lt;p&gt;
Late last week, the folks on the Google Data APIs blog announced that &lt;a title="OAuth for Google Data APIs" href="http://googledataapis.blogspot.com/2008/06/oauth-for-google-data-apis.html"&gt;Google
will now be supporting OAuth&lt;/a&gt; as the delegated authentication mechanism for all
Google Data APIs. This move is meant to encourage the various online services that
provide APIs that access a user’s data in the “cloud” to stop reinventing the wheel
when it comes to delegated authentication and standardize on a single approach. 
&lt;/p&gt;
&lt;p&gt;
Every well-designed Web API that provides access to a customer’s data in the cloud
utilizes a delegated authentication mechanism which allows users to grant 3rd party
applications access to their data without having to give the application their username
and password. There is a good analogy for this practice in the &lt;a href="http://oauth.net/about/"&gt;OAuth:
Introduction page&lt;/a&gt; which is excerpted below 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;h5&gt;What is it For?
&lt;/h5&gt;
&lt;p&gt;
Many luxury cars today come with a valet key. It is a special key you give the parking
attendant and unlike your regular key, will not allow the car to drive more than a
mile or two. Some valet keys will not open the trunk, while others will block access
to your onboard cell phone address book. Regardless of what restrictions the valet
key imposes, the idea is very clever. You give someone limited access to your car
with a special key, while using your regular key to unlock everything.
&lt;/p&gt;
&lt;p&gt;
Everyday new website offer services which tie together functionality from other sites.
A photo lab printing your online photos, a social network using your address book
to look for friends, and APIs to build your own desktop application version of a popular
site. These are all great services – what is not so great about some of the implementations
available today is their request for your username and password to the other site.
When you agree to share your secret credentials, not only you expose your password
to someone else (yes, that same password you also use for online banking), you also
give them full access to do as they wish. They can do anything they wanted – even
change your password and lock you out.
&lt;/p&gt;
&lt;p&gt;
This is what OAuth does, it allows the you the User to grant access to your private
resources on one site (which is called the Service Provider), to another site (called
Consumer, not to be confused with you, the User). While OpenID is all about using
a single identity to sign into many sites, OAuth is about giving access to your stuff
without sharing your identity at all (or its secret parts).
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
So every service provider invented their own protocol to do this, all of which are
different but have the same basic components. Today we have &lt;a href="http://code.google.com/apis/gdata/authsub.html"&gt;Google
AuthSub&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/auth/"&gt;Yahoo! BBAuth&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/cc287637.aspx"&gt;Windows
Live DelAuth&lt;/a&gt;, &lt;a href="http://dev.aol.com/api/openauth"&gt;AOL OpenAuth&lt;/a&gt;, the &lt;a href="http://www.flickr.com/services/api/auth.spec.html"&gt;Flickr
Authentication API&lt;/a&gt;, the &lt;a href="http://developers.facebook.com/documentation.php?doc=auth"&gt;Facebook
Authentication API&lt;/a&gt; and others. All different, proprietary solutions to the same
problem. 
&lt;/p&gt;
&lt;p&gt;
This ends up being problematic for developers because if you want to build an application
that talks to multiple services you not only have to deal with the different APIs
provided by these services but also the different authorization/authentication models
they utilize as well. In a world where “social aggregation” is becoming more commonplace
with services like &lt;a href="http://www.plaxo.com/tour"&gt;Plaxo Pulse&lt;/a&gt; &amp;amp; &lt;a href="http://friendfeed.com/about/"&gt;FriendFeed&lt;/a&gt; and
more applications are trying to bridge the desktop/cloud divide like &lt;a href="http://www.melsam.com/outsync/"&gt;OutSync&lt;/a&gt; and &lt;a title="RSS Bandit Syncs RSS Feeds Between Desktop and Google Reader" href="http://lifehacker.com/396865/rss-bandit-syncs-rss-feeds-between-desktop-and-google-reader"&gt;RSS
Bandit&lt;/a&gt;, it sucks that these applications have to rewrite the same type of code
over and over again to deal with the basic task of getting permission to access a
user’s data. Standardizing on OAuth is meant to fix that. A number of startups like
Digg &amp;amp; Twitter as well as major players like Yahoo and Google have promised to
support it, so this should make the lives of developers easier. 
&lt;/p&gt;
&lt;p&gt;
Of course, we still have work to do as an industry when it comes to the constant wheel
reinvention in the area of Web APIs. Chris Messina points to another place where every
major service provider has invented a different proprietary protocol for doing the
same task in his post &lt;a title="http://factoryjoe.com/blog/2008/06/04/inventing-contact-schemas-for-fun-and-profit-ugh/" href="http://factoryjoe.com/blog/2008/06/04/inventing-contact-schemas-for-fun-and-profit-ugh/"&gt;Inventing
contact schemas for fun and profit! (Ugh)&lt;/a&gt; where he writes
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;And then &lt;/em&gt;&lt;a href="http://code.google.com/apis/contacts/"&gt;&lt;em&gt;there&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb463989.aspx"&gt;&lt;em&gt;were&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;a href="http://developer.yahoo.com/addressbook/"&gt;&lt;em&gt;three&lt;/em&gt;&lt;/a&gt; 
&lt;br /&gt;
&lt;em&gt;... 
&lt;br /&gt;
Today, Yahoo! &lt;/em&gt;&lt;a href="http://developer.yahoo.net/blog/archives/2008/06/addressbook_api.html"&gt;&lt;em&gt;announced
the public availability&lt;/em&gt;&lt;/a&gt;&lt;em&gt; of their own &lt;/em&gt;&lt;a href="http://developer.yahoo.com/addressbook/"&gt;&lt;em&gt;Address
Book API&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;However, I have to lament yet more needless reinvention of contact schema. Why
is this a problem? Well, as I pointed out about Facebook’s approach to developing
their own platform methods and formats, having to write and debug against yet another
contact schema makes the “tax” of adding support for contact syncing and export increasingly
onerous for sites and web services that want to better serve their customers by letting
them host and maintain their address book elsewhere.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;This isn’t just a problem that I have with Yahoo!. It’s &lt;/em&gt;&lt;a href="http://factoryjoe.com/blog/2007/11/01/hcard-for-openid-simple-registration-and-attribute-exchange/"&gt;&lt;em&gt;something
that I encountered last November&lt;/em&gt;&lt;/a&gt;&lt;em&gt; with the &lt;/em&gt;&lt;a href="http://openid.net/specs/openid-simple-registration-extension-1_0.html"&gt;
&lt;abbr&gt;
&lt;em&gt;SREG&lt;/em&gt;
&lt;/abbr&gt;
&lt;/a&gt;&lt;em&gt; and proposed &lt;/em&gt;&lt;a href="http://www.axschema.org/types/"&gt;&lt;em&gt;Attribute
Exchange profile definition&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. And yet again when &lt;/em&gt;&lt;a href="http://googledataapis.blogspot.com/2008/03/3-2-1-contact-api-has-landed.html"&gt;&lt;em&gt;Google
announced their Contacts API&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. And then again when &lt;/em&gt;&lt;a href="http://dev.live.com/blogs/devlive/archive/2008/03/25/237.aspx"&gt;&lt;em&gt;Microsoft
released theirs&lt;/em&gt;&lt;/a&gt;&lt;em&gt;! Over and over again we’re seeing better ways of fighting
the password anti-pattern flow of inviting friends to new social services, but having
to implement support for countless contact schemas. &lt;strong&gt;What we need is one common
contacts interchange format and I strongly suggest that it inherit from vcard with
allowances or extension points for contemporary trends in social networking profile
data.&lt;/strong&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;I’ve gone ahead and whipped up a &lt;/em&gt;&lt;a href="http://spreadsheets.google.com/pub?key=pSGbbhtwI4kN_nJ1GXeQ7Qg"&gt;&lt;em&gt;comparison
matrix between the primary contact schemas&lt;/em&gt;&lt;/a&gt;&lt;em&gt; to demonstrate the mess we’re
in.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Kudos to the folks at Google for trying to force the issue when it comes to standardizing
on a delegated authentication protocol for use on the Web. However there are still
lots of places across the industry where we speak different protocols and thus incur
a needless burden on developers when a single language might do. It would be nice
to see some of this unnecessary redundancy eliminated in the future. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now Playing:&lt;/b&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=G-Unit"&gt;G-Unit&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=I Like The Way She Do It&amp;amp;artistTerm=G-Unit"&gt;I
Like The Way She Do It&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=9a778e9f-da8f-40e5-a17b-f9fcd398700d" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,9a778e9f-da8f-40e5-a17b-f9fcd398700d.aspx</comments>
      <category>Platforms</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=407bbb0d-0660-46b4-8153-4886b3a2a609</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,407bbb0d-0660-46b4-8153-4886b3a2a609.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,407bbb0d-0660-46b4-8153-4886b3a2a609.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=407bbb0d-0660-46b4-8153-4886b3a2a609</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Matt Asay of C|Net has an article entitled <a title="http://news.cnet.com/8301-13505_3-9958180-16.html" href="http://news.cnet.com/8301-13505_3-9958180-16.html">Facebook
adopts the CPAL poison pill</a> where he writes 
</p>
        <blockquote>
          <p>
            <em>Instead, by choosing </em>
            <a href="http://opensource.org/licenses/cpal_1.0">
              <em>CPAL</em>
            </a>
            <em>,
Facebook has ensured that it can be open source without anyone actually using its
source. Was that the intent?</em>
          </p>
          <p>
            <a href="http://ostatic.com/163756-blog/cpalss-whats-thatss">
              <em>As OStatic explains</em>
            </a>
            <em>,
CPAL requires display of an attribution notice on derivative works. This practice,
which effectively requires downstream code to carry the original developer(s)' logo,
came to be known as "</em>
            <a href="http://blogs.zdnet.com/BTL/index.php?p=3430">
              <em>badgeware</em>
            </a>
            <em>."
It </em>
            <a href="http://www.theregister.co.uk/2007/07/25/osi_socialtext_cpla/">
              <em>was
approved by the OSI</em>
            </a>
            <em> but continues to be viewed with suspicion within
the open-source community.</em>
          </p>
          <p>
            <em>I've written before about how </em>
            <a href="http://weblog.infoworld.com/openresource/archives/2007/04/web_20_and_the.html">
              <em>most
open-source licenses don't apply themselves well to the networked economy</em>
            </a>
            <em>.
Only the OSL, AGPL, and CPAL contemplate web-based services. It's not surprising that
Facebook opted for one of these licenses, but I am surprised it chose the one least
likely to lead to developers actually modifying the Facebook platform.</em>
          </p>
          <p>
            <em>If the point was to protect the Facebook platform from competition (i.e., derivative
works), Facebook chose a good license. If it was to encourage development, it chose
the wrong license.</em>
          </p>
          <p>
            <em>But if the purpose was to prevent modifications of the platform, why bother open
sourcing it at all?</em>
          </p>
        </blockquote>
        <p>
I've seen more than one person repeat the sentiment in the above article which leaves
me completely perplexed. With <a href="http://developers.facebook.com/fbopen/">fbOpen</a> Facebook
has allowed anyone who is interested to run Facebook applications and participate
in what is currently the most popular &amp; vibrant social network widget ecosystem
in the world. 
</p>
        <p>
I can think of lots of good reasons for not wanting to adopt fbOpen. Maybe the code
is in PHP and you are a Ruby On Rails shop. Or maybe it conflicts with your company's
grand strategy of painting Facebook as the devil and you the heroes of openness (*cough*
Google *cough*). However I can't see how requiring that you mention somewhere on your
site that your social network's widget platform is <em>powered by the Facebook developer
platform</em> is some sort of onerous POISON PILL which prevents you from using it.
In the old days, companies used to charge you for the right to say your application
is compatible with theirs, heck, <a title="Made for iPod" href="http://www.ilounge.com/index.php/articles/comments/made-for-ipod-central-information-hub/">Apple
still does</a>. So it seems pretty wacky for someone to call Facebook out for letting
people use their code and encouraging them to use the Facebook brand in describing
their product. Shoot! 
</p>
        <p>
The premise of the entire article is pretty ridiculous, it's like calling the BSD
License a poison pill license because of <a href="http://en.wikipedia.org/w/index.php?title=BSD_licenses&amp;oldid=217252264#UC_Berkeley_advertising_clause">the
advertising clause</a>. This isn't to say there aren't real issues with an advertising
clause as pointed out in the GNU foundation's article <a href="http://www.gnu.org/philosophy/bsd.html">The
BSD License Problem</a>. However as far as I'm aware,  adopters of fbOpen don't
have to worry about being obligated to display dozens <em>powered by X </em>messages
because every bit of code they depend on requires that it is similarly advertised.
So that argument is moot in this case. 
</p>
        <p>
Crazy article but I've come to expect that from Matt Asay's writing. 
</p>
        <p>
          <b>Now Playing</b>: <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Eminem &amp; D12">Eminem
&amp; D12</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Eminem &amp; D12&amp;songTerm=Shit On You">Sh*t
On You</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=407bbb0d-0660-46b4-8153-4886b3a2a609" />
      </body>
      <title>Thoughts on Facebook's usage of the CPAL as a "Poison Pill" and Other Such Nonsense</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,407bbb0d-0660-46b4-8153-4886b3a2a609.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/06/06/ThoughtsOnFacebooksUsageOfTheCPALAsAPoisonPillAndOtherSuchNonsense.aspx</link>
      <pubDate>Fri, 06 Jun 2008 15:08:03 GMT</pubDate>
      <description>&lt;p&gt;
Matt Asay of C|Net has an article entitled &lt;a title="http://news.cnet.com/8301-13505_3-9958180-16.html" href="http://news.cnet.com/8301-13505_3-9958180-16.html"&gt;Facebook
adopts the CPAL poison pill&lt;/a&gt; where he writes 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Instead, by choosing &lt;/em&gt;&lt;a href="http://opensource.org/licenses/cpal_1.0"&gt;&lt;em&gt;CPAL&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
Facebook has ensured that it can be open source without anyone actually using its
source. Was that the intent?&lt;/em&gt; 
&lt;p&gt;
&lt;a href="http://ostatic.com/163756-blog/cpalss-whats-thatss"&gt;&lt;em&gt;As OStatic explains&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
CPAL requires display of an attribution notice on derivative works. This practice,
which effectively requires downstream code to carry the original developer(s)' logo,
came to be known as "&lt;/em&gt;&lt;a href="http://blogs.zdnet.com/BTL/index.php?p=3430"&gt;&lt;em&gt;badgeware&lt;/em&gt;&lt;/a&gt;&lt;em&gt;."
It &lt;/em&gt;&lt;a href="http://www.theregister.co.uk/2007/07/25/osi_socialtext_cpla/"&gt;&lt;em&gt;was
approved by the OSI&lt;/em&gt;&lt;/a&gt;&lt;em&gt; but continues to be viewed with suspicion within
the open-source community.&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;I've written before about how &lt;/em&gt;&lt;a href="http://weblog.infoworld.com/openresource/archives/2007/04/web_20_and_the.html"&gt;&lt;em&gt;most
open-source licenses don't apply themselves well to the networked economy&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.
Only the OSL, AGPL, and CPAL contemplate web-based services. It's not surprising that
Facebook opted for one of these licenses, but I am surprised it chose the one least
likely to lead to developers actually modifying the Facebook platform.&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;If the point was to protect the Facebook platform from competition (i.e., derivative
works), Facebook chose a good license. If it was to encourage development, it chose
the wrong license.&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;But if the purpose was to prevent modifications of the platform, why bother open
sourcing it at all?&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I've seen more than one person repeat the sentiment in the above article which leaves
me completely perplexed. With &lt;a href="http://developers.facebook.com/fbopen/"&gt;fbOpen&lt;/a&gt; Facebook
has allowed anyone who is interested to run Facebook applications and participate
in what is currently the most popular &amp;amp; vibrant social network widget ecosystem
in the world. 
&lt;/p&gt;
&lt;p&gt;
I can think of lots of good reasons for not wanting to adopt fbOpen. Maybe the code
is in PHP and you are a Ruby On Rails shop. Or maybe it conflicts with your company's
grand strategy of painting Facebook as the devil and you the heroes of openness (*cough*
Google *cough*). However I can't see how requiring that you mention somewhere on your
site that your social network's widget platform is &lt;em&gt;powered by the Facebook developer
platform&lt;/em&gt; is some sort of onerous POISON PILL which prevents you from using it.
In the old days, companies used to charge you for the right to say your application
is compatible with theirs, heck, &lt;a title="Made for iPod" href="http://www.ilounge.com/index.php/articles/comments/made-for-ipod-central-information-hub/"&gt;Apple
still does&lt;/a&gt;. So it seems pretty wacky for someone to call Facebook out for letting
people use their code and encouraging them to use the Facebook brand in describing
their product. Shoot! 
&lt;/p&gt;
&lt;p&gt;
The premise of the entire article is pretty ridiculous, it's like calling the BSD
License a poison pill license because of &lt;a href="http://en.wikipedia.org/w/index.php?title=BSD_licenses&amp;amp;oldid=217252264#UC_Berkeley_advertising_clause"&gt;the
advertising clause&lt;/a&gt;. This isn't to say there aren't real issues with an advertising
clause as pointed out in the GNU foundation's article &lt;a href="http://www.gnu.org/philosophy/bsd.html"&gt;The
BSD License Problem&lt;/a&gt;. However as far as I'm aware,&amp;nbsp; adopters of fbOpen don't
have to worry about being obligated to display dozens &lt;em&gt;powered by X &lt;/em&gt;messages
because every bit of code they depend on requires that it is similarly advertised.
So that argument is moot in this case. 
&lt;/p&gt;
&lt;p&gt;
Crazy article but I've come to expect that from Matt Asay's writing. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now Playing&lt;/b&gt;: &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Eminem &amp;amp; D12"&gt;Eminem
&amp;amp; D12&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Eminem &amp;amp; D12&amp;amp;songTerm=Shit On You"&gt;Sh*t
On You&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=407bbb0d-0660-46b4-8153-4886b3a2a609" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,407bbb0d-0660-46b4-8153-4886b3a2a609.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=e61bd4ab-d313-43d4-ab0c-ec23a4e3574f</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,e61bd4ab-d313-43d4-ab0c-ec23a4e3574f.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,e61bd4ab-d313-43d4-ab0c-ec23a4e3574f.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=e61bd4ab-d313-43d4-ab0c-ec23a4e3574f</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <title>Google Gears as the Next Flash</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,e61bd4ab-d313-43d4-ab0c-ec23a4e3574f.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/05/30/GoogleGearsAsTheNextFlash.aspx</link>
      <pubDate>Fri, 30 May 2008 15:21:09 GMT</pubDate>
      <description>&lt;p&gt;
When &lt;a href="http://gears.google.com/"&gt;Google Gears&lt;/a&gt; was first announced, it was
praised as the final nail in the coffin for desktop applications as it now made it
possible to take Web applications offline. However in the past year that Gears has
existed, there hasn't been as much progress or enthusiasm in taking applications offline
as was initially thought when Gears was announced. There are various reasons for this
and since I've already given &lt;a title="Offline Web Apps, Dumb Idea or Really Dumb Idea?" href="http://www.25hoursaday.com/weblog/2008/05/17/OfflineWebAppsDumbIdeaOrReallyDumbIdea.aspx"&gt;my
thoughts on taking Web applications offline&lt;/a&gt; so I won't repeat myself in this post.
What I do find interesting is that many proponents of Google Gears including technology
evangelists at Google have been gradually switching to pushing Gears as a way to route
around browsers and add features to the Web, as opposed to just being about an 'offline
solution'. Below are some posts from the past couple of months showing this gradual
switch in positioning. 
&lt;p&gt;
Alex Russell of the Dojo Toolkit wrote a blog post entitled &lt;a href="http://alex.dojotoolkit.org/?p=661"&gt;Progress
Is N+1&lt;/a&gt; in March of this year that contained the following excerpt &lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Every browser that we depend on either needs an open development process or it
needs to have a public plan for N+1. The goal is to ensure that the market knows that
there is momentum and a vehicle+timeline for progress. When that’s not possible or
available, it becomes incumbent on us to support alternate schemes to rev the web
faster. &lt;/em&gt;&lt;a href="http://gears.google.com/"&gt;&lt;em&gt;Google Gears&lt;/em&gt;&lt;/a&gt;&lt;em&gt; is our
best hope for this right now, and at the same time as we’re encouraging browser venders
to do the right thing, we should also be championing the small, brave Open Source
team that is bringing us a viable Plan B. Every webdev should be building Gear-specific
features into their app today, not because Gears is the only way to get something
in an app, but because in lieu of a real roadmap from Microsoft, Gears is our best
chance at getting great things into the fabric of the web faster. If the IE team doesn’t
produce a roadmap, we’ll be staring down a long flush-out cycle to replace it with
other browsers. The genius of Gears is that it can augment existing browsers instead
of replacing them wholesale. Gears targets the platform/product split and gives us
a platform story even when we’re neglected by the browser vendors.&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;Gears has an open product development process, an auto-upgrade plan, and a plan
for N+1. &lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;At this point in the webs evolution, I’m glad to see browser vendors competing
and I still feel like that’s our best long-term hope. But we’ve been left at the altar
before, and the IE team isn’t giving us lots of reasons to trust them as platform
vendors (not as product vendors). For once, we have an open, viable Plan B.&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;Gears is real, bankable progress.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This was followed up by a post by Dion Almaer who's a technical evangelist at Google
who wrote the following in his post &lt;a href="http://almaer.com/blog/gears-as-a-bleeding-edge-html-5-implementation"&gt;Gears
as a bleeding-edge HTML 5 implementation&lt;/a&gt; &lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;I do not see HTML 5 as competition for Gears at all. I am sitting a few feet away
from Hixie’s desk as I write this, and he and the Gears team have a good communication
loop.&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;There is a lot in common between Gears and HTML 5. Both are moving the Web forward,
something that we really need to accelerate. Both have APIs to make the Web do new
tricks. However HTML 5 is a specification, and Gears is an implementation.&lt;/em&gt; 
&lt;br&gt;
...&lt;br&gt;
&lt;em&gt;Standards bodies are not a place to innovate, else you end up with EJB and the
like.&lt;/em&gt;
&lt;br&gt;
...&lt;br&gt;
&lt;em&gt;Gears is a battle hardened Web update mechanism, that is open source and ready
for anyone to join and take in interesting directions.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
and what do Web developers actually think about using Google's technology as a way
to "upgrade the Web" instead of relying on Web browsers and standards bodies for the
next generation of features for the Web? Here's one answer from Matt Mullenweg, founder
of WordPress, taken from his post &lt;a href="http://ma.tt/2008/05/infrastructure-as-competitive-advantage/"&gt;Infrastructure
as Competitive Advantage&lt;/a&gt;&amp;nbsp;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;When a website “pops” it probably has very little to do with their underlying
server infrastructure and a lot to do with the perceived performance largely driven
by how it’s coded at the HTML, CSS, and Javascript level. This, incidentally, is one
of the reasons &lt;strong&gt;&lt;a href="http://code.google.com/apis/gears/"&gt;Google Gears&lt;/a&gt; is
going to change the web as we know it today&lt;/strong&gt; - LocalServer will obsolete CDNs
as we know them. (Look for this in WordPress soonish.)&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
That's a rather bold claim (pun intended) by Matt. If you're wondering what features
Matt is adding to WordPress that will depend on Gears, they were recently discussed
in Dion Almaer's post &lt;a href="http://almaer.com/blog/speed-up-with-wordpress-and-gears"&gt;Speed
Up! with Wordpress and Gears&lt;/a&gt; which is excerpted below 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;a title="WordPress 2.6 and Google Gears" href="http://www.geniosity.co.za/musings/wordpress/wordpress-26-and-google-gears/"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="276" alt="WordPress 2.6 and Google Gears" src="http://www.geniosity.co.za/musings/wp-content/uploads/2008/05/wordpress-google-gears.png" width="396" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;
&lt;em&gt;However, Gears is so much more than offline, and it is really exciting to see
“Speed Up!” as a link instead of “Go Offline?” &lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;This is just the beginning. As the Gears community &lt;/em&gt;&lt;a href="http://almaer.com/blog/category/gears"&gt;&lt;em&gt;fills
in the gaps in the Web development model&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and begins to bring you &lt;/em&gt;&lt;a href="http://almaer.com/blog/gears-as-a-bleeding-edge-html-5-implementation"&gt;&lt;em&gt;HTML5
functionality&lt;/em&gt;&lt;/a&gt;&lt;em&gt; I expect to see less “Go Offline” and more “Speed Up!”
and other such phrases. In fact, I will be most excited when I don’t see any such
linkage, and the applications are just better. &lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;With an embedded database, local server storage, worker pool execution, desktop
APIs, and other exciting modules such as notifications, resumable HTTP being talked
about in the community…. I think we can all get excited.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Remember all those rumors back in the day that Google was working on their own browser?
Well they've gone one better and are working on the next Flash. Adobe likes pointing
out that &lt;a href="http://en.wikipedia.org/w/index.php?title=Adobe_Flash&amp;amp;oldid=215597743#Market_share"&gt;Flash
has more market share than any single browser&lt;/a&gt; and we all know that has Flash has
gone above and beyond the [X]HTML standards bodies to extend the Web thus powering
popular, rich user experiences that weren't possible otherwise (e.g. &lt;a href="http://www.youtube.com"&gt;YouTube&lt;/a&gt;).
Google is on the road to doing the same thing with Gears. And just like social networks
and content sharing sites were a big part in making Flash an integral part of the
Web experience for a majority of Web users, Google is learning from history with Gears
as can be seen by the &lt;a title="MySpace Shows Facebook How It&amp;rsquo;s Done: Google Gears To Power Messaging" href="http://www.techcrunch.com/2008/05/28/myspace-shows-facebook-how-its-done-google-gears-to-power-messaging/"&gt;the
recent announcements from MySpace&lt;/a&gt;. I expect we'll soon see Google leverage the
popularity of YouTube as another vector to spread Google Gears.&amp;nbsp;&amp;nbsp; 
&lt;p&gt;
So far none of the Web sites promoting Google Gears have required it which will limit
its uptake. Flash got ahead by being necessary for sites to even work. It will be
interesting to see if or when sites move beyond using Gears for nice-to-have features
and start requiring it to function. It sounds crazy but I never would have expected
to see sites that would be completely broken if Flash wasn't installed five years
ago but it isn't surprising today (e.g. &lt;a href="http://www.youtube.com"&gt;YouTube&lt;/a&gt;). 
&lt;p&gt;
&lt;u&gt;PS:&lt;/u&gt; For those who are not familiar with the technical details of Google Gears,
it currently provides three main bits of functionality; &lt;a href="http://code.google.com/apis/gears/api_workerpool.html"&gt;thread
pools for asynchronous operations&lt;/a&gt;, &lt;a href="http://code.google.com/apis/gears/api_database.html"&gt;access
to a SQL database running on the user's computer&lt;/a&gt;, and &lt;a href="http://code.google.com/apis/gears/api_localserver.html"&gt;access
to the user's file system for storing documents, images and other media&lt;/a&gt;. There
are also beta APIs which provide more access to the user's computer from the browser
such as the &lt;a href="http://code.google.com/apis/gears/upcoming/api_desktop.html"&gt;Desktop
API&lt;/a&gt; which allows applications to create shortcuts on the user's desktop.&amp;nbsp;&amp;nbsp; 
&lt;p&gt;
&lt;b&gt;Now Playing&lt;/b&gt;: &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Nas"&gt;Nas&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Nas&amp;amp;songTerm=It Ain't Hard To Tell"&gt;It
Ain't Hard To Tell&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=e61bd4ab-d313-43d4-ab0c-ec23a4e3574f" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,e61bd4ab-d313-43d4-ab0c-ec23a4e3574f.aspx</comments>
      <category>Platforms</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=376267f5-1702-4657-97be-9d4b4581eac5</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,376267f5-1702-4657-97be-9d4b4581eac5.aspx</pingback:target>
      <dc:creator>Dare Obasanjo</dc:creator>
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,376267f5-1702-4657-97be-9d4b4581eac5.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=376267f5-1702-4657-97be-9d4b4581eac5</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A few months ago Michael Mace, former Chief Competitive Officer and VP of Product
Planning at Palm, wrote an insightful and perceptive eulogy for mobile application
platforms entitled <a href="http://mobileopportunity.blogspot.com/2008/02/mobile-applications-rip.html">Mobile
applications, RIP</a> where he wrote 
</p>
        <blockquote>
          <p>
            <em>Back in 1999 when I joined Palm, it seemed we had the whole mobile ecosystem nailed.
The market was literally exploding, with the installed base of devices doubling every
year, and an incredible range of creative and useful software popping up all over.
In a 22-month period, the number of registered Palm developers increased from 3,000
to over 130,000. The PalmSource conference was swamped, with people spilling out into
the halls, and David Pogue took center stage at the close of the conference to tell
us how brilliant we all were. 
<p>
It felt like we were at the leading edge of a revolution, but in hindsight it was
more like the high water mark of a flash flood.<br />
... 
</p><blockquote><p>
Two problems have caused a decline the mobile apps business over the last few years.
First, the business has become tougher technologically. Second, marketing and sales
have also become harder. 
</p><p>
From the technical perspective, there are a couple of big issues. One is the proliferation
of operating systems. <font color="#ff0000">Back in the late 1990s there were two
platforms we had to worry about, Pocket PC and Palm OS</font>. Symbian was there too,
but it was in Europe and few people here were paying attention. <font color="#ff0000">Now
there are at least ten platforms.</font> Microsoft alone has several -- two versions
of Windows Mobile, Tablet PC, and so on. [Elia didn't mention it, but the fragmentation
of Java makes this situation even worse.] 
</p><p>
I call it three million platforms with a hundred users each (<a href="http://mobilesuccess.infinitysw.com/2007/10/21/ugh-3-million-platforms-with-100-users-each/">link</a>). 
</p></blockquote></em> 
</p>
        </blockquote>...<br /><em>In the mobile world, what have we done? We created a series of elegant technology
platforms optimized just for mobile computing. We figured out how to extend battery
life, start up the system instantly, conserve precious wireless bandwidth, synchronize
to computers all over the planet, and optimize the display of data on a tiny screen. 
<p><font color="#ff0000">But we never figured out how to help developers make money.</font> In
fact, we paired our elegant platforms with a developer business model so deeply broken
that it would take many years, and enormous political battles throughout the industry,
to fix it -- if it can ever be fixed at all.
</p></em><p>
So what does this have to do with social networking sites? The first excerpt from
the post where it talks about 130,000 registered developers for the Palm OS sounds
a lot like the original hype around the Facebook platform with headlines screaming <a href="http://www.zdnet.com.au/news/software/soa/FaceBook-platform-attracts-1-000-developers-a-day/0,130061733,339278661,00.htm">Facebook
Platform Attracts 1000 Developers a Day</a>. 
</p><p>
The second excerpt talks about the time there became two big mobile platforms, analogous
to the appearance of Google's <a href="http://code.google.com/apis/opensocial/">OpenSocial</a> on
the scene as a competing platform used by a consortium of Facebook's competitors.
This means that widget developers like <a href="http://www.slide.com">Slide</a> and <a href="http://www.rockyou.com">RockYou</a> have
to target one set of APIs when building widgets for MySpace, LinkedIn, &amp; Orkut
and another completely different set of APIs when building widgets for Facebook &amp;
Bebo. Things will likely only get worse. One reason for this is that despite API <em>standardization</em>,
all of these sites do not have the same features. Facebook has a Web-based IM, Bebo
does not. Orkut has video uploads, LinkedIn does not. All of these differences eventually
creep into such APIs as "vendor extensions". The fact that both Google and Facebook
are also shipping Open Source implementations of their platforms (<a href="http://incubator.apache.org/shindig/">Shindig</a> and <a href="http://www.techcrunch.com/2008/05/27/facebook-confirms-plans-to-open-source-its-platform/">fbOpen</a>)
makes it even more likely that the social networking sites will find ways to extend
these platforms to suit their needs. 
</p><p>
Finally, there's the show-me-the-money problem. It still isn't clear how one makes
money out of building on these social networking platforms. Although companies like
Photobucket and Slide have gotten <a href="http://www.techcrunch.com/2007/05/07/myspace-to-acquire-photobucket-for-250-million/">a
quarter of a billion</a> and <a href="http://www.techcrunch.com/2008/01/18/slide-gets-their-huge-valuation-and-raises-50-million/">half
a billion dollar valuations</a> these have all been typical "Web 2.0" zero profit
valuations. This implies that platform developers don't really make money but instead
are simply trying to gather a lot of eyeballs then flip to some big company with lots
of cash and no ideas. Basically it's a VC funded lottery system. This doesn't sound
like the basis of successful and long lived platform such as what we've seen with
Microsoft's Windows and Office platforms or Google's Search and Adwords ecosystem.
In these platforms there are actually ways for companies to make money by adding value
to the ecosystem, this seems more sustainable in the long run than what we have today
in the various social networking widget platforms. 
</p><p>
It will be interesting to see if the history repeats itself in this instance. 
</p><p><b>Now Playing</b>: <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Rick Ross">Rick
Ross</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Rick Ross&amp;songTerm=Luxury Tax (featuring Lil' Wayne, Young Jeezy and Trick Daddy)">Luxury
Tax (featuring Lil Wayne, Young Jeezy and Trick Daddy)</a></p><img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=376267f5-1702-4657-97be-9d4b4581eac5" /></body>
      <title>Doomed to Repeat History: Will Social Networking Platforms End Up Like Mobile Platforms?</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,376267f5-1702-4657-97be-9d4b4581eac5.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/05/28/DoomedToRepeatHistoryWillSocialNetworkingPlatformsEndUpLikeMobilePlatforms.aspx</link>
      <pubDate>Wed, 28 May 2008 12:57:44 GMT</pubDate>
      <description>&lt;p&gt;
A few months ago Michael Mace, former Chief Competitive Officer and VP of Product
Planning at Palm, wrote an insightful and perceptive eulogy for mobile application
platforms entitled &lt;a href="http://mobileopportunity.blogspot.com/2008/02/mobile-applications-rip.html"&gt;Mobile
applications, RIP&lt;/a&gt; where he wrote 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Back in 1999 when I joined Palm, it seemed we had the whole mobile ecosystem nailed.
The market was literally exploding, with the installed base of devices doubling every
year, and an incredible range of creative and useful software popping up all over.
In a 22-month period, the number of registered Palm developers increased from 3,000
to over 130,000. The PalmSource conference was swamped, with people spilling out into
the halls, and David Pogue took center stage at the close of the conference to tell
us how brilliant we all were. 
&lt;p&gt;
It felt like we were at the leading edge of a revolution, but in hindsight it was
more like the high water mark of a flash flood.&lt;br&gt;
... &lt;blockquote&gt; 
&lt;p&gt;
Two problems have caused a decline the mobile apps business over the last few years.
First, the business has become tougher technologically. Second, marketing and sales
have also become harder. 
&lt;p&gt;
From the technical perspective, there are a couple of big issues. One is the proliferation
of operating systems. &lt;font color="#ff0000"&gt;Back in the late 1990s there were two
platforms we had to worry about, Pocket PC and Palm OS&lt;/font&gt;. Symbian was there too,
but it was in Europe and few people here were paying attention. &lt;font color="#ff0000"&gt;Now
there are at least ten platforms.&lt;/font&gt; Microsoft alone has several -- two versions
of Windows Mobile, Tablet PC, and so on. [Elia didn't mention it, but the fragmentation
of Java makes this situation even worse.] 
&lt;p&gt;
I call it three million platforms with a hundred users each (&lt;a href="http://mobilesuccess.infinitysw.com/2007/10/21/ugh-3-million-platforms-with-100-users-each/"&gt;link&lt;/a&gt;). 
&lt;/em&gt;&amp;nbsp;
&lt;/p&gt;
&lt;/blockquote&gt;...&lt;br&gt;
&lt;em&gt;In the mobile world, what have we done? We created a series of elegant technology
platforms optimized just for mobile computing. We figured out how to extend battery
life, start up the system instantly, conserve precious wireless bandwidth, synchronize
to computers all over the planet, and optimize the display of data on a tiny screen. 
&lt;p&gt;
&lt;font color="#ff0000"&gt;But we never figured out how to help developers make money.&lt;/font&gt; In
fact, we paired our elegant platforms with a developer business model so deeply broken
that it would take many years, and enormous political battles throughout the industry,
to fix it -- if it can ever be fixed at all.
&lt;/em&gt;&gt;
&gt; 
&lt;p&gt;
So what does this have to do with social networking sites? The first excerpt from
the post where it talks about 130,000 registered developers for the Palm OS sounds
a lot like the original hype around the Facebook platform with headlines screaming &lt;a href="http://www.zdnet.com.au/news/software/soa/FaceBook-platform-attracts-1-000-developers-a-day/0,130061733,339278661,00.htm"&gt;Facebook
Platform Attracts 1000 Developers a Day&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The second excerpt talks about the time there became two big mobile platforms, analogous
to the appearance of Google's &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt; on
the scene as a competing platform used by a consortium of Facebook's competitors.
This means that widget developers like &lt;a href="http://www.slide.com"&gt;Slide&lt;/a&gt; and &lt;a href="http://www.rockyou.com"&gt;RockYou&lt;/a&gt; have
to target one set of APIs when building widgets for MySpace, LinkedIn, &amp;amp; Orkut
and another completely different set of APIs when building widgets for Facebook &amp;amp;
Bebo. Things will likely only get worse. One reason for this is that despite API &lt;em&gt;standardization&lt;/em&gt;,
all of these sites do not have the same features. Facebook has a Web-based IM, Bebo
does not. Orkut has video uploads, LinkedIn does not. All of these differences eventually
creep into such APIs as "vendor extensions". The fact that both Google and Facebook
are also shipping Open Source implementations of their platforms (&lt;a href="http://incubator.apache.org/shindig/"&gt;Shindig&lt;/a&gt; and &lt;a href="http://www.techcrunch.com/2008/05/27/facebook-confirms-plans-to-open-source-its-platform/"&gt;fbOpen&lt;/a&gt;)
makes it even more likely that the social networking sites will find ways to extend
these platforms to suit their needs. 
&lt;/p&gt;
&lt;p&gt;
Finally, there's the show-me-the-money problem. It still isn't clear how one makes
money out of building on these social networking platforms. Although companies like
Photobucket and Slide have gotten &lt;a href="http://www.techcrunch.com/2007/05/07/myspace-to-acquire-photobucket-for-250-million/"&gt;a
quarter of a billion&lt;/a&gt; and &lt;a href="http://www.techcrunch.com/2008/01/18/slide-gets-their-huge-valuation-and-raises-50-million/"&gt;half
a billion dollar valuations&lt;/a&gt; these have all been typical "Web 2.0" zero profit
valuations. This implies that platform developers don't really make money but instead
are simply trying to gather a lot of eyeballs then flip to some big company with lots
of cash and no ideas. Basically it's a VC funded lottery system. This doesn't sound
like the basis of successful and long lived platform such as what we've seen with
Microsoft's Windows and Office platforms or Google's Search and Adwords ecosystem.
In these platforms there are actually ways for companies to make money by adding value
to the ecosystem, this seems more sustainable in the long run than what we have today
in the various social networking widget platforms. 
&lt;/p&gt;
&lt;p&gt;
It will be interesting to see if the history repeats itself in this instance. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now Playing&lt;/b&gt;: &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Rick Ross"&gt;Rick
Ross&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Rick Ross&amp;amp;songTerm=Luxury Tax (featuring Lil' Wayne, Young Jeezy and Trick Daddy)"&gt;Luxury
Tax (featuring Lil Wayne, Young Jeezy and Trick Daddy)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=376267f5-1702-4657-97be-9d4b4581eac5" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,376267f5-1702-4657-97be-9d4b4581eac5.aspx</comments>
      <category>Platforms</category>
      <category>Social Software</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=bd0c65cb-63a0-4620-8366-614246ac0e51</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,bd0c65cb-63a0-4620-8366-614246ac0e51.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,bd0c65cb-63a0-4620-8366-614246ac0e51.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=bd0c65cb-63a0-4620-8366-614246ac0e51</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Pablo Castro has a blog post entitled <a title="http://blogs.msdn.com/astoriateam/archive/2008/02/13/atompub-support-in-the-ado-net-data-services-framework.aspx" href="http://blogs.msdn.com/astoriateam/archive/2008/02/13/atompub-support-in-the-ado-net-data-services-framework.aspx">AtomPub
support in the ADO.NET Data Services Framework</a> where he talks about the progress
they've made in building a framework for using the Atom Publishing Protocol (<a href="http://tools.ietf.org/html/rfc5023">RFC
5023</a>) as a protocol for communicating with SQL Server and other relational databases.
Pablo explains why they've chosen to build on AtomPub in his post which is excerpted
below
</p>
        <blockquote>
          <p>
            <b>
              <em>Why are we looking at AtomPub?</em>
            </b>
          </p>
          <p>
            <em>Astoria data services can work with different payload formats and to some level
different user-level details of the protocol on top of HTTP. For example, we support
a JSON payload format that should make the life of folks writing AJAX applications
a bit easier. While we have a couple of these kind of ad-hoc formats, we wanted to
support a pre-established format and protocol as our primary interface. </em>
          </p>
          <p>
            <em>If you look at the underlying data model for Astoria, it boils down to two constructs:
resources (addressable using URLs) and links between those resources. The resources
are grouped into containers that are also addressable. The mapping to Atom entries,
links and feeds is so straightforward that is hard to ignore. Of course, the devil
is in the details and we'll get to that later on. </em>
          </p>
          <p>
            <em>The interaction model in Astoria is just plain HTTP, using the usual methods for
creating, updating, deleting and retrieving resources. Furthermore, we use other HTTP
constructs such as "ETags" for concurrency checks,  "location"
to know where a POSTed resource lives, and so on. All of these also map naturally
to AtomPub. </em>
          </p>
          <p>
            <em>From our (Microsoft) perspective, <font color="#ff0000">you could imagine a world
where our own consumer and infrastructure services in Windows Live could speak AtomPub
with the same idioms as Astoria services</font>, and thus could both have a standards-based
interface and also use the same development tools and runtime components that work
with any Astoria-based server. This would mean less clients/development tools for
us to create and more opportunity for our partners in the libraries and tools ecosystem
out there. </em>
          </p>
        </blockquote>
        <p>
Although I'm not responsible for any public APIs at Microsoft these days, I've found
myself drawn into the various internal discussions on RESTful protocols and AtomPub
due to the fact that I'm a busy body. :) 
</p>
        <p>
Early on in the Atom effort, I felt that the real value wasn't in defining yet another
XML syndication format but instead in the editing protocol. Still I underestimated
how much mind share and traction AtomPub would eventually end up getting in the industry.
I'm glad to see Microsoft making a huge bet on standards based, RESTful protocols
especially given our recent history where we foisted <b>S</b>nakes <b>O</b>n <b>A</b><b>P</b>lane
on the industry. 
</p>
        <p>
However since AtomPub is intended to be an extensible protocol, Astoria has added
certain extensions to make the service work for their scenarios while staying within
the letter and spirit of the spec. Pablo talks about some of their design decisions
when he writes 
</p>
        <blockquote>
          <p>
            <em>We are simply mapping whatever we can to regular AtomPub elements. Sometimes that
is trivial, sometimes we need to use extensions and sometimes we leave AtomPub alone
and build an application-level feature on top. Here is an initial list of aspects
we are dealing with in one way or the other. We’ll also post elaborations of
each one of these to the appropriate Atom syntax|protocol mailing lists. </em>
            <br />
... 
<br /><em>c) Using AtomPub constructs and extensibility mechanisms to enable Astoria features: </em></p>
          <ul>
            <li>
              <em>Inline expansion of links (“GET a given entry and all the entries related
through this named link”, how we represent a request and the answer to such
a request in Atom?). </em>
            </li>
            <li>
              <em>Properties for entries that are media link entries and thus cannot carry any more
structured data in the &lt;content&gt; element </em>
            </li>
            <li>
              <em>HTTP methods acting on bindings between resources (links) in addition to resources
themselves </em>
            </li>
            <li>
              <em>Optimistic concurrency over HTTP, use of ETags and in general guaranteeing consistency
when required </em>
            </li>
            <li>
              <em>Request batching (e.g. how does a client send a set of PUT/POST/DELETE operations
to the server in a single go?) </em>
            </li>
          </ul>
          <p>
            <em>d) Astoria design patterns that are not AtomPub format/protocol concepts or extensions: </em>
          </p>
          <ul>
            <li>
              <em>Astoria gives semantics to URLs and has a specific syntax to construct them </em>
            </li>
            <li>
              <em>How metadata that describes the structure of a service end points is exposed.
This goes from being to find out entry points (e.g. collections in service documents)
to having a way of discovering the structure of entries that contain structured data</em>
            </li>
          </ul>
        </blockquote>
        <p>
Pablo will be posting more about the Astoria design decisions on <a href="http://www.imc.org/atom-syntax/mail-archive/">atom-syntax</a> and <a href="http://www.imc.org/atom-protocol/mail-archive/">atom-protocol</a> in
the coming weeks. It'll be interesting to see the feedback on the approaches they've
taken with regards to following the protocol guidelines and extending it where necessary. 
</p>
        <p>
It looks like I'll have to renew my subscription to both mailing lists. 
</p>
        <p>
          <b>Now Playing</b>: <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Lil Jon &amp; The Eastside Boyz">Lil
Jon &amp; The Eastside Boyz</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Lil Jon &amp; The Eastside Boyz&amp;songTerm=Grand Finale (feat Nas, Jadakiss, T.I., Bun B &amp; Ice Cube)">Grand
Finale (feat Nas, Jadakiss, T.I., Bun B &amp; Ice Cube)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=bd0c65cb-63a0-4620-8366-614246ac0e51" />
      </body>
      <title>ADO.NET Data Services (Astoria) Adopts AtomPub</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,bd0c65cb-63a0-4620-8366-614246ac0e51.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/02/16/ADONETDataServicesAstoriaAdoptsAtomPub.aspx</link>
      <pubDate>Sat, 16 Feb 2008 19:27:05 GMT</pubDate>
      <description>&lt;p&gt;
Pablo Castro has a blog post entitled &lt;a title="http://blogs.msdn.com/astoriateam/archive/2008/02/13/atompub-support-in-the-ado-net-data-services-framework.aspx" href="http://blogs.msdn.com/astoriateam/archive/2008/02/13/atompub-support-in-the-ado-net-data-services-framework.aspx"&gt;AtomPub
support in the ADO.NET Data Services Framework&lt;/a&gt; where he talks about the progress
they've made in building a framework for using the Atom Publishing Protocol (&lt;a href="http://tools.ietf.org/html/rfc5023"&gt;RFC
5023&lt;/a&gt;) as a protocol for communicating with SQL Server and other relational databases.
Pablo explains why they've chosen to build on AtomPub in his post which is excerpted
below
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;b&gt;&lt;em&gt;Why are we looking at AtomPub?&lt;/em&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Astoria data services can work with different payload formats and to some level
different user-level details of the protocol on top of HTTP. For example, we support
a JSON payload format that should make the life of folks writing AJAX applications
a bit easier. While we have a couple of these kind of ad-hoc formats, we wanted to
support a pre-established format and protocol as our primary interface. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;If you look at the underlying data model for Astoria, it boils down to two constructs:
resources (addressable using URLs) and links between those resources. The resources
are grouped into containers that are also addressable. The mapping to Atom entries,
links and feeds is so straightforward that is hard to ignore. Of course, the devil
is in the details and we'll get to that later on. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The interaction model in Astoria is just plain HTTP, using the usual methods for
creating, updating, deleting and retrieving resources. Furthermore, we use other HTTP
constructs such as &amp;quot;ETags&amp;quot; for concurrency checks,&amp;#160; &amp;quot;location&amp;quot;
to know where a POSTed resource lives, and so on. All of these also map naturally
to AtomPub. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;From our (Microsoft) perspective, &lt;font color="#ff0000"&gt;you could imagine a world
where our own consumer and infrastructure services in Windows Live could speak AtomPub
with the same idioms as Astoria services&lt;/font&gt;, and thus could both have a standards-based
interface and also use the same development tools and runtime components that work
with any Astoria-based server. This would mean less clients/development tools for
us to create and more opportunity for our partners in the libraries and tools ecosystem
out there. &lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Although I'm not responsible for any public APIs at Microsoft these days, I've found
myself drawn into the various internal discussions on RESTful protocols and AtomPub
due to the fact that I'm a busy body. :) 
&lt;/p&gt;
&lt;p&gt;
Early on in the Atom effort, I felt that the real value wasn't in defining yet another
XML syndication format but instead in the editing protocol. Still I underestimated
how much mind share and traction AtomPub would eventually end up getting in the industry.
I'm glad to see Microsoft making a huge bet on standards based, RESTful protocols
especially given our recent history where we foisted &lt;b&gt;S&lt;/b&gt;nakes &lt;b&gt;O&lt;/b&gt;n &lt;b&gt;A&lt;/b&gt; &lt;b&gt;P&lt;/b&gt;lane
on the industry. 
&lt;/p&gt;
&lt;p&gt;
However since AtomPub is intended to be an extensible protocol, Astoria has added
certain extensions to make the service work for their scenarios while staying within
the letter and spirit of the spec. Pablo talks about some of their design decisions
when he writes 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;We are simply mapping whatever we can to regular AtomPub elements. Sometimes that
is trivial, sometimes we need to use extensions and sometimes we leave AtomPub alone
and build an application-level feature on top. Here is an initial list of aspects
we are dealing with in one way or the other. We&amp;#8217;ll also post elaborations of
each one of these to the appropriate Atom syntax|protocol mailing lists. &lt;/em&gt; 
&lt;br /&gt;
... 
&lt;br /&gt;
&lt;em&gt;c) Using AtomPub constructs and extensibility mechanisms to enable Astoria features: &lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Inline expansion of links (&amp;#8220;GET a given entry and all the entries related
through this named link&amp;#8221;, how we represent a request and the answer to such
a request in Atom?). &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Properties for entries that are media link entries and thus cannot carry any more
structured data in the &amp;lt;content&amp;gt; element &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;HTTP methods acting on bindings between resources (links) in addition to resources
themselves &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Optimistic concurrency over HTTP, use of ETags and in general guaranteeing consistency
when required &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Request batching (e.g. how does a client send a set of PUT/POST/DELETE operations
to the server in a single go?) &lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;em&gt;d) Astoria design patterns that are not AtomPub format/protocol concepts or extensions: &lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Astoria gives semantics to URLs and has a specific syntax to construct them &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How metadata that describes the structure of a service end points is exposed.
This goes from being to find out entry points (e.g. collections in service documents)
to having a way of discovering the structure of entries that contain structured data&lt;/em&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Pablo will be posting more about the Astoria design decisions on &lt;a href="http://www.imc.org/atom-syntax/mail-archive/"&gt;atom-syntax&lt;/a&gt; and &lt;a href="http://www.imc.org/atom-protocol/mail-archive/"&gt;atom-protocol&lt;/a&gt; in
the coming weeks. It'll be interesting to see the feedback on the approaches they've
taken with regards to following the protocol guidelines and extending it where necessary. 
&lt;/p&gt;
&lt;p&gt;
It looks like I'll have to renew my subscription to both mailing lists. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now Playing&lt;/b&gt;: &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Lil Jon &amp;amp; The Eastside Boyz"&gt;Lil
Jon &amp;amp; The Eastside Boyz&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Lil Jon &amp;amp; The Eastside Boyz&amp;amp;songTerm=Grand Finale (feat Nas, Jadakiss, T.I., Bun B &amp;amp; Ice Cube)"&gt;Grand
Finale (feat Nas, Jadakiss, T.I., Bun B &amp;amp; Ice Cube)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=bd0c65cb-63a0-4620-8366-614246ac0e51" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,bd0c65cb-63a0-4620-8366-614246ac0e51.aspx</comments>
      <category>Platforms</category>
      <category>XML Web Services</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=942de72e-9b73-46d1-94dd-e3c147be4c03</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,942de72e-9b73-46d1-94dd-e3c147be4c03.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,942de72e-9b73-46d1-94dd-e3c147be4c03.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=942de72e-9b73-46d1-94dd-e3c147be4c03</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On Friday of last week,  brad Fitzpatrick posted an entry on the Google code
blog entitled <a href="http://google-code-updates.blogspot.com/2008/02/urls-are-people-too.html">URLs
are People, Too</a> where he wrote
</p>
        <blockquote>
          <p>
            <em>So you've just built a totally sweet new social app and you can't wait for people
to start using it, but there's a problem: when people join they don't have any friends
on your site. They're lonely, and the experience isn't good because they can't use
the app with people they know. You could ask them to search for and add all their
friends, but you know that every other app is asking them to do the same thing and
they're getting sick of it. Or they tried address book import, but that didn't totally
work, because they don't even have all their friends' email addresses (especially
if they only know them from another social networking site!). What's a developer to
do? </em>
          </p>
          <p>
            <em>One option is the new Social Graph API, which makes information about the public
connections between people on the Web easily available and useful 
<br />
... 
<br />
Here's how it works: we crawl the Web to find publicly declared relationships between
people's accounts, just like Google crawls the Web for links between pages. But instead
of returning links to HTML documents, the API returns JSON data structures representing
the social relationships we discovered from all the <a href="http://gmpg.org/xfn/">XFN</a> and <a href="http://www.foaf-project.org/">FOAF</a>.
When a user signs up for your app, you can use the API to remind them who they've
said they're friends with on other sites and ask them if they want to be friends on
your new site.</em>
          </p>
        </blockquote>
        <p>
I talked to <a title="http://blog.unto.net/" href="http://blog.unto.net/">Dewitt Clinton</a>, <a href="http://epeus.blogspot.com/">Kevin
Marks</a> and <a href="http://brad.livejournal.com">Brad Fitzpatrick</a> about this
API at the O'Reilly Social Graph FOO Camp and I think it is very interesting. Before
talking about the API, I did want to comment on the fact that this is the second time
I've seen a Google employee ship something that implies that any developer can just
write custom code to do data analysis on top of their search index (i.e. Google's
copy of the World Wide Web) and then share that information with the world. The first
time was <a href="http://developers.slashdot.org/article.pl?sid=06/01/25/1859220">Ian
Hickson's work with Web authoring statistics</a>. That is cool. 
</p>
        <p>
Now back to the <a href="http://code.google.com/apis/socialgraph/">Google Social Graph
API</a>. An illuminating aspect of my conversations at the Social Graph FOO Camp is
that the scenario described by Brad where social applications would like to bootstrap
the user's experience by showing them their friends who use the service is more important
than the "invite my friends to join this new social networking site" for
established social apps. This is interesting primarily because both goals are currently
achieved by <a href="http://adactio.com/journal/1357">the current anti-pattern of
requesting a user's username and password to their email service provider</a> and
screen scraping their address book. The social graph API attempts to eliminate the
need for this ugly practice by providing a public API which will crawl a user's publicly
articulated relationships and then providing an API that social apps can use to find
the user's identities on other services as well as their relationships with other
users on those services. 
</p>
        <p>
The API uses URIs as the primary identifier for users instead of email addresses.
Of course, since there is often an intuitive way to convert a username to a URI (e.g.
'carnage4life on Twitter' =&gt; <a href="http://www.twitter.com/carnage4life">http://www.twitter.com/carnage4life</a>),
users simply need to provide a username instead of a URI. 
</p>
        <p>
So how would this work in the real world? So let's say I signed up for <a href="http://www.facebook.com">Facebook</a> for
the first time today. At this point my experience on the site would be pretty lame
because I've made no friends so my news feed would be empty and I'm not connected
to anyone I know on the site yet. Now instead of <a href="http://www.facebook.com">Facebook</a> collecting
the username and password for my email address provider to screen scrape my addres
book (boo hiss) it shows a list of social networking sites and asks for just my username
on those sites. On obtaining my username on Twitter, it maps that to a URI and passes
that to the Social Graph API. This returns a list of people I'm following on Twitter
with various identifiers for them, which Facebook in turn looks up in their user database
then prompts me to add them as my friends on the site if any of them are Facebook
users. 
</p>
        <p>
This is a good idea that gets around the proliferation of applications that collect
usernames and passwords from users to try to access their social graph on other sites.
However there are lots of practical problems with relying on this as an alternative
to screen scraping and other approaches intended to discover a user's social graph
including
</p>
        <ul>
          <li>
many social networking sites don't expose their friend lists as FOAF or XFN 
</li>
          <li>
many friend lists on social networking sites are actually hidden from the public Web
(e.g. most friend lists on <a href="http://www.facebook.com">Facebook</a>) which is
by design 
</li>
          <li>
many friend lists in social apps aren't even on the Web (e.g. buddy lists from IM
clients, address books in desktop clients) 
</li>
        </ul>
        <p>
That said this is a good contribution to this space. Ideally, the major social networking
sites and address book providers would also expose APIs that social applications can
use to obtain a user's social graph without resorting to screen scraping. We are definitely
working on that at Windows Live with the <a href="http://dev.live.com/contacts/">Windows
Live Contacts API</a>. I'd love to see other social software vendors step up and provide
similar APIs in the coming months. That way everybody wins; our users, our applications
and the entire ecosystem. 
</p>
        <p>
          <b>Now Playing</b>: <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Playaz Circle">Playaz
Circle</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Playaz Circle&amp;songTerm=Duffle Bag Boy (feat. Lil Wayne)">Duffle
Bag Boy (feat. Lil Wayne)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=942de72e-9b73-46d1-94dd-e3c147be4c03" />
      </body>
      <title>Some Thoughts on the Google Social Graph API</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,942de72e-9b73-46d1-94dd-e3c147be4c03.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/02/03/SomeThoughtsOnTheGoogleSocialGraphAPI.aspx</link>
      <pubDate>Sun, 03 Feb 2008 18:48:54 GMT</pubDate>
      <description>&lt;p&gt;
On Friday of last week,&amp;#160; brad Fitzpatrick posted an entry on the Google code
blog entitled &lt;a href="http://google-code-updates.blogspot.com/2008/02/urls-are-people-too.html"&gt;URLs
are People, Too&lt;/a&gt; where he wrote
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;So you've just built a totally sweet new social app and you can't wait for people
to start using it, but there's a problem: when people join they don't have any friends
on your site. They're lonely, and the experience isn't good because they can't use
the app with people they know. You could ask them to search for and add all their
friends, but you know that every other app is asking them to do the same thing and
they're getting sick of it. Or they tried address book import, but that didn't totally
work, because they don't even have all their friends' email addresses (especially
if they only know them from another social networking site!). What's a developer to
do? &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;One option is the new Social Graph API, which makes information about the public
connections between people on the Web easily available and useful 
&lt;br /&gt;
... 
&lt;br /&gt;
Here's how it works: we crawl the Web to find publicly declared relationships between
people's accounts, just like Google crawls the Web for links between pages. But instead
of returning links to HTML documents, the API returns JSON data structures representing
the social relationships we discovered from all the &lt;a href="http://gmpg.org/xfn/"&gt;XFN&lt;/a&gt; and &lt;a href="http://www.foaf-project.org/"&gt;FOAF&lt;/a&gt;.
When a user signs up for your app, you can use the API to remind them who they've
said they're friends with on other sites and ask them if they want to be friends on
your new site.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I talked to &lt;a title="http://blog.unto.net/" href="http://blog.unto.net/"&gt;Dewitt Clinton&lt;/a&gt;, &lt;a href="http://epeus.blogspot.com/"&gt;Kevin
Marks&lt;/a&gt; and &lt;a href="http://brad.livejournal.com"&gt;Brad Fitzpatrick&lt;/a&gt; about this
API at the O'Reilly Social Graph FOO Camp and I think it is very interesting. Before
talking about the API, I did want to comment on the fact that this is the second time
I've seen a Google employee ship something that implies that any developer can just
write custom code to do data analysis on top of their search index (i.e. Google's
copy of the World Wide Web) and then share that information with the world. The first
time was &lt;a href="http://developers.slashdot.org/article.pl?sid=06/01/25/1859220"&gt;Ian
Hickson's work with Web authoring statistics&lt;/a&gt;. That is cool. 
&lt;/p&gt;
&lt;p&gt;
Now back to the &lt;a href="http://code.google.com/apis/socialgraph/"&gt;Google Social Graph
API&lt;/a&gt;. An illuminating aspect of my conversations at the Social Graph FOO Camp is
that the scenario described by Brad where social applications would like to bootstrap
the user's experience by showing them their friends who use the service is more important
than the &amp;quot;invite my friends to join this new social networking site&amp;quot; for
established social apps. This is interesting primarily because both goals are currently
achieved by &lt;a href="http://adactio.com/journal/1357"&gt;the current anti-pattern of
requesting a user's username and password to their email service provider&lt;/a&gt; and
screen scraping their address book. The social graph API attempts to eliminate the
need for this ugly practice by providing a public API which will crawl a user's publicly
articulated relationships and then providing an API that social apps can use to find
the user's identities on other services as well as their relationships with other
users on those services. 
&lt;/p&gt;
&lt;p&gt;
The API uses URIs as the primary identifier for users instead of email addresses.
Of course, since there is often an intuitive way to convert a username to a URI (e.g.
'carnage4life on Twitter' =&amp;gt; &lt;a href="http://www.twitter.com/carnage4life"&gt;http://www.twitter.com/carnage4life&lt;/a&gt;),
users simply need to provide a username instead of a URI. 
&lt;/p&gt;
&lt;p&gt;
So how would this work in the real world? So let's say I signed up for &lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt; for
the first time today. At this point my experience on the site would be pretty lame
because I've made no friends so my news feed would be empty and I'm not connected
to anyone I know on the site yet. Now instead of &lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt; collecting
the username and password for my email address provider to screen scrape my addres
book (boo hiss) it shows a list of social networking sites and asks for just my username
on those sites. On obtaining my username on Twitter, it maps that to a URI and passes
that to the Social Graph API. This returns a list of people I'm following on Twitter
with various identifiers for them, which Facebook in turn looks up in their user database
then prompts me to add them as my friends on the site if any of them are Facebook
users. 
&lt;/p&gt;
&lt;p&gt;
This is a good idea that gets around the proliferation of applications that collect
usernames and passwords from users to try to access their social graph on other sites.
However there are lots of practical problems with relying on this as an alternative
to screen scraping and other approaches intended to discover a user's social graph
including
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
many social networking sites don't expose their friend lists as FOAF or XFN 
&lt;/li&gt;
&lt;li&gt;
many friend lists on social networking sites are actually hidden from the public Web
(e.g. most friend lists on &lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt;) which is
by design 
&lt;/li&gt;
&lt;li&gt;
many friend lists in social apps aren't even on the Web (e.g. buddy lists from IM
clients, address books in desktop clients) 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
That said this is a good contribution to this space. Ideally, the major social networking
sites and address book providers would also expose APIs that social applications can
use to obtain a user's social graph without resorting to screen scraping. We are definitely
working on that at Windows Live with the &lt;a href="http://dev.live.com/contacts/"&gt;Windows
Live Contacts API&lt;/a&gt;. I'd love to see other social software vendors step up and provide
similar APIs in the coming months. That way everybody wins; our users, our applications
and the entire ecosystem. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now Playing&lt;/b&gt;: &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Playaz Circle"&gt;Playaz
Circle&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Playaz Circle&amp;amp;songTerm=Duffle Bag Boy (feat. Lil Wayne)"&gt;Duffle
Bag Boy (feat. Lil Wayne)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=942de72e-9b73-46d1-94dd-e3c147be4c03" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,942de72e-9b73-46d1-94dd-e3c147be4c03.aspx</comments>
      <category>Platforms</category>
      <category>Social Software</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=72b3cb4c-011c-40cc-b783-1a51d5628983</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,72b3cb4c-011c-40cc-b783-1a51d5628983.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,72b3cb4c-011c-40cc-b783-1a51d5628983.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=72b3cb4c-011c-40cc-b783-1a51d5628983</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A few days ago I got a Facebook message from <a title="http://www.davidrecordon.com/" href="http://www.davidrecordon.com/">David
Recordon</a> about <a href="http://www.sixapart.com/about/news/2008/01/time_for_action.html">Six
Apart's release of the ActionStreams plugin</a>. The meat of the announcement is excerpted
below 
</p>
        <blockquote>
          <p>
            <em>Today, we're shipping the next step in our vision of openness -- the </em>
            <a href="http://plugins.movabletype.org/action-streams/index.html">
              <em>Action
Streams plugin</em>
            </a>
            <em> -- an amazing new plugin for Movable Type 4.1 that lets
you <strong>aggregate, control, and share</strong> your actions around the web. Now
of course, there are some social networking services that have similar features, but
if you're using one of today's hosted services to share your actions it's quite possible
that you're giving up either control over your privacy, management of your identity
or profile, or support for open standards. With the Action Streams plugin <strong>you
keep control</strong> over the record of your actions on the web. And of course, you
also have full control over showing and hiding each of your actions, which is the
kind of privacy control that we demonstrated when we were the </em>
            <a href="http://www.sixapart.com/about/news/2007/12/beacons_and_lit.html">
              <em>only
partners to launch a strictly opt-in version of Facebook Beacon</em>
            </a>
            <em>. Right
now, no one has shipped a robust and decentralized complement to services like Facebook's
News Feed, FriendFeed, or Plaxo Pulse. The Action Streams plugin, by default, also
publishes your stream using Atom and the Microformat hAtom so that your actions aren't
trapped in any one service. Open and decentralized implementations of these technologies
are important to their evolution and adoption, based on our experiences being involved
in creating TrackBack, Atom, OpenID, and OAuth. And we hope others join us as partners
in making this a reality.</em>
          </p>
        </blockquote>
        <p>
This is a clever idea although I wouldn't compare it to the Facebook News Feed (what
my social network is doing) it is instead a self hosted version of the Facebook Mini-Feed
(what I've been doing). Although people have been doing this for a while by aggregating
their various feeds and republishing to their blog (life streams?), I think this is
the first time that a full fledged framework for doing this has been shipped as an
out of the box solution.  
</p>
        <p>
Mark Paschal has a blog post entitled <a href="http://www.movabletype.org/2008/01/building_action_streams.html">Building
Action Streams</a> which gives an overview of how the framework works. You define
templates which contains patterns that should be matched in a feed (RSS/Atom) or in
an HTML document and how to convert these matched elements into a blog post. Below
is the template for extracting and republishing del.icio.us links extracted from the
site's RSS feeds. 
</p>
        <blockquote>
          <pre>
            <code>delicious: links: name: Links description: Your public links
html_form: '[_1] saved the link &lt;a href="[_2]"&gt;[_3]&lt;/a&gt;' html_params:
- url - title url: 'http://del.icio.us/rss/{{ident}}' identifier: url xpath: foreach:
//item get: created_on: dc:date/child::text() title: title/child::text() url: link/child::text()</code>
          </pre>
        </blockquote>
        <p>
It reminds me a little of XSLT. I almost wondered why they just didn't use that until
I saw that it also supports pattern matching HTML docs using <a href="http://www.slideshare.net/miyagawa/webscraper-for-sfpm-lt">Web::Scraper</a> [and
that XSLT is overly verbose and difficult to grok at first glance]. 
</p>
        <p>
Although this is a pretty cool tool I don't find it interesting as a publishing tool.
On the other hand, it's potential as a new kind of aggregator is very interesting.
I'd love to see someone slap more UI on it and make it a decentralized version of
the Facebook News feed. Specifically, if I could feed it a blogroll, have it use the <a href="http://code.google.com/apis/socialgraph/docs/">Google
Social Graph API</a> to figure out the additional services that the people in my subscriptions
have and then build a feed reader + news feed experience on top of it. That would
be cool.  
</p>
        <p>
Come to think of it, this would be something interesting to experiment with in future
versions of <a href="http://www.rssbandit.org">RSS Bandit</a>.
</p>
        <p>
          <b>Now Playing</b>: <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Birdman">Birdman</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Birdman&amp;songTerm=Pop Bottles (remix) ( feat. Jim Jones &amp; Fabolous)">Pop
Bottles (remix) (feat. Jim Jones &amp; Fabolous)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=72b3cb4c-011c-40cc-b783-1a51d5628983" />
      </body>
      <title>Some Thoughts on the Movable Type Action Streams Plugin</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,72b3cb4c-011c-40cc-b783-1a51d5628983.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/02/03/SomeThoughtsOnTheMovableTypeActionStreamsPlugin.aspx</link>
      <pubDate>Sun, 03 Feb 2008 18:21:25 GMT</pubDate>
      <description>&lt;p&gt;
A few days ago I got a Facebook message from &lt;a title="http://www.davidrecordon.com/" href="http://www.davidrecordon.com/"&gt;David
Recordon&lt;/a&gt; about &lt;a href="http://www.sixapart.com/about/news/2008/01/time_for_action.html"&gt;Six
Apart's release of the ActionStreams plugin&lt;/a&gt;. The meat of the announcement is excerpted
below 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Today, we're shipping the next step in our vision of openness -- the &lt;/em&gt;&lt;a href="http://plugins.movabletype.org/action-streams/index.html"&gt;&lt;em&gt;Action
Streams plugin&lt;/em&gt;&lt;/a&gt;&lt;em&gt; -- an amazing new plugin for Movable Type 4.1 that lets
you &lt;strong&gt;aggregate, control, and share&lt;/strong&gt; your actions around the web. Now
of course, there are some social networking services that have similar features, but
if you're using one of today's hosted services to share your actions it's quite possible
that you're giving up either control over your privacy, management of your identity
or profile, or support for open standards. With the Action Streams plugin &lt;strong&gt;you
keep control&lt;/strong&gt; over the record of your actions on the web. And of course, you
also have full control over showing and hiding each of your actions, which is the
kind of privacy control that we demonstrated when we were the &lt;/em&gt;&lt;a href="http://www.sixapart.com/about/news/2007/12/beacons_and_lit.html"&gt;&lt;em&gt;only
partners to launch a strictly opt-in version of Facebook Beacon&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Right
now, no one has shipped a robust and decentralized complement to services like Facebook's
News Feed, FriendFeed, or Plaxo Pulse. The Action Streams plugin, by default, also
publishes your stream using Atom and the Microformat hAtom so that your actions aren't
trapped in any one service. Open and decentralized implementations of these technologies
are important to their evolution and adoption, based on our experiences being involved
in creating TrackBack, Atom, OpenID, and OAuth. And we hope others join us as partners
in making this a reality.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is a clever idea although I wouldn't compare it to the Facebook News Feed (what
my social network is doing) it is instead a self hosted version of the Facebook Mini-Feed
(what I've been doing). Although people have been doing this for a while by aggregating
their various feeds and republishing to their blog (life streams?), I think this is
the first time that a full fledged framework for doing this has been shipped as an
out of the box solution.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Mark Paschal has a blog post entitled &lt;a href="http://www.movabletype.org/2008/01/building_action_streams.html"&gt;Building
Action Streams&lt;/a&gt; which gives an overview of how the framework works. You define
templates which contains patterns that should be matched in a feed (RSS/Atom) or in
an HTML document and how to convert these matched elements into a blog post. Below
is the template for extracting and republishing del.icio.us links extracted from the
site's RSS feeds. 
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;delicious: links: name: Links description: Your public links
html_form: '[_1] saved the link &amp;lt;a href=&amp;quot;[_2]&amp;quot;&amp;gt;[_3]&amp;lt;/a&amp;gt;' html_params:
- url - title url: 'http://del.icio.us/rss/{{ident}}' identifier: url xpath: foreach:
//item get: created_on: dc:date/child::text() title: title/child::text() url: link/child::text()&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
It reminds me a little of XSLT. I almost wondered why they just didn't use that until
I saw that it also supports pattern matching HTML docs using &lt;a href="http://www.slideshare.net/miyagawa/webscraper-for-sfpm-lt"&gt;Web::Scraper&lt;/a&gt; [and
that XSLT is overly verbose and difficult to grok at first glance]. 
&lt;/p&gt;
&lt;p&gt;
Although this is a pretty cool tool I don't find it interesting as a publishing tool.
On the other hand, it's potential as a new kind of aggregator is very interesting.
I'd love to see someone slap more UI on it and make it a decentralized version of
the Facebook News feed. Specifically, if I could feed it a blogroll, have it use the &lt;a href="http://code.google.com/apis/socialgraph/docs/"&gt;Google
Social Graph API&lt;/a&gt; to figure out the additional services that the people in my subscriptions
have and then build a feed reader + news feed experience on top of it. That would
be cool.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
Come to think of it, this would be something interesting to experiment with in future
versions of &lt;a href="http://www.rssbandit.org"&gt;RSS Bandit&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now Playing&lt;/b&gt;: &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Birdman"&gt;Birdman&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Birdman&amp;amp;songTerm=Pop Bottles (remix) ( feat. Jim Jones &amp;amp; Fabolous)"&gt;Pop
Bottles (remix) (feat. Jim Jones &amp;amp; Fabolous)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=72b3cb4c-011c-40cc-b783-1a51d5628983" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,72b3cb4c-011c-40cc-b783-1a51d5628983.aspx</comments>
      <category>Platforms</category>
      <category>Social Software</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=cabd7c92-f60c-4552-834c-9f55897d789e</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,cabd7c92-f60c-4552-834c-9f55897d789e.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,cabd7c92-f60c-4552-834c-9f55897d789e.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=cabd7c92-f60c-4552-834c-9f55897d789e</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>The Facebook Javascript Library: Learning from the Beacon Fiasco</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,cabd7c92-f60c-4552-834c-9f55897d789e.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/01/27/TheFacebookJavascriptLibraryLearningFromTheBeaconFiasco.aspx</link>
      <pubDate>Sun, 27 Jan 2008 14:34:25 GMT</pubDate>
      <description>&lt;p&gt;
Two seemingly unrelated posts flew by my aggregator this morning. The first was Robert
Scoble&amp;rsquo;s post &lt;a href="http://scobleizer.com/2008/01/26/the-shy-mark-zuckerberg-founder-of-facebook/"&gt;The
shy Mark Zuckerberg, founder of Facebook&lt;/a&gt;&amp;nbsp;where he talks&amp;nbsp;about meeting
the Facebook founder. During their conversation, Zuckerburg admits they made mistakes
with their implementation of&amp;nbsp;&lt;a href="http://www.facebook.com/business/?beacon"&gt;Facebook
Beacon&lt;/a&gt;&amp;nbsp;and will be coming out with an improved version soon. 
&lt;/p&gt;
&lt;p&gt;
The second post is from the Facebook developer blog and it is the announcement of
the &lt;a href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=73"&gt;JavaScript
Client Library for Facebook API&lt;/a&gt;&amp;nbsp;which states
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
This JavaScript client library allows you to make Facebook API calls from any web
site and makes it easy to create Ajax Facebook applications. Since the library does
not require any server-side code on your server, you can now create a Facebook application
that can be hosted on any web site that serves static HTML.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir="ltr"&gt;
Although &lt;a href="http://www.techmeme.com/080126/p23#a080126p23"&gt;the pundits have
been going ape shit over this on Techmeme&lt;/a&gt; this is an unsurprising announcement
given the precedent of &lt;a href="http://www.facebook.com/business/?beacon"&gt;Facebook
Beacon&lt;/a&gt;. With that announcement they provided a mechanism for a limited set of
partners to integrate with their &lt;a href="http://wiki.developers.facebook.com/index.php/Feed.publishTemplatizedAction"&gt;feed.publishTemplatizedAction
API&lt;/a&gt; using a Javascript client library. Exposing the rest of their API using similar
techniques was just a matter of time. 
&lt;/p&gt;
&lt;p dir="ltr"&gt;
What was surprising to me when reading the &lt;a href="http://wiki.developers.facebook.com/index.php/JavaScript_Client_Library"&gt;developer
documentation for the Facebook Javascript client library&lt;/a&gt;&amp;nbsp;is the following
notice to developers
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Before calling any other Facebook API method, you must first create an &lt;code&gt;FB.ApiClient&lt;/code&gt; object
and invoke its &lt;code&gt;requireLogin()&lt;/code&gt; method. Once &lt;code&gt;requireLogin()&lt;/code&gt; completes,
it invokes the callback function. At that time, you can start calling other &lt;a title="API" href="http://wiki.developers.facebook.com/index.php/API"&gt;API&lt;/a&gt; methods.
There are two way to call them: normal mode and batched mode. 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir="ltr"&gt;
So unlike the original implementation of Beacon, the Facebook developers aren&amp;rsquo;t
automatically associating your Facebook account with the 3&lt;sup&gt;rd&lt;/sup&gt; party site
then letting them party on your data. Instead, &lt;strong&gt;it looks like&lt;/strong&gt; the
user will be prompted to login before the Website can start interacting with their
data on Facebook or giving Facebook data about the user. 
&lt;/p&gt;
&lt;p dir="ltr"&gt;
This is a much better approach than Beacon and&amp;nbsp;remedies the&amp;nbsp;primary complaint
from my &lt;a href="http://www.25hoursaday.com/weblog/2007/12/01/FacebookBeaconIsUnfixable.aspx"&gt;Facebook
Beacon is Unfixable&lt;/a&gt;&amp;nbsp;post from last month. 
&lt;/p&gt;
&lt;p dir="ltr"&gt;
Of course, I haven&amp;rsquo;t tested it yet to validate whether this works as advertised.&amp;nbsp;If
you get around to testing it before I do, let me know if it works the way the documentation
implies in the comments. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=cabd7c92-f60c-4552-834c-9f55897d789e" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,cabd7c92-f60c-4552-834c-9f55897d789e.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=d79b03c3-4b96-41a4-b42c-2992d959ad26</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,d79b03c3-4b96-41a4-b42c-2992d959ad26.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,d79b03c3-4b96-41a4-b42c-2992d959ad26.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d79b03c3-4b96-41a4-b42c-2992d959ad26</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Ari Steinberg who works on the Facebook developer platform has a blog post entitled <a href="http://developers.facebook.com/news.php?blog=1&amp;story=69">New
Rules for News Feed</a> which states
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>As part of the user experience improvements we announced </em>
            <a href="http://developers.facebook.com/news.php?blog=1&amp;story=68">
              <em>yesterday</em>
            </a>
            <em>,
we're changing the rules for how Feed stories can be published with the feed.publishTemplatizedAction
API method. The new policy moving forward will be that this function should only be
used to publish actions actively taken by the "actor" mentioned in the story. As an
example, feed stories that say things like "John has received a present" are no longer
acceptable. The product motivation behind this change is that Feed is a place to publish
highly relevant stories about user activity, rather than passive stories promoting
an application. 
<br /><br />
To foster this intended behavior, we are changing the way the function works: the
"actor_id" parameter will be ignored. Instead the session_key used to generate the
feed story will be used as the actor.</em>
            <br />
            <em>…</em>
            <br />
            <em>In order to ensure a high quality experience for users, starting 9am Pacific time
Tuesday 22 January we may contact you, or in severe cases initiate an enforcement
action, if your stories are not complying with the new policy, especially if the volume
of non-complying stories is high.</em>
          </p>
        </blockquote>
        <p>
If you are not a developer using the <a href="http://developer.facebook.com/">Facebook
platform</a>, it may be unclear what exactly this announcement means to end users
or applications that utilize Facebook’s APIs. 
</p>
        <p>
To understand the impact of the Facebook announcement, it would be useful to first
talk about the malicious behavior that Facebook is trying to curb. Today, an application
can call <a href="http://wiki.developers.facebook.com/index.php/Feed.publishTemplatizedAction">feed.publishTemplatizedAction</a><em> </em>and
publish a story to the user’s Mini-feed (list of all the user’s actions) which will
also show up in the News Feed of the users friends. Unfortunately some Facebook applications
have been publishing stories that don’t really correspond to a user taking an action.
For example, when a user installs the <a href="http://apps.facebook.com/flixster/">Flixster
application</a>, Flixster not only publishes a story to all of the user’s friends
saying the user has installed the application but also publishes a story to <strong>the
friends of each of the user’s friends</strong> that also have Flixster installed.
This means my friends get updates such as
</p>
        <p>
          <img src="http://byfiles.storage.live.com/y1pWYp_OEZ-BSV9RrTJqLUS50vUzix4fps6wToZFhfREgnq9DchNy_ARZ-yDFV8h2iU1tu8eAE9UhA" />
        </p>
        <p>
being sent to my friends when I wasn’t actually doing anything with the Flixster application.
I don’t know about you but this seems like a rather insiduous way for an application
to spread “virally”. 
</p>
        <p>
Facebook’s attempt to curb such application spam is to require that an application
have a session key that identifies the logged in user when publishing the story which
implies that the user is actually using the application from within Facebook
when the story is published. The problem with this remedy is that it totally breaks
applications that publish stories to the Facebook News Feed when the user isn’t on
the site. For example, since I have the <a href="http://apps.facebook.com/twitter/">Twitter
application</a> installed on Facebook, my Facebook friends get an update sent to their
News Feeds whenever I post something new on <a href="http://www.twitter.com/Carnage4Life">Twitter</a>. 
</p>
        <p>
The problem for Facebook is that by limiting a valid usage of the API, they may have
closed off a spam vector but have also closed off a valuable integration point for
third party developers and for their users. 
</p>
        <p>
PS: There might be an <a href="http://wiki.developers.facebook.com/index.php/Infinite_session_keys">infinite
session key loophole</a> to the above restriction which I’m sure Facebook will close
off if apps start abusing it as well.
</p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Silkk the Shocker">Silkk
the Shocker</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=It Ain't My Fault&amp;artistTerm=Silkk the Shocker">It
Ain't My Fault</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=d79b03c3-4b96-41a4-b42c-2992d959ad26" />
      </body>
      <title>Facebook Restricts News Feed APIs to Facebook Apps</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,d79b03c3-4b96-41a4-b42c-2992d959ad26.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/01/23/FacebookRestrictsNewsFeedAPIsToFacebookApps.aspx</link>
      <pubDate>Wed, 23 Jan 2008 04:00:12 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Ari Steinberg who works on the Facebook developer platform has a blog post entitled &lt;a href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=69"&gt;New
Rules for News Feed&lt;/a&gt;&amp;nbsp;which states
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;As part of the user experience improvements we announced &lt;/em&gt;&lt;a href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=68"&gt;&lt;em&gt;yesterday&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
we're changing the rules for how Feed stories can be published with the feed.publishTemplatizedAction
API method. The new policy moving forward will be that this function should only be
used to publish actions actively taken by the "actor" mentioned in the story. As an
example, feed stories that say things like "John has received a present" are no longer
acceptable. The product motivation behind this change is that Feed is a place to publish
highly relevant stories about user activity, rather than passive stories promoting
an application. 
&lt;br&gt;
&lt;br&gt;
To foster this intended behavior, we are changing the way the function works: the
"actor_id" parameter will be ignored. Instead the session_key used to generate the
feed story will be used as the actor.&lt;/em&gt;
&lt;br&gt;
&lt;em&gt;…&lt;/em&gt;
&lt;br&gt;
&lt;em&gt;In order to ensure a high quality experience for users, starting 9am Pacific time
Tuesday 22 January we may contact you, or in severe cases initiate an enforcement
action, if your stories are not complying with the new policy, especially if the volume
of non-complying stories is high.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
If you are not a developer&amp;nbsp;using the&amp;nbsp;&lt;a href="http://developer.facebook.com/"&gt;Facebook
platform&lt;/a&gt;, it may be unclear what exactly this announcement means to end users
or applications that utilize Facebook’s APIs. 
&lt;/p&gt;
&lt;p&gt;
To understand the impact of the Facebook announcement, it would be useful to first
talk about the malicious behavior that Facebook is trying to curb. Today, an application
can call &lt;a href="http://wiki.developers.facebook.com/index.php/Feed.publishTemplatizedAction"&gt;feed.publishTemplatizedAction&lt;/a&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;and
publish a story to the user’s Mini-feed (list of all the user’s actions) which will
also show up in the News Feed&amp;nbsp;of the users friends. Unfortunately some Facebook&amp;nbsp;applications
have been publishing stories that don’t really correspond to a user taking an action.
For example, when a user installs the &lt;a href="http://apps.facebook.com/flixster/"&gt;Flixster
application&lt;/a&gt;, Flixster not only publishes a story to all of the user’s friends
saying the user has installed the application but also publishes a story to &lt;strong&gt;the
friends of each of the user’s friends&lt;/strong&gt; that also have Flixster installed.
This means my friends get updates such as
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://byfiles.storage.live.com/y1pWYp_OEZ-BSV9RrTJqLUS50vUzix4fps6wToZFhfREgnq9DchNy_ARZ-yDFV8h2iU1tu8eAE9UhA"&gt;&gt;
&lt;/p&gt;
&lt;p&gt;
being sent to my friends when I wasn’t actually doing anything with the Flixster application.
I don’t know about you but this seems like a rather&amp;nbsp;insiduous way for an application
to spread “virally”. 
&lt;/p&gt;
&lt;p&gt;
Facebook’s attempt to curb such application spam is to require that an application
have a session key that identifies the logged in user when publishing the story which
implies that the user is actually using the application&amp;nbsp;from within Facebook
when the story is published. The problem with this remedy is that it totally breaks
applications that publish stories to the Facebook News Feed when the user isn’t on
the site. For example,&amp;nbsp;since I have the &lt;a href="http://apps.facebook.com/twitter/"&gt;Twitter
application&lt;/a&gt; installed on Facebook, my Facebook friends get an update sent to their
News Feeds whenever I post something new on &lt;a href="http://www.twitter.com/Carnage4Life"&gt;Twitter&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The problem for Facebook is that by limiting a valid usage of the API, they may have
closed off a spam vector but have also closed off a valuable integration point for
third party developers and for their users. 
&lt;/p&gt;
&lt;p&gt;
PS:&amp;nbsp;There might be&amp;nbsp;an &lt;a href="http://wiki.developers.facebook.com/index.php/Infinite_session_keys"&gt;infinite
session key loophole&lt;/a&gt; to the above restriction which I’m sure Facebook will close
off if apps start abusing it as well.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Silkk the Shocker"&gt;Silkk
the Shocker&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=It Ain't My Fault&amp;amp;artistTerm=Silkk the Shocker"&gt;It
Ain't My Fault&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=d79b03c3-4b96-41a4-b42c-2992d959ad26" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,d79b03c3-4b96-41a4-b42c-2992d959ad26.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=2e9c676f-d6eb-4f21-984e-52525ca9435c</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,2e9c676f-d6eb-4f21-984e-52525ca9435c.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,2e9c676f-d6eb-4f21-984e-52525ca9435c.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2e9c676f-d6eb-4f21-984e-52525ca9435c</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://en.wikipedia.org/wiki/Paul_Buchheit">Paul Buchheit</a>, creator of
Gmail now the founder of <a href="http://www.friendfeed.com">FriendFeed</a>, has a
blog post entitled <a href="http://paulbuchheit.blogspot.com/2008/01/should-gmail-yahoo-and-hotmail-block.html">Should
Gmail, Yahoo, and Hotmail block Facebook?</a> where he writes 
</p>
        <blockquote>
          <i>Apparently <a href="http://venturebeat.com/2008/01/03/i-was-about-to-get-my-friends-email-addresses-out-of-facebook/">Facebook
will ban you</a> (or at least Robert Scoble) if you attempt to extract your friend's
email addresses from the service. Automated access is a difficult issue for any web
service, so I won't argue with their decision -- it's their service and they own you.
However, when I signed up for Facebook I gave them my Gmail address and password,
using their <a href="https://register.facebook.com/findfriends.php?tabs&amp;ref=friends">find
friends</a> feature:</i>
          <br />
...<br /><i>So the question is, should Gmail, Yahoo, and Hotmail block Facebook (or close the
accounts of anyone who uses Facebook's "friend finder") for violating their Terms
of Use?</i></blockquote>
        <p>
I don't want to single out Facebook here since pretty much every "Web 2.0" website
with social features is very in-your-face about asking for your credentials from your
email provider and then screen scraping your contact's email addresses. I just signed
up for <a href="http://www.twitter.com">Twitter</a> and the user interface makes it
cumbersome to even start using the service after creating an account without giving
up your email username and password. 
<br /></p>
        <p>
I think there are two questions here. The first is whether users should be able to
extract their data [including social graph data] from one service and import it into
another. I personally believe the answer is Yes and this philosophy underlies what
we've been working on at Windows Live and specifically <a href="http://dev.live.com/contacts">the
team I'm on</a> which is responsible for the <strike>social graph</strike> contacts
platform. 
</p>
        <p>
        </p>
The next question is whether screen scraping is the way to get this data? I think
the answer is <i>definitely not</i>. The first problem with this approach is that
when I give some random "Web 2.0" social network my email username and password, I’m
not only giving them access to my address book but also access to 
<ul><li>
my blog posts and all my photos (<a href="http://spaces.live.com/">http://spaces.live.com</a>) 
</li><li>
my travel history (<a href="http://www.expedia.com/">http://www.expedia.com</a>) 
</li><li>
my search history (<a href="http://www.google.com/psearch">http://www.google.com/psearch</a>) 
</li><li>
my personal email (<a href="http://www.hotmail.com/">http://www.hotmail.com</a>) 
</li><li>
my medical information (<a href="http://www.healthvault.com/">http://www.healthvault.com</a>) 
</li><li>
my business documents (<a href="http://www.officelive.com/">http://www.officelive.com</a>) 
</li><li>
my personal documents (<a href="http://docs.google.com/">http://docs.google.com</a>) 
</li><li>
my purchase history (<a href="https://checkout.google.com/">https://checkout.google.com</a>)</li><li>
and so on… 
</li></ul>
This seems like a lot of valuable data to trust  to some fly by night "Web 2.0" 
service that can't seem to hire a full time sys admin or a full rack in a data center
let alone know how to properly safeguard my personal information. 
<p></p><p>
Another problem with this approach is that it encourages users to give up their usernames
and passwords when prompted by any random Web site which increases incidences of phishing.
Some have gone as far as calling this approach <a href="http://www.brianoberkirch.com/2008/01/04/this-antipattern-is-kryptonite-to-the-open-social-web/">an
anti-pattern that is kryptonite to the Open Web</a>. 
<br /></p><p>
Finally, there is no way to identify the application that is accessing data on the
user's behalf if it turns out to be a malicious application. For example, if you read
articles like <a href="http://mashable.com/2007/09/02/quechup/">Are you getting Quechup
spammed</a> you'll note that there's been more than one incident where a "Web 2.0"
company turned out to either be spamming users via the email addresses they had harvested
in this manner or straight up just resold the email addresses to spammers. Have you
ever wondered how much spam you get because someone who has your email address blithely
gave up your email credentials to some social network site who in turn used a Web
service that is run by spammers to retrieve your contact details? 
<br /></p><p>
So if I think that user's should be able to get out their data yet screen scraping
isn't the way, what should we do? At Windows Live, we believe the right approach is
to provide user-centric APIs which allow users to grant and revoke permission to third
party applications to access their personal data. For the specific case of social
graph data, we've provided an <b>ALPHA</b><a href="http://msdn2.microsoft.com/en-us/library/bb463989.aspx">Windows
Live Contacts API</a> which is intended to meet exactly this scenario. The approach
taken by this API and similar patterns (e.g. using <a href="http://oauth.net/">OAuth</a>)
solves all three concerns I've raised above. 
</p><p>
Now given what I've written above, do you think Hotmail should actively block or hinder
screen scraping applications used to obtain the email addresses of a user's contacts?
</p><img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=2e9c676f-d6eb-4f21-984e-52525ca9435c" /></body>
      <title>Should Hotmail Block Screen Scrapers?</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,2e9c676f-d6eb-4f21-984e-52525ca9435c.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2008/01/04/ShouldHotmailBlockScreenScrapers.aspx</link>
      <pubDate>Fri, 04 Jan 2008 16:48:32 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://en.wikipedia.org/wiki/Paul_Buchheit"&gt;Paul Buchheit&lt;/a&gt;, creator of
Gmail now the founder of &lt;a href="http://www.friendfeed.com"&gt;FriendFeed&lt;/a&gt;, has a
blog post entitled &lt;a href="http://paulbuchheit.blogspot.com/2008/01/should-gmail-yahoo-and-hotmail-block.html"&gt;Should
Gmail, Yahoo, and Hotmail block Facebook?&lt;/a&gt; where he writes 
&lt;/p&gt;
&lt;blockquote&gt;&lt;i&gt;Apparently &lt;a href="http://venturebeat.com/2008/01/03/i-was-about-to-get-my-friends-email-addresses-out-of-facebook/"&gt;Facebook
will ban you&lt;/a&gt; (or at least Robert Scoble) if you attempt to extract your friend's
email addresses from the service. Automated access is a difficult issue for any web
service, so I won't argue with their decision -- it's their service and they own you.
However, when I signed up for Facebook I gave them my Gmail address and password,
using their &lt;a href="https://register.facebook.com/findfriends.php?tabs&amp;amp;ref=friends"&gt;find
friends&lt;/a&gt; feature:&lt;/i&gt; 
&lt;br&gt;
...&lt;br&gt;
&lt;i&gt;So the question is, should Gmail, Yahoo, and Hotmail block Facebook (or close the
accounts of anyone who uses Facebook's "friend finder") for violating their Terms
of Use?&lt;/i&gt;&lt;/blockquote&gt;
&lt;p&gt;
I don't want to single out Facebook here since pretty much every "Web 2.0" website
with social features is very in-your-face about asking for your credentials from your
email provider and then screen scraping your contact's email addresses. I just signed
up for &lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt; and the user interface makes it
cumbersome to even start using the service after creating an account without giving
up your email username and password. 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
I think there are two questions here. The first is whether users should be able to
extract their data [including social graph data] from one service and import it into
another. I personally believe the answer is Yes and this philosophy underlies what
we've been working on at Windows Live and specifically &lt;a href="http://dev.live.com/contacts"&gt;the
team I'm on&lt;/a&gt; which is responsible for the &lt;strike&gt;social graph&lt;/strike&gt; contacts
platform. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
The next question is whether screen scraping is the way to get this data? I think
the answer is &lt;i&gt;definitely not&lt;/i&gt;. The first problem with this approach is that
when I give some random "Web 2.0" social network my email username and password, I’m
not only giving them access to my address book but also access to 
&lt;ul&gt;
&lt;li&gt;
my blog posts and all my photos (&lt;a href="http://spaces.live.com/"&gt;http://spaces.live.com&lt;/a&gt;) 
&lt;/li&gt;
&lt;li&gt;
my travel history (&lt;a href="http://www.expedia.com/"&gt;http://www.expedia.com&lt;/a&gt;) 
&lt;/li&gt;
&lt;li&gt;
my search history (&lt;a href="http://www.google.com/psearch"&gt;http://www.google.com/psearch&lt;/a&gt;) 
&lt;/li&gt;
&lt;li&gt;
my personal email (&lt;a href="http://www.hotmail.com/"&gt;http://www.hotmail.com&lt;/a&gt;) 
&lt;/li&gt;
&lt;li&gt;
my medical information (&lt;a href="http://www.healthvault.com/"&gt;http://www.healthvault.com&lt;/a&gt;) 
&lt;/li&gt;
&lt;li&gt;
my business documents (&lt;a href="http://www.officelive.com/"&gt;http://www.officelive.com&lt;/a&gt;) 
&lt;/li&gt;
&lt;li&gt;
my personal documents (&lt;a href="http://docs.google.com/"&gt;http://docs.google.com&lt;/a&gt;) 
&lt;/li&gt;
&lt;li&gt;
my purchase history (&lt;a href="https://checkout.google.com/"&gt;https://checkout.google.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
and so on… 
&lt;/li&gt;
&lt;/ul&gt;
This seems like a lot of valuable data to trust&amp;nbsp; to some fly by night "Web 2.0"&amp;nbsp;
service that can't seem to hire a full time sys admin or a full rack in a data center
let alone know how to properly safeguard my personal information. 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Another problem with this approach is that it encourages users to give up their usernames
and passwords when prompted by any random Web site which increases incidences of phishing.
Some have gone as far as calling this approach &lt;a href="http://www.brianoberkirch.com/2008/01/04/this-antipattern-is-kryptonite-to-the-open-social-web/"&gt;an
anti-pattern that is kryptonite to the Open Web&lt;/a&gt;. 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Finally, there is no way to identify the application that is accessing data on the
user's behalf if it turns out to be a malicious application. For example, if you read
articles like &lt;a href="http://mashable.com/2007/09/02/quechup/"&gt;Are you getting Quechup
spammed&lt;/a&gt; you'll note that there's been more than one incident where a "Web 2.0"
company turned out to either be spamming users via the email addresses they had harvested
in this manner or straight up just resold the email addresses to spammers. Have you
ever wondered how much spam you get because someone who has your email address blithely
gave up your email credentials to some social network site who in turn used a Web
service that is run by spammers to retrieve your contact details? 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
So if I think that user's should be able to get out their data yet screen scraping
isn't the way, what should we do? At Windows Live, we believe the right approach is
to provide user-centric APIs which allow users to grant and revoke permission to third
party applications to access their personal data. For the specific case of social
graph data, we've provided an &lt;b&gt;ALPHA&lt;/b&gt; &lt;a href="http://msdn2.microsoft.com/en-us/library/bb463989.aspx"&gt;Windows
Live Contacts API&lt;/a&gt; which is intended to meet exactly this scenario. The approach
taken by this API and similar patterns (e.g. using &lt;a href="http://oauth.net/"&gt;OAuth&lt;/a&gt;)
solves all three concerns I've raised above. 
&lt;/p&gt;
&lt;p&gt;
Now given what I've written above, do you think Hotmail should actively block or hinder
screen scraping applications used to obtain the email addresses of a user's contacts?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=2e9c676f-d6eb-4f21-984e-52525ca9435c" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,2e9c676f-d6eb-4f21-984e-52525ca9435c.aspx</comments>
      <category>Platforms</category>
      <category>Windows Live</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=f22f165d-8b6d-4e57-9a42-8500c221c786</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,f22f165d-8b6d-4e57-9a42-8500c221c786.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,f22f165d-8b6d-4e57-9a42-8500c221c786.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f22f165d-8b6d-4e57-9a42-8500c221c786</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>REQUEST:</strong>
        </p>
        <p>
POST /reader/api/0/subscription/edit HTTP/1.1 
<br />
Content-Type: application/x-www-form-urlencoded 
<br />
Host: www.google.com 
<br />
Cookie: SID=DQAAAHoAAD4SjpLSFdgpOrhM8Ju-JL2V1q0aZxm0vIUYa-p3QcnA0wXMoT7dDr7c5FMrfHSZtxvDGcDPTQHFxGmRyPlvSvrgNe5xxQJwPlK_ApHWhzcgfOWJoIPu6YuLAFuGaHwgvFsMnJnlkKYtTAuDA1u7aY6ZbL1g65hCNWySxwwu__eQ 
<br />
Content-Length: 182 
<br />
Expect: 100-continue
</p>
        <p>
s=http%3a%2f%2fwww.icerocket.com%2fsearch%3ftab%3dblog%26q%3dlink%253A25hoursaday.com%252Fweblog%2b%26rss%3d1&amp;ac=subscribe&amp;T=wAxsLRcBAAA.ucVzEgL9y7YfSo5CU5omw.w1BCzXzXHsyicU9R3qWgQ
</p>
        <p>
          <strong>RESPONSE:</strong>
        </p>
        <p>
          <font color="#ff0000">HTTP/1.1 200 OK 
<br /></font>Content-Type: text/html; charset=UTF-8 
<br />
Set-Cookie: GRLD=UNSET;Path=/reader/ 
<br />
Transfer-Encoding: chunked 
<br />
Cache-control: private 
<br />
Date: Sun, 30 Dec 2007 23:08:51 GMT 
<br />
Server: GFE/1.3
</p>
        <p>
          <font color="#ff0000">&lt;html&gt;&lt;head&gt;&lt;title&gt;500 Server Error&lt;/title&gt;</font>
          <br />
&lt;style type="text/css"&gt; 
<br />
      body {font-family: arial,sans-serif} 
<br />
      div.nav {margin-top: 1ex} 
<br />
      div.nav A {font-size: 10pt; font-family: arial,sans-serif} 
<br />
      span.nav {font-size: 10pt; font-family: arial,sans-serif;
font-weight: bold} 
<br />
      div.nav A,span.big {font-size: 12pt; color: #0000cc} 
<br />
      div.nav A {font-size: 10pt; color: black} 
<br />
      A.l:link {color: #6f6f6f} 
<br />
      &lt;/style&gt;&lt;/head&gt; 
<br />
&lt;body text="#000000" bgcolor="#ffffff"&gt;&lt;table border="0"
cellpadding="2" cellspacing="0" width="100%"&gt;&lt;/table&gt; 
<br />
&lt;table&gt;&lt;tr&gt;&lt;td rowspan="3" width="1%"&gt;&lt;b&gt;&lt;font
face="times" color="#0039b6" size="10"&gt;G&lt;/font&gt;&lt;font
face="times" color="#c41200" size="10"&gt;o&lt;/font&gt;&lt;font
face="times" color="#f3c518" size="10"&gt;o&lt;/font&gt;&lt;font
face="times" color="#0039b6" size="10"&gt;g&lt;/font&gt;&lt;font
face="times" color="#30a72f" size="10"&gt;l&lt;/font&gt;&lt;font
face="times" color="#c41200" size="10"&gt;e&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/td&gt; 
<br />
&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt; 
<br />
&lt;tr&gt;&lt;td bgcolor="#3366cc"&gt;&lt;font face="arial,sans-serif"
color="#ffffff"&gt;&lt;b&gt;Error&lt;/b&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; 
<br />
&lt;tr&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; 
<br />
&lt;blockquote&gt;<font color="#ff0000">&lt;h1&gt;Server Error&lt;/h1&gt; 
<br />
The server encountered a temporary error and could not complete your request.&lt;p&gt;&lt;/p&gt;
Please try again in 30 seconds.</font><br />
&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt; 
<br />
&lt;table width="100%" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td
bgcolor="#3366cc"&gt;&lt;img alt="" width="1" height="4"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt; 
</p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=f22f165d-8b6d-4e57-9a42-8500c221c786" />
      </body>
      <title>REST APIs that Suck: Google Reader</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,f22f165d-8b6d-4e57-9a42-8500c221c786.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/12/30/RESTAPIsThatSuckGoogleReader.aspx</link>
      <pubDate>Sun, 30 Dec 2007 23:19:21 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;REQUEST:&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
POST /reader/api/0/subscription/edit HTTP/1.1 
&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded 
&lt;br /&gt;
Host: www.google.com 
&lt;br /&gt;
Cookie: SID=DQAAAHoAAD4SjpLSFdgpOrhM8Ju-JL2V1q0aZxm0vIUYa-p3QcnA0wXMoT7dDr7c5FMrfHSZtxvDGcDPTQHFxGmRyPlvSvrgNe5xxQJwPlK_ApHWhzcgfOWJoIPu6YuLAFuGaHwgvFsMnJnlkKYtTAuDA1u7aY6ZbL1g65hCNWySxwwu__eQ 
&lt;br /&gt;
Content-Length: 182 
&lt;br /&gt;
Expect: 100-continue
&lt;/p&gt;
&lt;p&gt;
s=http%3a%2f%2fwww.icerocket.com%2fsearch%3ftab%3dblog%26q%3dlink%253A25hoursaday.com%252Fweblog%2b%26rss%3d1&amp;amp;ac=subscribe&amp;amp;T=wAxsLRcBAAA.ucVzEgL9y7YfSo5CU5omw.w1BCzXzXHsyicU9R3qWgQ
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;RESPONSE:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#ff0000"&gt;HTTP/1.1 200 OK 
&lt;br /&gt;
&lt;/font&gt;Content-Type: text/html; charset=UTF-8 
&lt;br /&gt;
Set-Cookie: GRLD=UNSET;Path=/reader/ 
&lt;br /&gt;
Transfer-Encoding: chunked 
&lt;br /&gt;
Cache-control: private 
&lt;br /&gt;
Date: Sun, 30 Dec 2007 23:08:51 GMT 
&lt;br /&gt;
Server: GFE/1.3
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#ff0000"&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;500 Server Error&amp;lt;/title&amp;gt;&lt;/font&gt; 
&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; body {font-family: arial,sans-serif} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; div.nav {margin-top: 1ex} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; div.nav A {font-size: 10pt; font-family: arial,sans-serif} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; span.nav {font-size: 10pt; font-family: arial,sans-serif;
font-weight: bold} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; div.nav A,span.big {font-size: 12pt; color: #0000cc} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; div.nav A {font-size: 10pt; color: black} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; A.l:link {color: #6f6f6f} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt; 
&lt;br /&gt;
&amp;lt;body text=&amp;quot;#000000&amp;quot; bgcolor=&amp;quot;#ffffff&amp;quot;&amp;gt;&amp;lt;table border=&amp;quot;0&amp;quot;
cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&amp;lt;/table&amp;gt; 
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td rowspan=&amp;quot;3&amp;quot; width=&amp;quot;1%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;font
face=&amp;quot;times&amp;quot; color=&amp;quot;#0039b6&amp;quot; size=&amp;quot;10&amp;quot;&amp;gt;G&amp;lt;/font&amp;gt;&amp;lt;font
face=&amp;quot;times&amp;quot; color=&amp;quot;#c41200&amp;quot; size=&amp;quot;10&amp;quot;&amp;gt;o&amp;lt;/font&amp;gt;&amp;lt;font
face=&amp;quot;times&amp;quot; color=&amp;quot;#f3c518&amp;quot; size=&amp;quot;10&amp;quot;&amp;gt;o&amp;lt;/font&amp;gt;&amp;lt;font
face=&amp;quot;times&amp;quot; color=&amp;quot;#0039b6&amp;quot; size=&amp;quot;10&amp;quot;&amp;gt;g&amp;lt;/font&amp;gt;&amp;lt;font
face=&amp;quot;times&amp;quot; color=&amp;quot;#30a72f&amp;quot; size=&amp;quot;10&amp;quot;&amp;gt;l&amp;lt;/font&amp;gt;&amp;lt;font
face=&amp;quot;times&amp;quot; color=&amp;quot;#c41200&amp;quot; size=&amp;quot;10&amp;quot;&amp;gt;e&amp;lt;/font&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt; 
&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; 
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td bgcolor=&amp;quot;#3366cc&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;arial,sans-serif&amp;quot;
color=&amp;quot;#ffffff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Error&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; 
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt; 
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;font color="#ff0000"&gt;&amp;lt;h1&amp;gt;Server Error&amp;lt;/h1&amp;gt; 
&lt;br /&gt;
The server encountered a temporary error and could not complete your request.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
Please try again in 30 seconds.&lt;/font&gt; 
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/blockquote&amp;gt; 
&lt;br /&gt;
&amp;lt;table width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td
bgcolor=&amp;quot;#3366cc&amp;quot;&amp;gt;&amp;lt;img alt=&amp;quot;&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=f22f165d-8b6d-4e57-9a42-8500c221c786" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,f22f165d-8b6d-4e57-9a42-8500c221c786.aspx</comments>
      <category>Platforms</category>
      <category>Programming</category>
      <category>XML Web Services</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=06b51fb6-b32d-41f6-a589-be64294eb3af</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,06b51fb6-b32d-41f6-a589-be64294eb3af.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,06b51fb6-b32d-41f6-a589-be64294eb3af.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=06b51fb6-b32d-41f6-a589-be64294eb3af</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Sometime last week, Amazon soft launched <a href="http://www.amazon.com/b?ie=UTF8&amp;node=342335011&amp;me=A36L942TSJ2AJA">Amazon
SimpleDB</a>, a hosted service for storing and querying structured data. This release
plugged a hole in their hosted Web services offerings which include <span class="small">the <a href="http://aws.amazon.com/s3">Amazon
Simple Storage Service (S3)</a> and the <a href="http://aws.amazon.com/ec2">Amazon
Elastic Compute Cloud (EC2)</a>. Amazon’s goal of becoming the “Web OS” upon which
the next generation of Web startups builds upon came off as hollow when all they gave
you was BLOB storage and hosted computation but not structured storage. With
SimpleDB, they’re almost at the point where all the tools you need for building the
next <a href="http://del.icio.us/">del.icio.us</a> or <a href="http://www.flickr.com/">Flickr</a> can
be provided by Amazon’s Web Services. The last bit they need to provide is actual
Web hosting so that developers don’t need to resort to <a href="http://spattendesign.com/2007/10/10/updating-dynamic-dns-on-amazon-ec2">absurd
dynamic DNS hacks</a> when interacting with their Amazon applications from the Web. </span></p>
        <p>
        </p>
        <h4>The Good: Comoditizing hosted services and getting people to think outside the
relational database box
</h4>
        <p>
        </p>
        <p>
          <span class="small">The data model of SimpleDB is remarkably similar to <a href="http://www.25hoursaday.com/weblog/2007/06/25/GoogleScalabilityConferenceTripReportMapReduceBigTableAndOtherDistributedSystemAbstractionsForHandlingLargeDatasets.aspx">Google’s
BigTable</a> in that instead of having multiple tables and relations between them,
you get a single <strike>big</strike> giant table which is accessed via the tuple
of {row key, column key}. Although, both SimpleDB and BigTable allow applications
to store multiple values for a particular tuple, they do so in different ways. In
BigTable, multiple values are additionally keyed by timestamp so I can access
data such using tuples such as {”http://www.example.com”,  “incoming_links”,
“12–12–2007”}. In Amazon’s SimpleDB I’d simply be able to store multiple values
for a particular key pair so I could access {”Dare Obasanjo”, “weblogs”} and
it would return (“http://www.25hoursaday.com/weblog”, “http://blogs.msdn.com/dareobasanjo”,
“http://carnage4life.spaces.live.com”). </span>
        </p>
        <p>
          <span class="small">
          </span>
          <span class="small">Another similarity that both systems
share, is that there is no requirement that all “rows” in a table share the same schema
nor is there an explicit notion of declaring a schema. In SimpleDB, tables are called
domains, rows are called items and the columns are called attributes.  </span>
        </p>
        <p>
          <span class="small">It is interesting to imagine how this system evolved. From experience,
it is clear that everyone who has had to build a massive relational database that
database joins kill performance. The longer you’ve dealt with massive data sets, the
more you begin to fall in love with <a href="http://www.25hoursaday.com/weblog/2007/08/03/WhenNotToNormalizeYourSQLDatabase.aspx">denormalizing
your data so you can scale</a>. Taking to its logical extreme, there’s nothing more
denormalized than a single table. Even better, Amazon goes a step further by introducing
multivalued columns which means that SimpleDB isn’t even in <a href="http://en.wikipedia.org/wiki/First_normal_form">First
Normal Form</a> whereas we all learned in school that the minimum we should aspire
to is <a href="http://en.wikipedia.org/wiki/Third_normal_form">Third Normal Form</a>. </span>
        </p>
        <p>
          <span class="small">I think it is great to see more mainstream examples that challenge
the traditional thinking of how to store, manage and manipulate large amounts of data. </span>
        </p>
        <p>
          <span class="small">I also think the pricing is very reasonable. If I was
a startup founder, I’d strongly consider taking Amazon Web Services for
a spin before going with a traditional 
<abbr title="Linux Apache MySQL Perl/PHP/Python">
LAMP
</abbr>
or 
<abbr title="Windows IIS SQL Server C#">
WISC
</abbr>
approach. </span>
          <span class="small">  </span>
        </p>
        <p>
        </p>
        <h4>The Bad: Eventual Consistency and Data Values are Weakly Typed
</h4>
        <p>
        </p>
        <p>
          <span class="small">The documentation for the <a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_PutAttributes.html">PutAttributes
method</a> has the following note </span>
        </p>
        <blockquote dir="ltr" style="margin-right: 0px;">
          <p>
            <span class="small">Because Amazon SimpleDB makes multiple copies of your data and
uses an <a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_Glossary.html#glossary_EventualConsistency"><em class="firstterm">eventual
consistency</em></a> update model, an immediate <a title="GetAttributes" href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_GetAttributes.html"><code class="function">GetAttributes</code></a> or <a title="Query" href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_Query.html"><code class="function">Query</code></a> request
(read) immediately after a <a title="DeleteAttributes" href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_DeleteAttributes.html"><code class="function">DeleteAttributes</code></a> or <a title="PutAttributes" href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_PutAttributes.html"><code class="function">PutAttributes</code></a> request
(write) might not return the updated data.</span>
          </p>
        </blockquote>
        <p>
This may or may not be a problem depending on your application. It may be OK for a <a href="http://del.icio.us/">del.icio.us</a> style
application if it took a few minutes before your tag updates were applied to
a bookmark but the same can’t be said for an application like <a href="http://www.twitter.com/">Twitter</a>.
What would be useful for developers would be if Amazon gave some more information around
the delayed propagation such as average latency during peak and off-peak hours. 
</p>
        <p>
There is another interesting note in the documentation of the <a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_Query.html">Query
method</a> which states
</p>
        <blockquote dir="ltr" style="margin-right: 0px;">
          <p>
 <a id="d0e3181"><strong><em>Lexicographical Comparison of Different Data Types</em></strong></a></p>
          <p>
            <em>Amazon SimpleDB treats all entities as UTF-8 strings. Keep this in mind when storing
and querying different data types, such as numbers or dates. Design clients to convert
their data into an appropriate string format, so that query expression return expected
results.</em>
          </p>
          <p>
            <em>The following are suggested methods for converting different data types into strings
for proper lexicographical order enforcement:</em>
          </p>
          <div class="itemizedlist">
            <ul type="disc">
              <li>
                <p>
                  <em>Positive integers should be zero-padded to match the largest number of digits
in your data set. For example, if the largest number you are planning to use in a
range is 1,000,000, every number that you store in Amazon SimpleDB should be zero-padded
to at least 7 digits. You would store 25 as 0000025, 4597 as 0004597, and so on.</em>
                </p>
              </li>
              <li>
                <p>
                  <em>Negative integers should be offset and turned into positive numbers and zero-padded.
For example, if the smallest negative integer in your data set is -500, your application
should add at least 500 to every number that you store. This ensures that every number
is now positive and enables you to use the zero-padding technique.</em>
                </p>
              </li>
              <li>
                <p>
                  <em>To ensure proper lexicographical order, convert dates to the ISO 8601 format.</em>
                </p>
              </li>
            </ul>
          </div>
          <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
            <table summary="Note" border="0">
              <tbody>
                <tr>
                  <td rowspan="2" align="center" valign="top" width="25">
                    <em>
                      <img alt="[Note]" src="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/images/note.png" />
                    </em>
                  </td>
                  <th align="left">
                    <em>Note</em>
                  </th>
                </tr>
                <tr>
                  <td align="left" valign="top">
                    <p class="simpara" xmlns="">
                      <em>Amazon SimpleDB provides utility functions within our sample libraries that help
you perform these conversions in your application. </em>
                    </p>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </blockquote>
        <p>
        </p>
        <p>
This is ghetto beyond belief. I should know ahead of time what the lowest number will
be in my data set and add/subtract offsets from data values when inserting and retrieving
them from SimpleDB? I need to know the largest number in my data set and zero pad
to that length? Seriously, WTF?
</p>
        <p>
It’s crazy just thinking about the kinds of bugs that could be introduced into applications
because of this wacky semantics and the recommended hacks to get around them. Even
if this is the underlying behavior of SimpleDB, Amazon should have fixed this up in
an APIs layer above SimpleDB then exposed that instead of providing ghetto
helper functions in a handful of popular programming languages then crossing
their fingers hoping that no one hits this problem.  
</p>
        <h4>The Ugly: Web Interfaces, that Claim to be RESTful but Aren’t
</h4>
        <p>
I’ve talked about <a href="http://www.25hoursaday.com/weblog/2005/04/03/MisunderstandingRESTALookAtTheBloglinesDeliciousAndFlickrAPIs.aspx">APIs
that claim to be RESTful but aren’t</a> in the past but Amazon’s takes the cake when
it comes to egregious behavior. Again, from the documentation for the <a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_PutAttributes.html">PutAttributes
method</a> we learn 
</p>
        <blockquote dir="ltr" style="margin-right: 0px;">
          <div class="section" lang="en">
            <div class="titlepage">
              <div>
                <div>
                  <h3 class="title">
                    <em>Sample Request</em>
                  </h3>
                </div>
              </div>
            </div>
            <p>
              <em>The following example uses <code class="function">PutAttributes</code> on <code class="code">Item123</code> which
has attributes <code class="code">(Color=Blue)</code>, <code class="code">(Size=Med)</code> and <code class="code">(Price=14.99)</code> in <code class="code">MyDomain</code>.
If <code class="code">Item123</code> already had the <code class="code">Price</code> attribute,
this operation would replace the values for that attribute.</em>
            </p>
            <pre class="programlisting">
              <em>https://sdb.amazonaws.com/ ?Action=PutAttributes &amp;Attribute.0.Name=Color&amp;Attribute.0.Value=Blue
&amp;Attribute.1.Name=Size&amp;Attribute.1.Value=Med &amp;Attribute.2.Name=Price&amp;Attribute.2.Value=14.99
&amp;Attribute.2.Replace=true &amp;AWSAccessKeyId=[valid access key id] &amp;DomainName=MyDomain
&amp;ItemName=Item123 &amp;SignatureVersion=1 &amp;Timestamp=2007-06-25T15%3A03%3A05-07%3A00
&amp;Version=2007-11-07 &amp;Signature=gabYTEXUgY%2Fdg817JBmj7HnuAA0%3D </em>
            </pre>
          </div>
          <div class="section" lang="en">
            <div class="titlepage">
              <div>
                <div>
                  <h3 class="title">
                    <em>Sample Response</em>
                  </h3>
                </div>
              </div>
            </div>
            <pre class="programlisting">
              <em>&lt;PutAttributesResponse xmlns="http://sdb.amazonaws.com/doc/2007-11-07"&gt;
&lt;ResponseMetadata&gt; &lt;RequestId&gt;490206ce-8292-456c-a00f-61b335eb202b&lt;/RequestId&gt;
&lt;BoxUsage&gt;0.0000219907&lt;/BoxUsage&gt; &lt;/ResponseMetadata&gt; &lt;/PutAttributesResponse&gt;</em>
            </pre>
          </div>
        </blockquote>
        <p>
Wow. A GET request with a parameter called <code>Action</code> which modifies data?
What is this, 2005? I thought we already went through the realization that GET requests
that modify data are bad after the <a href="http://radar.oreilly.com/archives/2005/05/google_web_acce_1.html">Google
Web Accelerator scare of 2005</a>? 
</p>
        <p>
Of course, I'm not the only one that thinks this is ridonkulous. See similar comments
from <a href="http://www.innoq.com/blog/st/2007/12/shame-on-you-amazon.html">Stefan
Tilkov</a>, <a href="http://bitworking.org/news/277/SimpleDB-is-GETSful">Joe Gregorio</a>,
and <a href="http://tech.groups.yahoo.com/group/rest-discuss/message/10000">Steve
Loughran</a>. Methinks, someone at Amazon needs to go read some <a href="http://www.25hoursaday.com/weblog/2007/11/19/GuidelinesForBuildingRESTfulWebServices.aspx">guidelines
on building RESTful Web services</a>. 
</p>
        <p>
Bonus points to Subbu Allamaraju for <a href="http://www.subbu.org/weblogs/main/2007/12/a_restful_versi.html">refactoring
the SimpleDB API into a true RESTful Web service</a>. 
</p>
        <p>
Speaking of ridonkulous APIs trends, it seems the <a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_Query.html">SimpleDB
Query method</a> follows the lead of the <a href="http://code.google.com/apis/base/query-lang-spec.html">Google
Base GData API</a> in stuffing a SQL-like query language into the query string parameters
of HTTP GET requests. I guess it is RESTful, but <font color="#ff0000"><em>Damn</em></font> is
it ugly. 
</p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=J.%20Holiday">J.
Holiday</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Suffocate&amp;artistTerm=J.%20Holiday">Suffocate</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=06b51fb6-b32d-41f6-a589-be64294eb3af" />
      </body>
      <title>Amazon SimpleDB: The Good, the Bad and the Ugly</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,06b51fb6-b32d-41f6-a589-be64294eb3af.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/12/21/AmazonSimpleDBTheGoodTheBadAndTheUgly.aspx</link>
      <pubDate>Fri, 21 Dec 2007 16:34:37 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Sometime last week, Amazon soft launched &lt;a href="http://www.amazon.com/b?ie=UTF8&amp;amp;node=342335011&amp;amp;me=A36L942TSJ2AJA"&gt;Amazon
SimpleDB&lt;/a&gt;, a hosted service for storing and querying structured data. This release
plugged a hole in their hosted Web services offerings which include &lt;span class="small"&gt;the &lt;a href="http://aws.amazon.com/s3"&gt;Amazon
Simple Storage Service (S3)&lt;/a&gt; and the &lt;a href="http://aws.amazon.com/ec2"&gt;Amazon
Elastic Compute Cloud (EC2)&lt;/a&gt;. Amazon’s goal of becoming the “Web OS” upon which
the next generation of Web startups builds upon came off as hollow when all they gave
you was BLOB storage and hosted computation but not structured storage.&amp;nbsp;With
SimpleDB, they’re&amp;nbsp;almost at the point where all the tools you need&amp;nbsp;for building&amp;nbsp;the
next &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; or &lt;a href="http://www.flickr.com/"&gt;Flickr&lt;/a&gt; can
be provided by Amazon’s Web Services. The last bit they need to provide is actual
Web hosting so that developers don’t need to resort to &lt;a href="http://spattendesign.com/2007/10/10/updating-dynamic-dns-on-amazon-ec2"&gt;absurd
dynamic DNS hacks&lt;/a&gt; when interacting with their Amazon applications from the Web. &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h4&gt;The Good: Comoditizing hosted services and getting people to think outside the
relational database box
&lt;/h4&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span class="small"&gt;The data model of SimpleDB is remarkably similar to &lt;a href="http://www.25hoursaday.com/weblog/2007/06/25/GoogleScalabilityConferenceTripReportMapReduceBigTableAndOtherDistributedSystemAbstractionsForHandlingLargeDatasets.aspx"&gt;Google’s
BigTable&lt;/a&gt; in that instead of having multiple tables and relations between them,
you get a single &lt;strike&gt;big&lt;/strike&gt; giant table which is accessed via the tuple
of {row key,&amp;nbsp;column key}. Although, both SimpleDB and BigTable allow applications
to store multiple values for a particular tuple, they do so in different ways. In
BigTable, multiple values are&amp;nbsp;additionally keyed by timestamp so I can access
data such using tuples such as&amp;nbsp;{”http://www.example.com”,&amp;nbsp;&amp;nbsp;“incoming_links”,
“12–12–2007”}.&amp;nbsp;In Amazon’s SimpleDB I’d simply be able to store multiple values
for a particular key pair so I could&amp;nbsp;access {”Dare Obasanjo”, “weblogs”} and
it would return (“http://www.25hoursaday.com/weblog”, “http://blogs.msdn.com/dareobasanjo”,
“http://carnage4life.spaces.live.com”). &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span class="small"&gt;&lt;/span&gt;&lt;span class="small"&gt;Another similarity that both systems
share, is that there is no requirement that all “rows” in a table share the same schema
nor is there an explicit notion of declaring a schema. In SimpleDB, tables are called
domains, rows are called items and the&amp;nbsp;columns are called attributes.&amp;nbsp; &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span class="small"&gt;It is interesting to imagine how this system evolved. From experience,
it is clear that everyone who has had to build a massive relational database that
database joins kill performance. The longer you’ve dealt with massive data sets, the
more you begin to fall in love with &lt;a href="http://www.25hoursaday.com/weblog/2007/08/03/WhenNotToNormalizeYourSQLDatabase.aspx"&gt;denormalizing
your data so you can scale&lt;/a&gt;. Taking to its logical extreme, there’s nothing more
denormalized than a single table. Even better, Amazon goes a step further by introducing
multivalued columns which means that SimpleDB isn’t even in &lt;a href="http://en.wikipedia.org/wiki/First_normal_form"&gt;First
Normal Form&lt;/a&gt;&amp;nbsp;whereas we all learned in school that the minimum we should aspire
to is &lt;a href="http://en.wikipedia.org/wiki/Third_normal_form"&gt;Third Normal Form&lt;/a&gt;. &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span class="small"&gt;I think it is great to see more mainstream examples that challenge
the traditional thinking of how to store, manage and manipulate large amounts of data. &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span class="small"&gt;I also think the pricing is very reasonable.&amp;nbsp;If I&amp;nbsp;was
a startup founder, I’d&amp;nbsp;strongly consider&amp;nbsp;taking Amazon Web Services for
a spin before going&amp;nbsp;with a traditional 
&lt;abbr title="Linux Apache MySQL Perl/PHP/Python"&gt;
LAMP
&lt;/abbr&gt;
or 
&lt;abbr title="Windows IIS SQL Server C#"&gt;
WISC
&lt;/abbr&gt;
approach.&amp;nbsp;&lt;/span&gt;&lt;span class="small"&gt;&amp;nbsp; &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h4&gt;The Bad: Eventual Consistency and Data Values are Weakly Typed
&lt;/h4&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span class="small"&gt;The documentation for the &lt;a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_PutAttributes.html"&gt;PutAttributes
method&lt;/a&gt; has the following note &lt;/span&gt;
&lt;/p&gt;
&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; 
&lt;p&gt;
&lt;span class="small"&gt;Because Amazon SimpleDB makes multiple copies of your data and
uses an &lt;a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_Glossary.html#glossary_EventualConsistency"&gt;&lt;em class="firstterm"&gt;eventual
consistency&lt;/em&gt;&lt;/a&gt; update model, an immediate &lt;a title="GetAttributes" href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_GetAttributes.html"&gt;&lt;code class="function"&gt;GetAttributes&lt;/code&gt;&lt;/a&gt; or &lt;a title="Query" href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_Query.html"&gt;&lt;code class="function"&gt;Query&lt;/code&gt;&lt;/a&gt; request
(read) immediately after a &lt;a title="DeleteAttributes" href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_DeleteAttributes.html"&gt;&lt;code class="function"&gt;DeleteAttributes&lt;/code&gt;&lt;/a&gt; or &lt;a title="PutAttributes" href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_PutAttributes.html"&gt;&lt;code class="function"&gt;PutAttributes&lt;/code&gt;&lt;/a&gt; request
(write) might not return the updated data.&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This may or may not be a problem depending on your application. It may be OK for a &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt;&amp;nbsp;style
application if it took a few minutes before your tag updates&amp;nbsp;were applied to
a&amp;nbsp;bookmark but the same can’t be said for&amp;nbsp;an application like &lt;a href="http://www.twitter.com/"&gt;Twitter&lt;/a&gt;.
What would be useful for developers would be if Amazon gave&amp;nbsp;some more information&amp;nbsp;around
the delayed propagation&amp;nbsp;such as average latency during peak and off-peak hours. 
&lt;/p&gt;
&lt;p&gt;
There is another&amp;nbsp;interesting note in the documentation of the&amp;nbsp;&lt;a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_Query.html"&gt;Query
method&lt;/a&gt; which states
&lt;/p&gt;
&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; 
&lt;p&gt;
&amp;nbsp;&lt;a id="d0e3181"&gt;&lt;strong&gt;&lt;em&gt;Lexicographical Comparison of Different Data Types&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Amazon SimpleDB treats all entities as UTF-8 strings. Keep this in mind when storing
and querying different data types, such as numbers or dates. Design clients to convert
their data into an appropriate string format, so that query expression return expected
results.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The following are suggested methods for converting different data types into strings
for proper lexicographical order enforcement:&lt;/em&gt;
&lt;/p&gt;
&lt;div class="itemizedlist"&gt;
&lt;ul type="disc"&gt;
&lt;li&gt;
&lt;p&gt;
&lt;em&gt;Positive integers should be zero-padded to match the largest number of digits
in your data set. For example, if the largest number you are planning to use in a
range is 1,000,000, every number that you store in Amazon SimpleDB should be zero-padded
to at least 7 digits. You would store 25 as 0000025, 4597 as 0004597, and so on.&lt;/em&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;em&gt;Negative integers should be offset and turned into positive numbers and zero-padded.
For example, if the smallest negative integer in your data set is -500, your application
should add at least 500 to every number that you store. This ensures that every number
is now positive and enables you to use the zero-padding technique.&lt;/em&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;em&gt;To ensure proper lexicographical order, convert dates to the ISO 8601 format.&lt;/em&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"&gt;
&lt;table summary="Note" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td rowspan="2" align="center" valign="top" width="25"&gt;
&lt;em&gt;&lt;img alt="[Note]" src="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/images/note.png"&gt;&lt;/em&gt;&lt;/td&gt;
&lt;th align="left"&gt;
&lt;em&gt;Note&lt;/em&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="left" valign="top"&gt;
&lt;p class="simpara" xmlns=""&gt;
&lt;em&gt;Amazon SimpleDB provides utility functions within our sample libraries that help
you perform these conversions in your application. &lt;/em&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
This is ghetto beyond belief. I should know ahead of time what the lowest number will
be in my data set and add/subtract offsets from data values when inserting and retrieving
them from SimpleDB? I need to know the largest number in my data set and zero pad
to that length? Seriously, WTF?
&lt;/p&gt;
&lt;p&gt;
It’s crazy just thinking about the kinds of bugs that could be introduced into applications
because of this wacky semantics and the recommended hacks to get around them.&amp;nbsp;Even
if this is the underlying behavior of SimpleDB, Amazon should have fixed this up in
an APIs&amp;nbsp;layer above SimpleDB then exposed that instead of&amp;nbsp;providing ghetto
helper functions in a handful of popular programming languages&amp;nbsp;then crossing
their fingers hoping&amp;nbsp;that no one hits this problem. &amp;nbsp;
&lt;/p&gt;
&lt;h4&gt;The Ugly: Web Interfaces, that Claim to be RESTful&amp;nbsp;but Aren’t
&lt;/h4&gt;
&lt;p&gt;
I’ve talked about &lt;a href="http://www.25hoursaday.com/weblog/2005/04/03/MisunderstandingRESTALookAtTheBloglinesDeliciousAndFlickrAPIs.aspx"&gt;APIs
that claim to be RESTful but aren’t&lt;/a&gt; in the past but Amazon’s takes the cake when
it comes to egregious behavior. Again, from the documentation for the &lt;a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_PutAttributes.html"&gt;PutAttributes
method&lt;/a&gt; we learn 
&lt;/p&gt;
&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; 
&lt;div class="section" lang="en"&gt;
&lt;div class="titlepage"&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 class="title"&gt;&lt;em&gt;Sample Request&lt;/em&gt;
&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;em&gt;The following example uses &lt;code class="function"&gt;PutAttributes&lt;/code&gt; on &lt;code class="code"&gt;Item123&lt;/code&gt; which
has attributes &lt;code class="code"&gt;(Color=Blue)&lt;/code&gt;, &lt;code class="code"&gt;(Size=Med)&lt;/code&gt; and &lt;code class="code"&gt;(Price=14.99)&lt;/code&gt; in &lt;code class="code"&gt;MyDomain&lt;/code&gt;.
If &lt;code class="code"&gt;Item123&lt;/code&gt; already had the &lt;code class="code"&gt;Price&lt;/code&gt; attribute,
this operation would replace the values for that attribute.&lt;/em&gt;
&lt;/p&gt;
&lt;pre class="programlisting"&gt;&lt;em&gt;https://sdb.amazonaws.com/ ?Action=PutAttributes &amp;amp;Attribute.0.Name=Color&amp;amp;Attribute.0.Value=Blue
&amp;amp;Attribute.1.Name=Size&amp;amp;Attribute.1.Value=Med &amp;amp;Attribute.2.Name=Price&amp;amp;Attribute.2.Value=14.99
&amp;amp;Attribute.2.Replace=true &amp;amp;AWSAccessKeyId=[valid access key id] &amp;amp;DomainName=MyDomain
&amp;amp;ItemName=Item123 &amp;amp;SignatureVersion=1 &amp;amp;Timestamp=2007-06-25T15%3A03%3A05-07%3A00
&amp;amp;Version=2007-11-07 &amp;amp;Signature=gabYTEXUgY%2Fdg817JBmj7HnuAA0%3D &lt;/em&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" lang="en"&gt;
&lt;div class="titlepage"&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 class="title"&gt;&lt;em&gt;Sample Response&lt;/em&gt;
&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="programlisting"&gt;&lt;em&gt;&amp;lt;PutAttributesResponse xmlns="http://sdb.amazonaws.com/doc/2007-11-07"&amp;gt;
&amp;lt;ResponseMetadata&amp;gt; &amp;lt;RequestId&amp;gt;490206ce-8292-456c-a00f-61b335eb202b&amp;lt;/RequestId&amp;gt;
&amp;lt;BoxUsage&amp;gt;0.0000219907&amp;lt;/BoxUsage&amp;gt; &amp;lt;/ResponseMetadata&amp;gt; &amp;lt;/PutAttributesResponse&amp;gt;&lt;/em&gt; &lt;/pre&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Wow. A GET request with a parameter called &lt;code&gt;Action&lt;/code&gt; which modifies data?
What is this, 2005? I thought we already went through the realization that GET requests
that modify data are bad after the &lt;a href="http://radar.oreilly.com/archives/2005/05/google_web_acce_1.html"&gt;Google
Web Accelerator scare of 2005&lt;/a&gt;? 
&lt;/p&gt;
&lt;p&gt;
Of course, I'm not the only one that thinks this is ridonkulous. See similar comments
from &lt;a href="http://www.innoq.com/blog/st/2007/12/shame-on-you-amazon.html"&gt;Stefan
Tilkov&lt;/a&gt;, &lt;a href="http://bitworking.org/news/277/SimpleDB-is-GETSful"&gt;Joe Gregorio&lt;/a&gt;,
and &lt;a href="http://tech.groups.yahoo.com/group/rest-discuss/message/10000"&gt;Steve
Loughran&lt;/a&gt;. Methinks, someone at Amazon needs to go read some &lt;a href="http://www.25hoursaday.com/weblog/2007/11/19/GuidelinesForBuildingRESTfulWebServices.aspx"&gt;guidelines
on building RESTful Web services&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Bonus points to Subbu Allamaraju for &lt;a href="http://www.subbu.org/weblogs/main/2007/12/a_restful_versi.html"&gt;refactoring
the SimpleDB API into a true RESTful Web service&lt;/a&gt;.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Speaking of ridonkulous APIs trends, it seems the &lt;a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/SDB_API_Query.html"&gt;SimpleDB
Query method&lt;/a&gt; follows the lead of the &lt;a href="http://code.google.com/apis/base/query-lang-spec.html"&gt;Google
Base GData API&lt;/a&gt; in stuffing a SQL-like query language into the query string parameters
of HTTP GET requests. I guess it is RESTful, but &lt;font color="#ff0000"&gt;&lt;em&gt;Damn&lt;/em&gt;&lt;/font&gt; is
it ugly. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=J.%20Holiday"&gt;J.
Holiday&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Suffocate&amp;amp;artistTerm=J.%20Holiday"&gt;Suffocate&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=06b51fb6-b32d-41f6-a589-be64294eb3af" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,06b51fb6-b32d-41f6-a589-be64294eb3af.aspx</comments>
      <category>Platforms</category>
      <category>XML Web Services</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=04b7e084-f5f4-408d-be22-af885882ccdf</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,04b7e084-f5f4-408d-be22-af885882ccdf.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,04b7e084-f5f4-408d-be22-af885882ccdf.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=04b7e084-f5f4-408d-be22-af885882ccdf</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Some Thoughts on the Opening of the Facebook Platform Architecture</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,04b7e084-f5f4-408d-be22-af885882ccdf.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/12/13/SomeThoughtsOnTheOpeningOfTheFacebookPlatformArchitecture.aspx</link>
      <pubDate>Thu, 13 Dec 2007 12:50:21 GMT</pubDate>
      <description>&lt;p&gt;
Yesterday I read&amp;nbsp;about the &lt;a href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=60"&gt;Opening
up Facebook Platform Architecture&lt;/a&gt;. My initial thoughts are that Facebook has done
what Google claimed to have done but didn't with &lt;a href="http://code.google.com/apis/opensocial/"&gt;Open
Social&lt;/a&gt;. Facebook seems to have provided detailed specs on how to build an interoperable
widget platform unlike Google who unleashed a bunch of half baked REST API specs with
no details about the "widget" aspect of the platform unless you are building an &lt;a href="http://code.google.com/apis/orkut/articles/anatomy.html"&gt;Orkut
application&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
As I've thought about this over the past few weeks, building a widget platform that
is competitive with Facebook's is hard work. Remember all those stories about OpenSocial
apps being &lt;a href="http://www.techcrunch.com/2007/11/02/first-opensocial-application-hacked-within-45-minutes/"&gt;hacked
in 45 minutes&lt;/a&gt; or &lt;a href="http://www.techcrunch.com/2007/11/02/first-opensocial-application-hacked-within-45-minutes/"&gt;less&lt;/a&gt;?
The problem was that sites like Plaxo Pulse and Ning simply didn't think through all
the ramifications of building a widget platform and bumped up against the kind of
"security 101" issues that widget platforms like Netvibes, iGoogle and&amp;nbsp;Live.com
gadgets solved years ago.&amp;nbsp;&amp;nbsp;I started to wonder exactly how many of these
social networking sites will be able to keep up with the capabilities and features
of platforms like Facebook's and Orkut's when such development is outside their core
competency. 
&lt;/p&gt;
&lt;p&gt;
In fact let's take a quote from the TechCrunch story &lt;a href="http://www.techcrunch.com/2007/11/02/first-opensocial-application-hacked-within-45-minutes/"&gt;First
OpenSocial Application Hacked Within 45 Minutes&lt;/a&gt;&amp;nbsp;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;theharmonyguy says he&amp;rsquo;s successfully hacked Facebook applications too, including
the Superpoke app, but that it is more difficult:&lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Facebook apps are not quite this easy. The main issue I&amp;rsquo;ve found with Facebook
apps is being able to access people&amp;rsquo;s app-related history; for instance, until
recently, I could access the SuperPoke action feed for any user. (I could also SuperPoke
any user; not sure if they&amp;rsquo;ve fixed that one. Finally, I can access all the
SuperPoke actions - they haven&amp;rsquo;t fixed that one, but it&amp;rsquo;s more just for
fun.) There are other apps where, last I checked, that was still an issue ( e.g. viewing
anyone&amp;rsquo;s Graffiti posts).&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;&lt;font color="#ff0000"&gt;But the way Facebook setup their platform, it&amp;rsquo;s tons
harder to actually imitate a user and change profile info like this.&lt;/font&gt; I&amp;rsquo;m
sure this kind of issue could be easily solved by some verification code on RockYou&amp;rsquo;s
part, &lt;font color="#ff0000"&gt;but it&amp;rsquo;s not inherent in the platform - unlike Facebook&lt;/font&gt;.
I could do a lot more like this on FB if Facebook hadn&amp;rsquo;t set things up the way
they did.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;/blockquote&gt; 
&lt;p&gt;
At that point I ask myself, how useful is it to have the specs for the platform if
you aren't l337 enough to implement it yourself? [&lt;strong&gt;Update:&lt;/strong&gt; It looks
like Google is well aware of this problem and has &lt;a href="http://opensocialapis.blogspot.com/2007/12/lets-get-this-shindig-started.html"&gt;launched
an Apache project called Shindig&lt;/a&gt; which is meant to be an Open Source widget platform
that implements the Open Social APIs. This obviously indicates that Google realizes &lt;strong&gt;the
specs are worthless&lt;/strong&gt; and instead shipping a reusable widget platform is the
way to go. It&amp;rsquo;s interesting to note that with this move&amp;nbsp;Google is attempting
to be&amp;nbsp;a software vendor, advertising partner&amp;nbsp;and competitor to the Web&amp;rsquo;s
social&amp;nbsp;networking sites. That must lead to some confusing internal meetings. &lt;img title="Smile" style="VERTICAL-ALIGN: middle" alt="Smile" src="http://shared.live.com/QGncRMHLLpIcOfCh--4aMA/emoticons/smile_regular.gif" /&gt; ]
&lt;/p&gt;
&lt;p&gt;
For now, Facebook has definitely outplayed Google here. The most interesting part
of the Facebook announcement to me is 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Now we also want to share the benefits of our work by enabling other social sites
to use our platform architecture as a model. &lt;font color="#ff0000"&gt;In fact, we&amp;rsquo;ll
even license the Facebook Platform methods and tags to other platforms.&lt;/font&gt; Of
course, Facebook Platform will continue to evolve, but by enabling other social sites
to use what we&amp;rsquo;ve learned, everyone wins -- users get a better experience around
the web, developers get access to new audiences, and social sites get more applications.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
it looks like Facebook plans to assert their Intellectual Property rights on anyone
who clones their platform. This is one of the reasons I've found &lt;a href="http://code.google.com/apis/opensocial/"&gt;Open
Social&lt;/a&gt;&amp;nbsp;to be worrisome abuse of the term "open". Like Facebook, Google shipped
specs for a proprietary platform whose copyrights, patents, etc belong to them. Any
company that implements &lt;a href="http://code.google.com/apis/opensocial/"&gt;Open Social&lt;/a&gt;&amp;nbsp;or
even &lt;a href="http://code.google.com/apis/gdata/"&gt;GData&lt;/a&gt; which it is built upon
is using Google's intellectual property. 
&lt;/p&gt;
&lt;p&gt;
What's to stop Google from asserting these intellectual property rights the way Facebook
is doing today? What exactly is "open" about it that makes it any less proprietary
than what Facebook just announced?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=04b7e084-f5f4-408d-be22-af885882ccdf" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,04b7e084-f5f4-408d-be22-af885882ccdf.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=6a2f2d64-bd8a-4189-8ad0-4dd304da0c95</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,6a2f2d64-bd8a-4189-8ad0-4dd304da0c95.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,6a2f2d64-bd8a-4189-8ad0-4dd304da0c95.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6a2f2d64-bd8a-4189-8ad0-4dd304da0c95</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I often tell people at work that turning an application into a platform is a balancing
act, not only do you have to please the developers on your platform BUT you also have
to please the users of your application as well. 
</p>
        <p>
I recently joined the <a href="http://www.facebook.com/group.php?gid=19342261632">This
has got to stop</a> group on Facebook. If you don't use Facebook, the front page of
the group is shown in the screenshot below. 
</p>
        <p>
          <img title="POINTLESS FACEBOOK APPLICATIONS ARE RUINING FACEBOOK (167,186 Members)" alt="POINTLESS FACEBOOK APPLICATIONS ARE RUINING FACEBOOK (167,186 Members)" src="http://byfiles.storage.live.com/y1pWYp_OEZ-BSUyvr8IECYZw7pw-kiJs5-YNmci9qCg9lpLCIZDXxN_nPaye6LDX3ebGlOZ3GDfS9w" />
        </p>
        <p>
I've seen a bunch of tech folks blog about being overwhelmed by Facebook app spam
like Tim Bray in his post <a href="http://www.tbray.org/ongoing/When/200x/2007/08/13/Facebook-Rules">Facebook
Rules</a> and Doc Searls in <a href="http://blogs.law.harvard.edu/doc/2007/10/23/too-much-facebook-time/">Too
much face(book) time</a>. However I assumed that the average college or high school
student who used the site didn't feel that way. Looks like I was wrong. 
</p>
        <p>
The folks at Facebook could fix this problem <u><strong>easily</strong></u> but it
would eliminate a lot of the "viralness" that has been hyped about the platform. Personally,
I think applications on the site have gotten to the point where the costs have begun
to outweigh the benefits. The only way to tip the balance back is to rein them in
otherwise it won't be long until the <a href="http://www.zephoria.org/thoughts/archives/2007/06/24/viewing_america.html#comment-253622">clean
and minimal vs. cluttered and messy</a> aesthetics stop working in their favor in
comparisons with MySpace. When that happens there will be an opportunity for someone
else to do the same thing to them. 
</p>
        <p>
On an unrelated note,  the <a href="http://www.facebook.com/group.php?gid=5930262681&amp;4">MoveOn.org
sponsored group about Facebook Beacon</a> has 74,000 members which is less than half
of the size of the <a href="http://www.facebook.com/group.php?gid=19342261632">This
has got to stop</a> group.  This is despite the fact that MoveOn.org has had
national media attention focused on that topic. I guess it goes to show that just
because a story gets a lot of hype in blogs and the press doesn't mean that it is
the most important problem facing the people it actually affects. 
</p>
        <p>
          <b>Now playing:</b>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Jay-Z">Jay-Z</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Ignorant%20Shit&amp;artistTerm=Jay-Z">Ignorant
Shit</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=6a2f2d64-bd8a-4189-8ad0-4dd304da0c95" />
      </body>
      <title>Facebook: Placing Needs of Developers Over Needs of Users</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,6a2f2d64-bd8a-4189-8ad0-4dd304da0c95.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/12/09/FacebookPlacingNeedsOfDevelopersOverNeedsOfUsers.aspx</link>
      <pubDate>Sun, 09 Dec 2007 18:11:09 GMT</pubDate>
      <description>&lt;p&gt;
I often tell people at work that turning an application into a platform is a balancing
act, not only do you have to please the developers on your platform BUT you also have
to please the users of your application as well. 
&lt;/p&gt;
&lt;p&gt;
I recently joined the &lt;a href="http://www.facebook.com/group.php?gid=19342261632"&gt;This
has got to stop&lt;/a&gt; group on Facebook. If you don't use Facebook, the front page of
the group is shown in the screenshot below. 
&lt;/p&gt;
&lt;p&gt;
&lt;img title="POINTLESS FACEBOOK APPLICATIONS ARE RUINING FACEBOOK (167,186 Members)" alt="POINTLESS FACEBOOK APPLICATIONS ARE RUINING FACEBOOK (167,186 Members)" src="http://byfiles.storage.live.com/y1pWYp_OEZ-BSUyvr8IECYZw7pw-kiJs5-YNmci9qCg9lpLCIZDXxN_nPaye6LDX3ebGlOZ3GDfS9w"&gt;
&lt;/p&gt;
&lt;p&gt;
I've seen a bunch of tech folks blog about being overwhelmed by Facebook app spam
like Tim Bray in his post &lt;a href="http://www.tbray.org/ongoing/When/200x/2007/08/13/Facebook-Rules"&gt;Facebook
Rules&lt;/a&gt; and Doc Searls in &lt;a href="http://blogs.law.harvard.edu/doc/2007/10/23/too-much-facebook-time/"&gt;Too
much face(book) time&lt;/a&gt;. However I assumed that the average college or high school
student who used the site didn't feel that way. Looks like I was wrong. 
&lt;/p&gt;
&lt;p&gt;
The folks at Facebook could fix this problem &lt;u&gt;&lt;strong&gt;easily&lt;/strong&gt;&lt;/u&gt; but it
would eliminate a lot of the "viralness" that has been hyped about the platform. Personally,
I think applications on the site have gotten to the point where the costs have begun
to outweigh the benefits. The only way to tip the balance back is to rein them in
otherwise it won't be long until the &lt;a href="http://www.zephoria.org/thoughts/archives/2007/06/24/viewing_america.html#comment-253622"&gt;clean
and minimal vs. cluttered and messy&lt;/a&gt; aesthetics stop working in their favor in
comparisons with MySpace. When that happens there will be an opportunity for someone
else to do the same thing to them. 
&lt;/p&gt;
&lt;p&gt;
On an unrelated note,&amp;nbsp; the &lt;a href="http://www.facebook.com/group.php?gid=5930262681&amp;amp;4"&gt;MoveOn.org
sponsored group about Facebook Beacon&lt;/a&gt; has 74,000 members which is less than half
of the size of the &lt;a href="http://www.facebook.com/group.php?gid=19342261632"&gt;This
has got to stop&lt;/a&gt; group.&amp;nbsp; This is despite the fact that MoveOn.org has had
national media attention focused on that topic. I guess it goes to show that just
because a story gets a lot of hype in blogs and the press doesn't mean that it is
the most important problem facing the people it actually affects. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Now playing:&lt;/b&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Jay-Z"&gt;Jay-Z&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Ignorant%20Shit&amp;amp;artistTerm=Jay-Z"&gt;Ignorant
Shit&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=6a2f2d64-bd8a-4189-8ad0-4dd304da0c95" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,6a2f2d64-bd8a-4189-8ad0-4dd304da0c95.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=e0220e0e-ca14-4c52-9bda-29a2f71458b9</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,e0220e0e-ca14-4c52-9bda-29a2f71458b9.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,e0220e0e-ca14-4c52-9bda-29a2f71458b9.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=e0220e0e-ca14-4c52-9bda-29a2f71458b9</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've seen a couple of recent articles talking about how Facebook has turned
on it's platform developers with it's most recent announcements. Fortune magazine
has an article today entitled <a href="http://www.forbes.com/technology/2007/11/06/facebook-small-developers-tech-internet-cx_rr_1106techfacebook.html">Fear
Among Facebook Developers</a> which states 
</p>
        <blockquote>
          <p>
            <em>Zuckerberg wouldn’t deny it. On stage at the Web 2.0 conference in October in
San Francisco, he acknowledged that his company reserves the right to build anything
it wants and compete with any of its independent developers, but that the company
intends to do this fairly. “We need to make sure we have the flexibility to do what
we need as the platform grows—to be flexible enough able to add in the next big component
[like the News Feed],” he said.</em>
          </p>
        </blockquote>
        <p>
Yesterday Erick Schonfeld wrote an article on TechCrunch entitled <a href="http://www.techcrunch.com/2007/11/06/ilike-vs-facebook-the-battle-for-the-music-artist/">iLike
vs. Facebook: The Battle For The Music Artist</a> that contains the following excerpt
</p>
        <blockquote>
          <p>
            <em>Instead, Facebook is treating music artists just like any other brands, which
can also set up their own Facebook pages, collect fans, and market to them directly.
Yet, when it comes to music artists, one of Facebook’s most popular application developers, </em>
            <a href="http://www.ilike.com/">
              <em>iLike<img src="http://i.ixnp.com/images/v3.0/t.gif" /></em>
            </a>
            <em>,
is doing the exact same thing. </em>
            <br />
            <em>... </em>
            <br />
            <em>So if you are a music artist, you now have to make a decision: Do you go with
the iLike page as your main Facebook page (and take advantage of the nearly 10 million
members who use the iLike app), or do you go with your own advertiser page on Facebook?
Case in point: the </em>
            <a href="http://www.facebook.com/50cent">
              <em>new Facebook
page for 50 Cent<img src="http://i.ixnp.com/images/v3.0/t.gif" /></em>
            </a>
            <em> (shown
left) had only three fans when it first went up just after midnight, compared to 1.2
million fans on his </em>
            <a href="http://apps.facebook.com/ilike/artist/50+Cent">
              <em>iLike
page<img src="http://i.ixnp.com/images/v3.0/t.gif" /></em>
            </a>
            <em> on Facebook.</em>
          </p>
        </blockquote>
        <p>
This is a tale as old as the hills. Software platforms evolve and often this means
incorporating features that were once considered as "features to be provided by others"
as core parts of the platform. There are thousands of examples of application
developers adding value to a platform that eventually became features of the
platform due to popular demand. Whether it is adding a <a href="http://en.wikipedia.org/w/index.php?title=Winsock&amp;oldid=163542386#Other_implementations">TCP/IP
stack to the operating system</a>, <a href="http://blogs.msdn.com/livesearch/archive/2005/06/09/427289.aspx">tabbed
browsing to a Web browser</a> or <a href="http://blog.persistent.info/2007/11/macros-for-new-version-of-gmail.html">adding
persistent searches to a Web mail application</a>, it's all the same story. It is hard
to argue that it isn't better for users such functionality to be a native part of
the platform or underlying application, however it often leaves the platform developers
in a lurch. 
</p>
        <p>
If the application developer cannot find a new way to add value to the platform then
their usefulness to users comes to an end. This doesn't make it a slam dunk that once
the platform vendor sees the value added by an application on it's platform, that
things will eventually go sour for the application. There are many examples of vendors
trying to compete with an application on their platform only to concede defeat and
then try to acquire the company; <a href="http://www.news.com/2100-1030_3-6181869.html">PhotoBucket's
acquisition by MySpace</a> and <a href="http://it.slashdot.org/article.pl?sid=07/10/12/2058208&amp;from=rss">Oracle's
attempt to acquire BEA</a> are two recent examples. [<em>Editors note - I suspect
that iLike vs. Facebook will end up going the same route as well</em>]. In other cases,
entry into the application space by the platform vendor helps to validate
the market and draws more visibility to it from users.  
</p>
        <p>
At the end of the day, articles like the ones I've mentioned above serve to prove
that Facebook has actually built a viable and successful platform given that
it is following the patterns of other successful platforms from the past several decades
of the software industry. 
</p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=e0220e0e-ca14-4c52-9bda-29a2f71458b9" />
      </body>
      <title>Facebook vs. Facebook Developers: When Platforms Attack</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,e0220e0e-ca14-4c52-9bda-29a2f71458b9.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/11/08/FacebookVsFacebookDevelopersWhenPlatformsAttack.aspx</link>
      <pubDate>Thu, 08 Nov 2007 13:25:01 GMT</pubDate>
      <description>&lt;p&gt;
I've seen a couple of recent articles&amp;nbsp;talking about how&amp;nbsp;Facebook has turned
on it's platform developers with it's most recent announcements.&amp;nbsp;Fortune magazine
has an article today entitled&amp;nbsp;&lt;a href="http://www.forbes.com/technology/2007/11/06/facebook-small-developers-tech-internet-cx_rr_1106techfacebook.html"&gt;Fear
Among Facebook Developers&lt;/a&gt; which states 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Zuckerberg wouldn’t deny it. On stage at the Web 2.0 conference in October in
San Francisco, he acknowledged that his company reserves the right to build anything
it wants and compete with any of its independent developers, but that the company
intends to do this fairly. “We need to make sure we have the flexibility to do what
we need as the platform grows—to be flexible enough able to add in the next big component
[like the News Feed],” he said.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Yesterday Erick Schonfeld wrote an article on TechCrunch entitled&amp;nbsp;&lt;a href="http://www.techcrunch.com/2007/11/06/ilike-vs-facebook-the-battle-for-the-music-artist/"&gt;iLike
vs. Facebook: The Battle For The Music Artist&lt;/a&gt; that contains the following excerpt
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Instead, Facebook is treating music artists just like any other brands, which
can also set up their own Facebook pages, collect fans, and market to them directly.
Yet, when it comes to music artists, one of Facebook’s most popular application developers, &lt;/em&gt;&lt;a href="http://www.ilike.com/"&gt;&lt;em&gt;iLike&lt;img src="http://i.ixnp.com/images/v3.0/t.gif"&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
is doing the exact same thing. &lt;/em&gt;
&lt;br&gt;
&lt;em&gt;... &lt;/em&gt;
&lt;br&gt;
&lt;em&gt;So if you are a music artist, you now have to make a decision: Do you go with
the iLike page as your main Facebook page (and take advantage of the nearly 10 million
members who use the iLike app), or do you go with your own advertiser page on Facebook?
Case in point: the &lt;/em&gt;&lt;a href="http://www.facebook.com/50cent"&gt;&lt;em&gt;new Facebook
page for 50 Cent&lt;img src="http://i.ixnp.com/images/v3.0/t.gif"&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (shown
left) had only three fans when it first went up just after midnight, compared to 1.2
million fans on his &lt;/em&gt;&lt;a href="http://apps.facebook.com/ilike/artist/50+Cent"&gt;&lt;em&gt;iLike
page&lt;img src="http://i.ixnp.com/images/v3.0/t.gif"&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; on Facebook.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is a tale as old as the hills. Software platforms evolve and often this means
incorporating features that were once considered as "features to be provided by others"
as core parts of the platform.&amp;nbsp;There are thousands of examples of application
developers&amp;nbsp;adding value to a platform that eventually became features of the
platform due to popular demand. Whether it is&amp;nbsp;adding a &lt;a href="http://en.wikipedia.org/w/index.php?title=Winsock&amp;amp;oldid=163542386#Other_implementations"&gt;TCP/IP
stack to the operating system&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/livesearch/archive/2005/06/09/427289.aspx"&gt;tabbed
browsing to a Web browser&lt;/a&gt; or &lt;a href="http://blog.persistent.info/2007/11/macros-for-new-version-of-gmail.html"&gt;adding
persistent searches to a Web mail application&lt;/a&gt;, it's all the same story. It is&amp;nbsp;hard
to argue that it isn't better for users such functionality to be a native part of
the platform or underlying application, however it often leaves the platform developers
in a lurch. 
&lt;/p&gt;
&lt;p&gt;
If the application developer cannot find a new way to add value to the platform then
their usefulness to users comes to an end. This doesn't make it a slam dunk that once
the platform vendor sees the value added by an application on it's platform, that
things will eventually go sour for the application. There are many examples of vendors
trying to compete with an application on their platform only to concede defeat and
then try to acquire the company; &lt;a href="http://www.news.com/2100-1030_3-6181869.html"&gt;PhotoBucket's
acquisition by MySpace&lt;/a&gt; and &lt;a href="http://it.slashdot.org/article.pl?sid=07/10/12/2058208&amp;amp;from=rss"&gt;Oracle's
attempt to acquire BEA&lt;/a&gt; are two recent examples. [&lt;em&gt;Editors note - I suspect
that iLike vs. Facebook will end up going the same route as well&lt;/em&gt;]. In other cases,
entry into the application space by the platform vendor&amp;nbsp;helps&amp;nbsp;to validate
the market and draws more visibility to it from users. &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
At the end of the day, articles like the ones I've mentioned above serve to prove
that Facebook has actually built a viable and&amp;nbsp;successful platform given that
it is following the patterns of other successful platforms from the past several decades
of the software industry. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=e0220e0e-ca14-4c52-9bda-29a2f71458b9" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,e0220e0e-ca14-4c52-9bda-29a2f71458b9.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=73327ffc-457c-4466-a6be-3d7de78170b4</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,73327ffc-457c-4466-a6be-3d7de78170b4.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,73327ffc-457c-4466-a6be-3d7de78170b4.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=73327ffc-457c-4466-a6be-3d7de78170b4</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>Building a Platform is Hard</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,73327ffc-457c-4466-a6be-3d7de78170b4.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/11/06/BuildingAPlatformIsHard.aspx</link>
      <pubDate>Tue, 06 Nov 2007 14:37:32 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; Although I &lt;/em&gt;&lt;a href="http://www.25hoursaday.com/weblog/2007/10/12/WindowsLiveEventsAndUpdatedWhatsNewPageOnWindowsLiveSpaces.aspx"&gt;&lt;em&gt;work
on the What&amp;rsquo;s New feed in Windows Live Spaces&lt;/em&gt;&lt;/a&gt;&lt;em&gt; this should not be
considered an announcement or precursor to an announcement of upcoming features of
any Windows Live service.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Yesterday, I got into a debate with &lt;a href="http://www.goland.org/"&gt;Yaron&lt;/a&gt;&amp;nbsp;about
whether &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; has done enough to allow applications
built on top of the &lt;a href="http://developer.facebook.com/"&gt;Facebook platform&lt;/a&gt; to
feel to end users as if they are part of a unified whole instead of merely being bolted
on. I argued that they had, while Yaron felt otherwise. 
&lt;/p&gt;
&lt;p&gt;
The next time I logged into &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;, I noticed
the following which I hadn&amp;rsquo;t acknowledged up until that point. See if you can
figure out the problem from the two screen shots. Mouse over for a hint. 
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="See the Flixster Movies entry?" title="See the Flixster Movies entry?" src="http://4vwftg.bay.livefilestore.com/y1pW2OKi0Ipok9gujPg3JFUJQIqGs2AIFQmD_Suf3FkAZN8qKxBtsvnoQgQGo2BWFvw_9iuZopRlkI15shsklYxNA" / /&gt;&gt;&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="Where's Flixster?" title="Where's Flixster?" src="http://byfiles.storage.live.com/y1pWYp_OEZ-BSWHhXgza6HOhhogr0X4yV_fL2Xd7_-kiB53izRmUDfn96rCsEbPrITh1Hkt98PYnFw" / /&gt;&gt;
&lt;/p&gt;
&lt;p&gt;
The problem with building a platform on top of an existing application is that any
problems users have with these platform applications ends up affecting their perception
of your application in a negative way. How many people care that &lt;a href="http://slate.com/id/2107471/"&gt;70%
of Windows crashes were caused by buggy device drivers&lt;/a&gt; that were for the most
part written by hardware manufacturers and not part of Windows itself? 
&lt;/p&gt;
&lt;p&gt;
Recently I&amp;rsquo;ve seen a rush by&amp;nbsp;some Web sites&amp;nbsp;to jump on the platform
bandwagon without clearly understanding how much work and how different a thought
process it actually takes to get there.&amp;nbsp;It will be an unfortunate shock&amp;nbsp;for&amp;nbsp;companies
when they realize that it isn&amp;rsquo;t simply about chasing after feature sets.&amp;nbsp;Building
a platform is a holistic experience which includes getting the small details right, &lt;em&gt;like
giving users consistent opt out choices for the data they get in their news feed&lt;/em&gt; not
just providing a bunch of APIs. &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; is
one of the few online services that gets it like 90% right and even they mess up on
some things as I&amp;rsquo;ve pointed out above. 
&lt;/p&gt;
&lt;p&gt;
Think about that the next time someone shows you a bunch of APIs and tells you they&amp;rsquo;ve
turned their Web site into a Web platform. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=G-Unit"&gt;G-Unit&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=I Wanna Get to Know You&amp;amp;artistTerm=G-Unit"&gt;I
Wanna Get to Know You&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=73327ffc-457c-4466-a6be-3d7de78170b4" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,73327ffc-457c-4466-a6be-3d7de78170b4.aspx</comments>
      <category>Platforms</category>
      <category>Social Software</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=cd9c1e92-0be1-4527-8f79-320af111eaff</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,cd9c1e92-0be1-4527-8f79-320af111eaff.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,cd9c1e92-0be1-4527-8f79-320af111eaff.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=cd9c1e92-0be1-4527-8f79-320af111eaff</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of people mentioned that my <a href="http://www.25hoursaday.com/weblog/2007/11/03/GoogleOpenSocialTechnicalOverviewAndCritique.aspx">previous
post on Google OpenSocial</a> was too long and needed a five sentence elevator pitch
style summary. Below is the five sentence summary of my analysis of <a href="http://code.google.com/apis/opensocial/">Google
OpenSocial</a> that cuts through the hype and is just the facts.
</p>
        <blockquote> OpenSocial is billed as a standardized widget platform for the Web, it
isn't. OpenSocial is a standard set of REST APIs which social networks can utilize
to expose user profiles and relationship data. Everything else required by a widget
platform from authentication and authorization to user interface integration and an
application directory is unspecified. OpenSocial is to a standardized widget platform
as an internal combustion engine is to an airplane. A step in the right direction
but still very far from the end goal.</blockquote>
        <p>
Hope that helps. I have to go rake some leaves and run some puppy related errands
so I might be slow in responding to comments over the rest of the day. 
</p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=cd9c1e92-0be1-4527-8f79-320af111eaff" />
      </body>
      <title>OpenSocial Explained in Five Sentences</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,cd9c1e92-0be1-4527-8f79-320af111eaff.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/11/04/OpenSocialExplainedInFiveSentences.aspx</link>
      <pubDate>Sun, 04 Nov 2007 19:14:40 GMT</pubDate>
      <description>&lt;p&gt;
A couple of people mentioned that my &lt;a href="http://www.25hoursaday.com/weblog/2007/11/03/GoogleOpenSocialTechnicalOverviewAndCritique.aspx"&gt;previous
post on Google OpenSocial&lt;/a&gt; was too long and needed a five sentence elevator pitch
style summary. Below is the five sentence summary of my analysis of &lt;a href="http://code.google.com/apis/opensocial/"&gt;Google
OpenSocial&lt;/a&gt; that cuts through the hype and is just the facts.
&lt;/p&gt;
&lt;blockquote&gt; OpenSocial is billed as a standardized widget platform for the Web, it
isn't. OpenSocial is a standard set of REST APIs which social networks can utilize
to expose user profiles and relationship data. Everything else required by a widget
platform from authentication and authorization to user interface integration and an
application directory is unspecified. OpenSocial is to a standardized widget platform
as an internal combustion engine is to an airplane. A step in the right direction
but still very far from the end goal.&lt;/blockquote&gt; 
&lt;p&gt;
Hope that helps. I have to go rake some leaves and run some puppy related errands
so I might be slow in responding to comments over the rest of the day. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=cd9c1e92-0be1-4527-8f79-320af111eaff" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,cd9c1e92-0be1-4527-8f79-320af111eaff.aspx</comments>
      <category>Platforms</category>
      <category>Social Software</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=98477176-3d0b-4e35-a808-d05a7c725005</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,98477176-3d0b-4e35-a808-d05a7c725005.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,98477176-3d0b-4e35-a808-d05a7c725005.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=98477176-3d0b-4e35-a808-d05a7c725005</wfw:commentRss>
      <slash:comments>12</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <i>
            <b>Disclaimer:</b> This post does not reflect the opinions, thoughts, strategies
or future intentions of my employer. These are solely my personal opinions. If you
are seeking official position statements from Microsoft, please go <a href="http://www.microsoft.com/presspass">here</a>.</i>
        </p>
        <p>
One of the Google folks working on <a href="http://code.google.com/apis/opensocial/">OpenSocial</a> sent
me a message via <a href="http://www.facebook.com">Facebook</a> asking what I thought
about the technical details of the recent announcements. Since my day job is working
on social networking platforms for Web properties at Microsoft and I'm deeply interested
in RESTful protocols, this is something I definitely have some thoughts about. Below
is what started off as a private message but ended up being long enough to be it's
own blog post. 
</p>
        <h4>First Impressions 
</h4>
        <p>
In reading the <a href="http://code.google.com/apis/opensocial/docs/index.html">OpenSocial
API documentation</a> it seems clear that is intended to be the functional equivalent
of <a href="http://developer.facebook.com">the Facebook platform</a>. Instead
of the <a href="http://wiki.developers.facebook.com/index.php/API">Facebook users
and friends APIs</a>, we get the <a href="http://code.google.com/apis/opensocial/docs/gdata/people/developers_guide_protocol.html">OpenSocial
People and Friends Data API</a>. Instead of the <a href="http://developer.facebook.com/documentation.php?v=1.0&amp;method=feed.publishStoryToUser">Facebook
feed API</a>, we get the <a href="http://code.google.com/apis/opensocial/docs/gdata/activities/developers_guide_protocol.html">OpenSocial
Activities API</a>. Instead of the <a href="http://wiki.developers.facebook.com/index.php/Data_Store_API_documentation">Facebook
Data Store API</a>, we get the <a href="http://code.google.com/apis/opensocial/docs/gdata/persistence/developers_guide_protocol.html">OpenSocial
Persistence Data API</a>. Instead of <a href="http://developer.facebook.com/documentation.php?doc=fql">FQL</a> as
a friendly alternative to the various REST APIs we get <a href="http://code.google.com/apis/opensocial/docs/javascript/reference/">a
JavaScript object model</a>.   
</p>
        <p>
In general, I personally prefer the Facebook platform to OpenSocial. This is
due to three reasons 
</p>
        <ul>
          <li>
There is no alternative to the <a href="http://developer.facebook.com/anatomy.php">deep
integration into the Web site's user experience</a> that is facilitated with <a href="http://wiki.developers.facebook.com/index.php/FBML">FBML</a>.   
</li>
          <li>
I prefer idiomatic XML to tunnelling data through Atom feeds in ways that [in
my opinion] add unnecessary cruft. 
</li>
          <li>
The Facebook APIs encourage developers to build social and item relationship graphs
within their application while the OpenSocial seems only concerned with developers
stuffing data in key/value pairs. 
</li>
        </ul>
        <h4>The Javascript API
</h4>
        <p>
At first I assumed the <a href="http://code.google.com/apis/opensocial/docs/javascript/reference/">OpenSocial
JavaScript API</a> would provide similar functionality to <a href="http://wiki.developers.facebook.com/index.php/FBML">FBML</a> given
the large number of sound bites quoting Google employees stating that instead of "proprietary
markup" you could use "standard JavaScript" to build <a href="http://code.google.com/apis/opensocial/">OpenSocial</a> applications.
However it seems the JavaScript API is simply a wrapper on top of the various REST
APIs. I'm sure there's some comment one could make questioning if REST APIs are
so simple why do developers feel the need to hide them behind object models? 
</p>
        <p>
Given the varying features and user interface choices in social networking sites,
it is unsurprising that there is no rich mechanism specified for adding entry points
to the application into the container sites user interface. However it is surprising
that <em>no user interface hooks are specified</em> at all. This is surprising
given that there are some common metaphors in social networking sites (e.g. a
profile page, a friends list, etc) which can be interacted with in a standard
way.  It is also shocking that Google attacked Facebook's use of "proprietary
markup" only to not even ship an equivalent feature. 
</p>
        <h4>The People and Friends Data API 
</h4>
        <p>
The <a href="http://code.google.com/apis/opensocial/docs/gdata/people/reference.html">People
and Friends Data API</a> is used to retrieve information about a user or the user's friends
as an Atom feed. Each user is represented as an <code>atom:entry</code> which is a <a href="http://code.google.com/apis/opensocial/docs/gdata/people/reference.html#Elements">PersonKind</a> (which
should not be confused with an <a href="http://tools.ietf.org/html/rfc4287#section-3.2">Atom
person construct</a>). It is expected that the URL structure for accessing people
and friends feeds will be of the form  <code>http://&lt;domain&gt;/feeds/people/&lt;userid&gt;</code> and <code>http://&lt;domain&gt;/feeds/people/&lt;userid&gt;/friends</code> respectively. 
</p>
        <p>
Compare the following response to a request for a user's information using OpenSocial
with the equivalent Facebook API call response.
</p>
        <blockquote>
          <pre>GET http://orkut.com/feeds/people/14358878523263729569</pre>
          <pre>&lt;entry xmlns='http://www.w3.org/2005/Atom' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005'&gt;<br />
&lt;id&gt;http://sandbox.orkut.com:80/feeds/people/14358878523263729569&lt;/id&gt;<br />
&lt;updated&gt;2007-10-28T14:01:29.948-07:00&lt;/updated&gt;<br />
&lt;title&gt;Elizabeth Bennet&lt;/title&gt;<br />
&lt;link rel='thumbnail' type='image/*' href='http://img1.orkut.com/images/small/1193601584/115566312.jpg'/&gt;<br />
&lt;link rel='alternate' type='text/html' href='http://orkut.com/Profile.aspx?uid=17583631990196664929'/&gt;<br />
&lt;link rel='self' type='application/atom+xml' href='http://sandbox.orkut.com:80/feeds/people/14358878523263729569'/&gt;<br />
&lt;georss:where&gt;<br />
&lt;gml:Point xmlns:gml='http://www.opengis.net/gml'&gt;<br />
&lt;gml:pos&gt;51.668674 -0.066235&lt;/gml:pos&gt;<br />
&lt;/gml:Point&gt;<br />
&lt;/georss:where&gt;<br />
&lt;gd:extendedProperty name='lang' value='en-US'/&gt;<br />
&lt;gd:postalAddress/&gt;<br />
&lt;/entry&gt;</pre>
        </blockquote>
        <p>
Below is the what the above information would look like if returned by Facebook's <a href="http://developer.facebook.com/documentation.php?v=1.0&amp;method=users.getInfo">users.getInfo</a> method
</p>
        <blockquote>
          <p>
GET 
</p>
          <pre>&lt;users_getInfo_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd" list="true"&gt;<br />
&lt;user&gt;<br />
&lt;uid&gt;14358878523263729569&lt;/uid&gt;<br />
&lt;current_location&gt;<br />
&lt;city&gt;Palo Alto&lt;/city&gt;<br />
&lt;state&gt;CA&lt;/state&gt;<br />
&lt;country&gt;United States&lt;/country&gt;<br />
&lt;zip&gt;94303&lt;/zip&gt;<br />
&lt;/current_location&gt;<br />
&lt;first_name&gt;Elizabeth&lt;/first_name&gt;<br />
&lt;is_app_user&gt;1&lt;/is_app_user&gt;<br />
&lt;has_added_app&gt;1&lt;/has_added_app&gt;<br />
&lt;pic&gt;http://photos-055.facebook.com/ip007/profile3/1271/65/s8055_39735.jpg&lt;/pic&gt;<br />
&lt;/user&gt;<br />
&lt;/users_getInfo_response&gt;</pre>
        </blockquote>
        <p>
I've already mentioned that I prefer idiomatic XML to tunnelling data through Atom
feeds. Comparing the readability of both examples should explain why. 
</p>
        <h4>The Activities Data API 
</h4>
        <p>
A number of social networking sites now provide a feature which enables users to see
the recent activities of members of their social network in an activity stream. The <a href="http://www.facebook.com/sitetour/homepage.php">Facebook
news feed</a>, <a href="http://en.blog.orkut.com/2007/09/whats-new-with-your-orkut-friends.html">Orkut's
updates from your friends</a>, and the <a href="http://robdolin.spaces.live.com/blog/cns%213C8CA60F8F925FEC%21884.entry">Windows
Live Spaces what's new page</a> are all examples of this feature. The <a href="http://code.google.com/apis/opensocial/docs/gdata/activities/developers_guide_protocol.html">OpenSocial
Activities Data API</a> provides a mechanism for OpenSocial applications to access
and update this activity stream as an Atom feed. All of the users activities or all
activities from a specific application can be accessed using URIs of the form  <code>http://&lt;domain&gt;/activities/feeds/activities/user/&lt;userID&gt;</code> and <code><code>http://&lt;domain&gt;/activities/feeds/activities/user/&lt;userID&gt;/source/&lt;sourceID&gt;</code></code> respectively.  
</p>
        <p>
Currently there is no reference documentation on this API. My assumption is that since
Orkut is the only OpenSocial site that supports this feature, it is difficult to produce
a spec that will work for other services without it being a verbatim description of
Orkut's implementation. 
</p>
        <p>
There are some notes on how Orkut attempts to prevents applications from spamming a
user's activity stream. For one, applications are only allowed to update the activity
stream for their source directly instead of the activity stream for the user. I assume
that Google applies some filter to the union of all the source specific activity streams
before generating the user's activity feed to eliminate spam. Secondly, applications
are monitored to see if they post too many messages to the activity stream or if they
post promotional messages instead of the user's activities to the stream. All of this
makes it seem difficult to see how one could specify the behavior of this API and
feature set reliably for a diverse set of social networking sites. 
</p>
        <h4>The Persistence Data API 
</h4>
        <p>
The <a href="http://code.google.com/apis/opensocial/docs/gdata/persistence/reference.html">OpenSocial
Persistence API</a> allows applications to store and retrieve key&lt;-&gt;value
pairs that are either user-specific or are global to the application. An example of
the former is a listing of company name and stock ticker pairs
while an example of the latter is a user's stock portfolio. The feed of global key&lt;-&gt;value
pairs for an application can be accessed at a URL of the form <code>http://&lt;domain&gt;/feeds/apps/<em>&lt;appID&gt;</em>/persistence/global</code> for
the entire feed and <code>http://&lt;domain&gt;/feeds/apps/<em>&lt;appID&gt;</em>/persistence/global/&lt;key&gt;</code> if
seeking a particular key&lt;-&gt;value pair. User-specific key&lt;-&gt;value pairs
are available at the URL of the form <code>http://&lt;domain&gt;/feeds/apps/<em>&lt;appID&gt;</em>/persistence/&lt;userID&gt;/instance/&lt;instanceID&gt;</code>. 
</p>
        <p>
This is probably the least interesting aspect of the API. A simple persistence API
like this is useful for applications with simple storage needs that need to store
user preferences or simple textual data that is needed by the application. However
you aren't going to use this as the data storage platform for applications like <a href="http://apps.facebook.com/ilike">iLike</a>, <a href="http://apps.facebook.com/flixster/">Flixster</a> or <a href="http://apps.facebook.com/scrabulous">Scrabulous</a>. 
</p>
        <p>
However I will add that an Atom feed seems like a horrible representation for a list
of key&lt;-&gt;value pairs. It's so bad that the documentation doesn't provide an
example of such a feed. 
</p>
        <h4>Hosting OpenSocial Applications
</h4>
        <p>
The <a href="http://code.google.com/apis/opensocial/container.html">documentation
on hosting OpenSocial applications</a> implies that any site that can host Google
gadgets can also host OpenSocial applications. In practice, it means that any site
that you can place a &lt;script&gt; element on can point to a gadget and thus render
it. Whether the application will actually work will depend on whether the hosting
service has actually implemented the OpenSocial Service Provider Interface (SPI). 
</p>
        <p>
Unfortunately, the documentation on implementing the OpenSocial SPI is missing in
action. From the Google site 
</p>
        <blockquote>
          <p>
            <em>To host OpenSocial apps, your website must support the SPI side of the OpenSocial
APIs. Usually your SPI will connect to your own social network, so that an OpenSocial
app added to your website automatically uses your site's data. However, it is possible
to use data from another social network as well, should you prefer. Soon, we will
provide a development kit with documentation and code to better support OpenSocial
websites, along with a sample sandbox which implements the OpenSocial SPI using in-memory
storage. The SPI implements: </em>
          </p>
          <ul>
            <li>
              <em>Adding and removing friends </em>
            </li>
            <li>
              <em>Adding and removing apps </em>
            </li>
            <li>
              <em>Storing activities </em>
            </li>
            <li>
              <em>Retrieving activity streams for self and friends </em>
            </li>
            <li>
              <em>Storing and retrieving per-app and per-app-per-user data </em>
            </li>
          </ul>
          <p>
            <em>The OpenSocial website development kit will include full SPI documentation. It
will provide open source reference implementations for both client and server components.</em>
          </p>
        </blockquote>
        <p>
I assume that the meat of the OpenSocial SPI is documentation is just more detailed
rules about how to implement the REST APIs described above. The interesting bits will
likely be the reference implementations of the API which will likely become the de
facto standard implementations instead of encouraging dozens of buggy incompatible
versions of the OpenSocial API to bloom.    
</p>
        <h4>Conclusion
</h4>
        <p>
In general I believe that any effort to standardize the widget/gadget APIs exposed
by various social networking sites and AJAX homepages (e.g. iGoogle, Netvibes, Live.com,
etc) is a good thing. Niall Kennedy has an excellent series of articles on <a href="http://www.niallkennedy.com/blog/archives/2007/07/web-widget-formats.html">Web
Widget formats</a> and <a href="http://www.niallkennedy.com/blog/archives/2007/07/widget-data-formats.html">Web
Widget update technologies</a> that shows how diverse and disparate the technologies
that developers have to learn and utilize when they want to build widgets for
various sites. Given that Web widgets are now a known quantity, the time is ripe for
some standardization. 
</p>
        <p>
That said, there are a number of things that give me cause to pause with regards
to <a href="http://code.google.com/apis/opensocial/">OpenSocial</a></p>
        <ol>
          <li>
            <p>
A common practice in the software industry today is to prefix "Open" to the name of
your technology which automatically gives it an aura of goodness while attempting
to paint competing technologies as being evil and "closed". Examples include OpenDocument,
OpenID, OpenXML, OAuth, etc. In this case, <a href="http://code.google.com/apis/opensocial/">OpenSocial</a> is
being positioned as an "open" alternative to the <a href="http://developer.facebook.com">Facebook
platform</a>.  However as bloggers like Shelley Powers, Danny Ayers and Russell
Beattie have pointed out, there isn't much "open" about <a href="http://code.google.com/apis/opensocial/">OpenSocial</a>.
Russell Beattie asks in his post <a href="http://www.russellbeattie.com/blog/where-the-hell-is-the-container-api">Where
the hell is the Container API?</a></p>
            <blockquote>
              <em>Would people be jumping on this bandwagon so readily if it was Microsoft
unilaterally coming up with an API, holding secret meetings geared towards undercutting
the market leader, and then making sure that only those anointed partners get a head
start on launch day by making sure a key part of the API isn't released - even in
alpha. (It obviously exists already, all the partners have that spec and even sample
code, I'm sure. The rest of us don't get access yet, until the GOOG says otherwise).</em>
            </blockquote>
            <p>
Let's say we ignore that the process for creating the technology was not "open" nor
have key aspects of the technology even been unveiled [which makes this more of a
FUD announcement to take the wind out of Facebook's sails than an actual technology
announcement], is the technology itself open? Shelley Powers points out her post <a href="http://burningbird.net/technology/terms/">Terms</a> that
</p>
            <blockquote>
              <em>Perhaps the world will read the terms of use of the API, and realize <font color="#ff0000">this
is not an open API; this is a free API, owned and controlled by one company only:
Google</font>. Hopefully, the world will remember another time when Google offered
a free API and then pulled it. Maybe the world will also take a deeper look and realize
that the functionality is dependent on Google hosted technology, which has its own
terms of service (including adding ads at the discretion of Google), and that building
an OpenSocial application ties Google into your application, and Google into every
social networking site that buys into the Dream.</em>
            </blockquote>
            <p>
Google has announced a technology platform that is every bit as proprietary as Facebook's.
The only difference is that they've cut deals with some companies to utilize their
proprietary platform while Facebook's platform is only for use on <a href="http://www.facebook.com/">the
Facebook site</a>. <span style="background-color: yellow;">If Zuckerburg <a href="http://www.techcrunch.com/2007/11/02/ok-heres-at-least-part-of-what-facebook-is-announcing-on-tuesday/">announces
next week</a> that the Facebook platform is freely implementable by any 3rd party
Web site, where does that leave <a href="http://code.google.com/apis/opensocial/">OpenSocial</a>?</span> After
all, the <a href="http://developer.facebook.com">Facebook platform</a> is actually
a proven, working system with complete documentation instead of the incomplete rush
job that <a href="http://code.google.com/apis/opensocial/">OpenSocial</a> clearly
is right now. 
</p>
            <p>
There are all sorts of forums for proposing and discussing <b>open</b> Web technologies
including the IETF, W3C, OASIS and even ECMA. Until all of the underlying technologies
in<a href="http://code.google.com/apis/opensocial/"> OpenSocial</a> have
been handed over to one or more of these standards bodies, this is a case of the proprietary
pot calling the proprietary kettle black. 
</p>
          </li>
          <li>
            <p>
One of the things that comes along with <a href="http://code.google.com/apis/opensocial/">OpenSocial</a> is
that Google has now proposed <a href="http://code.google.com/apis/gdata/">GData</a> as
the standard protocol for interacting with social graphs on the Web. This is something
that I've been worried about for a while and I've written a <a href="http://www.25hoursaday.com/weblog/2007/06/09/WhyGDataAPPFailsAsAGeneralPurposeEditingProtocolForTheWeb.aspx">couple
of</a> <a href="http://www.25hoursaday.com/weblog/2007/06/11/GDataIsntABestPracticeImplementationOfTheAtomPublishingProtocol.aspx">blog</a> <a href="http://www.25hoursaday.com/weblog/2007/10/10/OneProtocolToRuleThemAllAndInTheDarknessBindThem.aspx">posts</a> to
address this topic because it is not clear that the Atom Publishing Protocol
upon which GData is based works well outside it's original purpise of editing
blog posts and the like. I'm not the only one that feels this way. 
</p>
            <p>
Danny Ayers wrote in his post <a href="http://dannyayers.com/2007/11/02/open-social">Open?
Social?</a></p>
            <blockquote>
              <p>
However the <a href="http://code.google.com/apis/opensocial/docs/gdata/people/reference.html#Elements">People
Data API</a> is cruel and unusual. It first stretches Atom until it creaks with <em>"each
entry in the People or Friends feed is a PersonKind";</em> then gives a further tug 
(a person's name is represented using atom:title) then extends it even more (a person's
email is gd:email) and finally mops up all the blood, sweat and dribble: 
</p>
              <p>
Key value parameters - gd:extendedProperty - "<em>As different social networks and
other sources of People data have many different named fields, this provides a way
for them to be passed on generally. Agreeing on common naming conventions is to be
decided in future.</em>" 
</p>
              <p>
Got to admire the attempt, but (to mix the metaphorical namespaces) silk purses don't
make very good sow's ears either.
</p>
            </blockquote>
            <p>
In addition, AtomPub geek extraordinairre, Tim Bray wrote in his blog post entitled <a href="http://www.tbray.org/ongoing/When/200x/2007/06/17/Web3S#p-2">Web3S</a></p>
            <blockquote>
              <em>If you decide you totally can’t model your world as collections of
entries populated with hyperlinks to express relationships, well then I guess APP’s
not for you. And at the level of engineering intuition, I have to say that a monster
online address book does feel different at a deep level from most online “publications”
(I thought that was why we had LDAP... but I repeat myself).</em>
            </blockquote>
            <p>
Now that we have AtomPub/GData as a de facto standard protocol for accessing various
kinds of non-microcontent data on the Web as a reality, I'm done debating its suitability
for the task since the horse has already left the barn. However I will continue to
ask <a href="http://www.25hoursaday.com/weblog/2007/11/01/WhenWillGDataBeRFC5023Compliant.aspx">when
will GData be RFC 5023 compliant</a>?
</p>
          </li>
          <li>
            <p>
At the end of the day, the most disappointing thing about <a href="http://code.google.com/apis/opensocial/">OpenSocial</a> is
that it doesn't really further the conversation about actual interoperability across
social networking sites. If I use Orkut, I still need a MySpace account to interact
with my friends on that site. Some people have claimed that <a href="http://code.google.com/apis/opensocial/">OpenSocial</a> will
enable routing around such lock-in via applications like <a href="http://apps.facebook.com/ilike">iLike</a> and <a href="http://apps.facebook.com/flixster">Flixster</a> which
have their own social networks and thus could build cross-site social networking services
since they will be hosted on multiple social networking sites. However the tough part
of this problem is how a hosted application knows that <a href="http://carnage4life.spaces.live.com">carnage4life@windowslivespaces</a> is
the same user as <a href="http://www.facebook.com/p/Dare_Obasanjo/500050028">DareObasanjo@Facebook</a>?
It seems OpenSocial completely punts on satisfying this scenario even though it wouldn't
be hard to add this as a requirement of the system. I guess the various applications
can create their own user account systems and then do the cross-site social network
bridging that way, which sucks because it will be a lot of duplicative work and will
require users to create even more accounts with various services. 
</p>
            <p>
Given that the big widget vendors like <a href="http://ilike.com/">iLike</a>, <a href="http://www.slide.com">Slide</a> and <a href="http://www.rockyou.com">RockYou</a> already
have their users creating accounts on their sites that can be tied back to which social
networking site the user utilizes their widgets on, this might be a moot point.
Wouldn't it be mad cool if the <a href="http://apps.facebook.com/topeight/">Top
Friends Facebook application</a> could also show your top friends from <a href="http://www.myspace.com">MySpace</a> or <a href="http://www.orkut.com">Orkut</a>?
I suspect the valuation of various widget companies will be revised upwards in the
coming months. 
</p>
          </li>
          <li>
            <p>
There is no mention of a user-centric application authorization model. Specifically,
there is no discussion of how users grant and revoke permission to access their personal
data to various OpenSocial applications. Regular readers of my blog are familiar with
my mantra of <a href="http://www.25hoursaday.com/weblog/2007/09/02/PutTheUserInControlOtherwiseThingsFallApart.aspx">putting
the user in control</a> which is why I've been so enthusiastic about <a href="http://www.25hoursaday.com/weblog/2007/10/06/OAuth10IsHereDelegatedAuthorityComesToMashups.aspx">OAuth</a>.
Although there is some mention of <a href="http://code.google.com/apis/accounts/AuthForWebApps.html">Google's
Authentication for Web Application</a> in the documentation, this seems specific to
Google's implementation of OpenSocial hosting and it is unclear to me that we should
expect that this is the same model that will be utilized by MySpace, Bebo, TypePad
or any of the other social networking sites that have promised to implement <a href="http://code.google.com/apis/opensocial/">OpenSocial</a>.
On the other hand, Facebook has a well thought out <a href="http://wiki.developers.facebook.com/index.php/Extended_application_permission">applications
permission model</a> and I would have thought it would be quite easy to simply reverse
engineer that and add it to the OpenSocial spec than to simply punt on this problem. 
</p>
          </li>
        </ol>
        <p>
Despite these misgivings, I think this is a step in the right direction. Web widget
and social graph APIs need to be standardized across the Web. 
</p>
        <p>
          <strong>PS:</strong> I've subscribed to the <a href="http://opensocialapis.blogspot.com/">Google
OpenSocial blog</a>. So far there have only been posts by clueless marketing types
but I'm sure interesting technical information that addresses some of the points above
will be forthcoming. 
</p>
        <script>
digg_url = 'http://digg.com/tech_news/Google_OpenSocial_Technical_Overview_and_Critique';
</script>
        <script src="http://digg.com/api/diggthis.js">
        </script>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=98477176-3d0b-4e35-a808-d05a7c725005" />
      </body>
      <title>Google OpenSocial: Technical Overview and Critique</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,98477176-3d0b-4e35-a808-d05a7c725005.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/11/03/GoogleOpenSocialTechnicalOverviewAndCritique.aspx</link>
      <pubDate>Sat, 03 Nov 2007 19:23:12 GMT</pubDate>
      <description>&lt;p&gt;
&lt;i&gt;&lt;b&gt;Disclaimer:&lt;/b&gt; This post does not reflect the opinions, thoughts, strategies
or future intentions of my employer. These are solely my personal opinions. If you
are seeking official position statements from Microsoft, please go &lt;a href="http://www.microsoft.com/presspass"&gt;here&lt;/a&gt;.&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;
One of the Google folks working on &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt; sent
me a message via &lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt; asking what I thought
about the technical details of the recent announcements. Since my day job is working
on social networking platforms for Web properties at Microsoft and I'm deeply interested
in RESTful protocols, this is something I definitely have some thoughts about. Below
is what started off as a private message but ended up being long enough to be it's
own blog post. 
&lt;/p&gt;
&lt;h4&gt;First Impressions 
&lt;/h4&gt;
&lt;p&gt;
In reading the &lt;a href="http://code.google.com/apis/opensocial/docs/index.html"&gt;OpenSocial
API documentation&lt;/a&gt; it seems clear that is intended to be the functional equivalent
of&amp;nbsp;&lt;a href="http://developer.facebook.com"&gt;the Facebook platform&lt;/a&gt;. Instead
of the &lt;a href="http://wiki.developers.facebook.com/index.php/API"&gt;Facebook&amp;nbsp;users
and friends&amp;nbsp;APIs&lt;/a&gt;, we get the &lt;a href="http://code.google.com/apis/opensocial/docs/gdata/people/developers_guide_protocol.html"&gt;OpenSocial
People and Friends Data API&lt;/a&gt;. Instead of the &lt;a href="http://developer.facebook.com/documentation.php?v=1.0&amp;amp;method=feed.publishStoryToUser"&gt;Facebook
feed API&lt;/a&gt;, we get the &lt;a href="http://code.google.com/apis/opensocial/docs/gdata/activities/developers_guide_protocol.html"&gt;OpenSocial
Activities API&lt;/a&gt;. Instead of the &lt;a href="http://wiki.developers.facebook.com/index.php/Data_Store_API_documentation"&gt;Facebook
Data Store API&lt;/a&gt;, we get the &lt;a href="http://code.google.com/apis/opensocial/docs/gdata/persistence/developers_guide_protocol.html"&gt;OpenSocial
Persistence Data API&lt;/a&gt;. Instead of &lt;a href="http://developer.facebook.com/documentation.php?doc=fql"&gt;FQL&lt;/a&gt; as
a friendly alternative to the various REST APIs&amp;nbsp;we get &lt;a href="http://code.google.com/apis/opensocial/docs/javascript/reference/"&gt;a
JavaScript object model&lt;/a&gt;.&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In general, I personally prefer the Facebook&amp;nbsp;platform to OpenSocial. This is
due to three reasons 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
There is no alternative to the&amp;nbsp;&lt;a href="http://developer.facebook.com/anatomy.php"&gt;deep
integration into the Web site's user experience&lt;/a&gt; that is facilitated with &lt;a href="http://wiki.developers.facebook.com/index.php/FBML"&gt;FBML&lt;/a&gt;.&amp;nbsp;&amp;nbsp; 
&lt;/li&gt;
&lt;li&gt;
I prefer idiomatic XML to tunnelling&amp;nbsp;data through Atom feeds in ways that [in
my opinion] add&amp;nbsp;unnecessary cruft. 
&lt;/li&gt;
&lt;li&gt;
The Facebook APIs encourage developers to build social and item relationship graphs
within their application while the OpenSocial seems only concerned with developers
stuffing data in key/value pairs. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;The Javascript API
&lt;/h4&gt;
&lt;p&gt;
At first I assumed the &lt;a href="http://code.google.com/apis/opensocial/docs/javascript/reference/"&gt;OpenSocial
JavaScript API&lt;/a&gt; would provide similar functionality to&amp;nbsp;&lt;a href="http://wiki.developers.facebook.com/index.php/FBML"&gt;FBML&lt;/a&gt;&amp;nbsp;given
the large number of sound bites quoting Google employees stating that instead of "proprietary
markup" you could use "standard JavaScript" to build &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;&amp;nbsp;applications.
However it seems the JavaScript API is simply a wrapper on top of the various REST
APIs. I'm sure there's some comment one could make&amp;nbsp;questioning if REST APIs are
so simple why do developers feel the need to hide them behind object models? 
&lt;/p&gt;
&lt;p&gt;
Given the varying features and user interface choices in social networking sites,
it is unsurprising that there is no rich mechanism specified for adding entry points
to the application into the container sites user interface. However it is surprising
that &lt;em&gt;no user interface hooks are specified&lt;/em&gt; at all.&amp;nbsp;This is surprising
given&amp;nbsp;that there are some common metaphors in social networking sites (e.g. a
profile page, a friends list, etc)&amp;nbsp;which can be interacted with in a standard
way. &amp;nbsp;It is also shocking that Google attacked Facebook's use of "proprietary
markup" only to not even ship an equivalent feature. 
&lt;/p&gt;
&lt;h4&gt;The People and Friends Data API&amp;nbsp;
&lt;/h4&gt;
&lt;p&gt;
The &lt;a href="http://code.google.com/apis/opensocial/docs/gdata/people/reference.html"&gt;People
and Friends Data API&lt;/a&gt; is used to retrieve information about a user or the user's&amp;nbsp;friends
as an Atom feed. Each user is represented as an &lt;code&gt;atom:entry&lt;/code&gt; which is a &lt;a href="http://code.google.com/apis/opensocial/docs/gdata/people/reference.html#Elements"&gt;PersonKind&lt;/a&gt; (which
should not be confused with an &lt;a href="http://tools.ietf.org/html/rfc4287#section-3.2"&gt;Atom
person construct&lt;/a&gt;). It is expected that the URL structure for accessing people
and friends feeds will be of the form&amp;nbsp; &lt;code&gt;http://&amp;lt;domain&amp;gt;/feeds/people/&amp;lt;userid&amp;gt;&lt;/code&gt; and &lt;code&gt;http://&amp;lt;domain&amp;gt;/feeds/people/&amp;lt;userid&amp;gt;/friends&lt;/code&gt; respectively. 
&lt;/p&gt;
&lt;p&gt;
Compare the following response to a request&amp;nbsp;for a user's information using OpenSocial
with the equivalent Facebook API call response.
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;GET http://orkut.com/feeds/people/14358878523263729569&lt;/pre&gt;&lt;pre&gt;&amp;lt;entry xmlns='http://www.w3.org/2005/Atom' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005'&amp;gt;&lt;br&gt;
&amp;lt;id&amp;gt;http://sandbox.orkut.com:80/feeds/people/14358878523263729569&amp;lt;/id&amp;gt;&lt;br&gt;
&amp;lt;updated&amp;gt;2007-10-28T14:01:29.948-07:00&amp;lt;/updated&amp;gt;&lt;br&gt;
&amp;lt;title&amp;gt;Elizabeth Bennet&amp;lt;/title&amp;gt;&lt;br&gt;
&amp;lt;link rel='thumbnail' type='image/*' href='http://img1.orkut.com/images/small/1193601584/115566312.jpg'/&amp;gt;&lt;br&gt;
&amp;lt;link rel='alternate' type='text/html' href='http://orkut.com/Profile.aspx?uid=17583631990196664929'/&amp;gt;&lt;br&gt;
&amp;lt;link rel='self' type='application/atom+xml' href='http://sandbox.orkut.com:80/feeds/people/14358878523263729569'/&amp;gt;&lt;br&gt;
&amp;lt;georss:where&amp;gt;&lt;br&gt;
&amp;lt;gml:Point xmlns:gml='http://www.opengis.net/gml'&amp;gt;&lt;br&gt;
&amp;lt;gml:pos&amp;gt;51.668674 -0.066235&amp;lt;/gml:pos&amp;gt;&lt;br&gt;
&amp;lt;/gml:Point&amp;gt;&lt;br&gt;
&amp;lt;/georss:where&amp;gt;&lt;br&gt;
&amp;lt;gd:extendedProperty name='lang' value='en-US'/&amp;gt;&lt;br&gt;
&amp;lt;gd:postalAddress/&amp;gt;&lt;br&gt;
&amp;lt;/entry&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt; 
&lt;p&gt;
Below is the what the above information would look like if returned by Facebook's &lt;a href="http://developer.facebook.com/documentation.php?v=1.0&amp;amp;method=users.getInfo"&gt;users.getInfo&lt;/a&gt; method
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
GET 
&lt;/p&gt;
&lt;pre&gt;&amp;lt;users_getInfo_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd" list="true"&amp;gt;&lt;br&gt;
&amp;lt;user&amp;gt;&lt;br&gt;
&amp;lt;uid&amp;gt;14358878523263729569&amp;lt;/uid&amp;gt;&lt;br&gt;
&amp;lt;current_location&amp;gt;&lt;br&gt;
&amp;lt;city&amp;gt;Palo Alto&amp;lt;/city&amp;gt;&lt;br&gt;
&amp;lt;state&amp;gt;CA&amp;lt;/state&amp;gt;&lt;br&gt;
&amp;lt;country&amp;gt;United States&amp;lt;/country&amp;gt;&lt;br&gt;
&amp;lt;zip&amp;gt;94303&amp;lt;/zip&amp;gt;&lt;br&gt;
&amp;lt;/current_location&amp;gt;&lt;br&gt;
&amp;lt;first_name&amp;gt;Elizabeth&amp;lt;/first_name&amp;gt;&lt;br&gt;
&amp;lt;is_app_user&amp;gt;1&amp;lt;/is_app_user&amp;gt;&lt;br&gt;
&amp;lt;has_added_app&amp;gt;1&amp;lt;/has_added_app&amp;gt;&lt;br&gt;
&amp;lt;pic&amp;gt;http://photos-055.facebook.com/ip007/profile3/1271/65/s8055_39735.jpg&amp;lt;/pic&amp;gt;&lt;br&gt;
&amp;lt;/user&amp;gt;&lt;br&gt;
&amp;lt;/users_getInfo_response&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt; 
&lt;p&gt;
I've already mentioned that I prefer idiomatic XML to tunnelling data through Atom
feeds. Comparing the readability of both examples should explain why. 
&lt;/p&gt;
&lt;h4&gt;The&amp;nbsp;Activities Data API&amp;nbsp;
&lt;/h4&gt;
&lt;p&gt;
A number of social networking sites now provide a feature which enables users to see
the recent activities of members of their social network in an activity stream. The &lt;a href="http://www.facebook.com/sitetour/homepage.php"&gt;Facebook
news feed&lt;/a&gt;, &lt;a href="http://en.blog.orkut.com/2007/09/whats-new-with-your-orkut-friends.html"&gt;Orkut's
updates from your friends&lt;/a&gt;, and the &lt;a href="http://robdolin.spaces.live.com/blog/cns%213C8CA60F8F925FEC%21884.entry"&gt;Windows
Live Spaces what's new page&lt;/a&gt; are all examples of this feature. The &lt;a href="http://code.google.com/apis/opensocial/docs/gdata/activities/developers_guide_protocol.html"&gt;OpenSocial
Activities Data API&lt;/a&gt; provides a mechanism for OpenSocial applications to access
and update this activity stream as an Atom feed. All of the users activities or all
activities from a specific application can be accessed using&amp;nbsp;URIs of the form&amp;nbsp; &lt;code&gt;http://&amp;lt;domain&amp;gt;/activities/feeds/activities/user/&amp;lt;userID&amp;gt;&lt;/code&gt; and &lt;code&gt;&lt;code&gt;http://&amp;lt;domain&amp;gt;/activities/feeds/activities/user/&amp;lt;userID&amp;gt;/source/&amp;lt;sourceID&amp;gt;&lt;/code&gt;&lt;/code&gt; respectively.&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Currently there is no reference documentation on this API. My assumption is that since
Orkut is the only OpenSocial site that supports this feature, it is difficult to produce
a spec that will work for other services without it being a verbatim description of
Orkut's implementation. 
&lt;/p&gt;
&lt;p&gt;
There are some notes on how Orkut attempts to prevents applications from spamming&amp;nbsp;a
user's activity stream. For one, applications are only allowed to update the activity
stream for their source directly instead of the activity stream for the user. I assume
that Google applies some filter to the union of all the source specific activity streams
before generating the user's activity feed to eliminate spam. Secondly, applications
are monitored to see if they post too many messages to the activity stream or if they
post promotional messages instead of the user's activities to the stream. All of this
makes it seem difficult to see how one could specify the behavior of this API and
feature set reliably for a diverse set of social networking sites. 
&lt;/p&gt;
&lt;h4&gt;The Persistence Data API&amp;nbsp;
&lt;/h4&gt;
&lt;p&gt;
The &lt;a href="http://code.google.com/apis/opensocial/docs/gdata/persistence/reference.html"&gt;OpenSocial
Persistence API&lt;/a&gt;&amp;nbsp;allows applications to store and retrieve key&amp;lt;-&amp;gt;value
pairs that are either user-specific or are global to the application. An example of
the former is a listing of&amp;nbsp;company&amp;nbsp;name&amp;nbsp;and&amp;nbsp;stock ticker&amp;nbsp;pairs
while an example of the latter is a user's stock portfolio. The feed of global key&amp;lt;-&amp;gt;value
pairs for an application can be accessed at a URL of the form&amp;nbsp;&lt;code&gt;http://&amp;lt;domain&amp;gt;/feeds/apps/&lt;em&gt;&amp;lt;appID&amp;gt;&lt;/em&gt;/persistence/global&lt;/code&gt; for
the entire feed and &lt;code&gt;http://&amp;lt;domain&amp;gt;/feeds/apps/&lt;em&gt;&amp;lt;appID&amp;gt;&lt;/em&gt;/persistence/global/&amp;lt;key&amp;gt;&lt;/code&gt; if
seeking a particular key&amp;lt;-&amp;gt;value pair. User-specific key&amp;lt;-&amp;gt;value pairs
are available at the URL of the form &lt;code&gt;http://&amp;lt;domain&amp;gt;/feeds/apps/&lt;em&gt;&amp;lt;appID&amp;gt;&lt;/em&gt;/persistence/&amp;lt;userID&amp;gt;/instance/&amp;lt;instanceID&amp;gt;&lt;/code&gt;. 
&lt;/p&gt;
&lt;p&gt;
This is probably the least interesting aspect of the API. A simple persistence API
like this is useful for applications with simple storage needs that need to store
user preferences or simple&amp;nbsp;textual data that is needed by the application. However
you aren't going to use this as the data storage platform for applications like &lt;a href="http://apps.facebook.com/ilike"&gt;iLike&lt;/a&gt;, &lt;a href="http://apps.facebook.com/flixster/"&gt;Flixster&lt;/a&gt; or &lt;a href="http://apps.facebook.com/scrabulous"&gt;Scrabulous&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
However I will add that an Atom feed seems like a horrible representation for a list
of key&amp;lt;-&amp;gt;value pairs. It's so bad that the documentation doesn't provide an
example of such a feed. 
&lt;/p&gt;
&lt;h4&gt;Hosting OpenSocial Applications
&lt;/h4&gt;
&lt;p&gt;
The &lt;a href="http://code.google.com/apis/opensocial/container.html"&gt;documentation
on hosting OpenSocial applications&lt;/a&gt; implies that any site that can host Google
gadgets can also host OpenSocial applications. In practice, it means that any site
that you can place a &amp;lt;script&amp;gt; element on can point to a gadget and thus&amp;nbsp;render
it. Whether the application will actually work will depend on whether the hosting
service has actually implemented the OpenSocial Service Provider Interface (SPI). 
&lt;/p&gt;
&lt;p&gt;
Unfortunately, the documentation on implementing the OpenSocial SPI is missing in
action. From the Google site 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;To host OpenSocial apps, your website must support the SPI side of the OpenSocial
APIs. Usually your SPI will connect to your own social network, so that an OpenSocial
app added to your website automatically uses your site's data. However, it is possible
to use data from another social network as well, should you prefer. Soon, we will
provide a development kit with documentation and code to better support OpenSocial
websites, along with a sample sandbox which implements the OpenSocial SPI using in-memory
storage. The SPI implements: &lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Adding and removing friends &lt;/em&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Adding and removing apps &lt;/em&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Storing activities &lt;/em&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Retrieving activity streams for self and friends &lt;/em&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Storing and retrieving per-app and per-app-per-user data &lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;em&gt;The OpenSocial website development kit will include full SPI documentation. It
will provide open source reference implementations for both client and server components.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I assume that the meat of the OpenSocial&amp;nbsp;SPI is documentation is just more detailed
rules about how to implement the REST APIs described above. The interesting bits will
likely be the reference implementations of the API which will likely become the de
facto standard implementations instead of&amp;nbsp;encouraging dozens of&amp;nbsp;buggy incompatible
versions of the OpenSocial API to bloom.&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;h4&gt;Conclusion
&lt;/h4&gt;
&lt;p&gt;
In general I believe that any effort to standardize the widget/gadget APIs exposed
by various social networking sites and AJAX homepages (e.g. iGoogle, Netvibes, Live.com,
etc) is a good thing. Niall Kennedy has an excellent series of articles on &lt;a href="http://www.niallkennedy.com/blog/archives/2007/07/web-widget-formats.html"&gt;Web
Widget formats&lt;/a&gt;&amp;nbsp;and &lt;a href="http://www.niallkennedy.com/blog/archives/2007/07/widget-data-formats.html"&gt;Web
Widget update technologies&lt;/a&gt; that shows how diverse and disparate the&amp;nbsp;technologies
that developers have to learn and utilize when&amp;nbsp;they want to build widgets for
various sites. Given that Web widgets are now a known quantity, the time is ripe for
some standardization. 
&lt;/p&gt;
&lt;p&gt;
That said, there are a number of things that give me cause to pause with&amp;nbsp;regards
to&amp;nbsp;&lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt; 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
A common practice in the software industry today is to prefix "Open" to the name of
your technology which automatically gives it an aura of goodness while attempting
to paint competing technologies as being evil and "closed". Examples include OpenDocument,
OpenID, OpenXML, OAuth, etc. In this case, &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt; is
being positioned as an "open" alternative to the &lt;a href="http://developer.facebook.com"&gt;Facebook
platform&lt;/a&gt;. &amp;nbsp;However as bloggers like Shelley Powers, Danny Ayers and Russell
Beattie have pointed out, there isn't much "open" about &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;.
Russell Beattie asks in his post &lt;a href="http://www.russellbeattie.com/blog/where-the-hell-is-the-container-api"&gt;Where
the hell is the Container API?&lt;/a&gt; 
&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;Would people be jumping on this bandwagon so readily if it was Microsoft
unilaterally coming up with an API, holding secret meetings geared towards undercutting
the market leader, and then making sure that only those anointed partners get a head
start on launch day by making sure a key part of the API isn't released - even in
alpha. (It obviously exists already, all the partners have that spec and even sample
code, I'm sure. The rest of us don't get access yet, until the GOOG says otherwise).&lt;/em&gt;&lt;/blockquote&gt; 
&lt;p&gt;
Let's say we ignore that the process for creating the technology was not "open" nor
have key aspects of the technology even been unveiled [which makes this more of a
FUD announcement to take the wind out of Facebook's sails than an actual technology
announcement], is the technology itself open? Shelley Powers points out her post &lt;a href="http://burningbird.net/technology/terms/"&gt;Terms&lt;/a&gt; that
&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;Perhaps the world will read the terms of use of the API, and realize &lt;font color="#ff0000"&gt;this
is not an open API; this is a free API, owned and controlled by one company only:
Google&lt;/font&gt;. Hopefully, the world will remember another time when Google offered
a free API and then pulled it. Maybe the world will also take a deeper look and realize
that the functionality is dependent on Google hosted technology, which has its own
terms of service (including adding ads at the discretion of Google), and that building
an OpenSocial application ties Google into your application, and Google into every
social networking site that buys into the Dream.&lt;/em&gt; &lt;/blockquote&gt; 
&lt;p&gt;
Google has announced a technology platform that is every bit as proprietary as Facebook's.
The only difference is that they've cut deals with some companies to utilize their
proprietary platform while Facebook's platform is only for use on &lt;a href="http://www.facebook.com/"&gt;the
Facebook site&lt;/a&gt;. &lt;span style="background-color: yellow;"&gt;If Zuckerburg &lt;a href="http://www.techcrunch.com/2007/11/02/ok-heres-at-least-part-of-what-facebook-is-announcing-on-tuesday/"&gt;announces
next week&lt;/a&gt; that the Facebook platform is freely implementable by any 3rd party
Web site, where does that leave &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;?&lt;/span&gt; After
all, the&amp;nbsp;&lt;a href="http://developer.facebook.com"&gt;Facebook platform&lt;/a&gt; is actually
a proven, working system with complete documentation instead of the incomplete rush
job that &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;&amp;nbsp;clearly
is right now. 
&lt;/p&gt;
&lt;p&gt;
There are all sorts of forums for proposing and discussing &lt;b&gt;open&lt;/b&gt; Web technologies
including the IETF, W3C, OASIS and even ECMA. Until all of the underlying technologies
in&lt;a href="http://code.google.com/apis/opensocial/"&gt;&amp;nbsp;OpenSocial&lt;/a&gt;&amp;nbsp;have
been handed over to one or more of these standards bodies, this is a case of the proprietary
pot calling the proprietary kettle black. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
One of the things that comes along with &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;&amp;nbsp;is
that Google has now proposed &lt;a href="http://code.google.com/apis/gdata/"&gt;GData&lt;/a&gt; as
the standard protocol for interacting with social graphs on the Web. This is something
that I've been worried about for a while and I've written a &lt;a href="http://www.25hoursaday.com/weblog/2007/06/09/WhyGDataAPPFailsAsAGeneralPurposeEditingProtocolForTheWeb.aspx"&gt;couple
of&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.25hoursaday.com/weblog/2007/06/11/GDataIsntABestPracticeImplementationOfTheAtomPublishingProtocol.aspx"&gt;blog&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.25hoursaday.com/weblog/2007/10/10/OneProtocolToRuleThemAllAndInTheDarknessBindThem.aspx"&gt;posts&lt;/a&gt; to
address this topic because it is&amp;nbsp;not clear that the Atom Publishing Protocol
upon which GData is based works well outside&amp;nbsp;it's original purpise&amp;nbsp;of editing
blog posts and the like. I'm not the only one that feels this way. 
&lt;/p&gt;
&lt;p&gt;
Danny Ayers wrote in his post &lt;a href="http://dannyayers.com/2007/11/02/open-social"&gt;Open?
Social?&lt;/a&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
However the &lt;a href="http://code.google.com/apis/opensocial/docs/gdata/people/reference.html#Elements"&gt;People
Data API&lt;/a&gt; is cruel and unusual. It first stretches Atom until it creaks with &lt;em&gt;"each
entry in the People or Friends feed is a PersonKind";&lt;/em&gt; then gives a further tug&amp;nbsp;
(a person's name is represented using atom:title) then extends it even more (a person's
email is gd:email) and finally mops up all the blood, sweat and dribble: 
&lt;/p&gt;
&lt;p&gt;
Key value parameters - gd:extendedProperty - "&lt;em&gt;As different social networks and
other sources of People data have many different named fields, this provides a way
for them to be passed on generally. Agreeing on common naming conventions is to be
decided in future.&lt;/em&gt;" 
&lt;/p&gt;
&lt;p&gt;
Got to admire the attempt, but (to mix the metaphorical namespaces) silk purses don't
make very good sow's ears either.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
In addition, AtomPub geek extraordinairre, Tim Bray wrote in his blog post entitled&amp;nbsp;&lt;a href="http://www.tbray.org/ongoing/When/200x/2007/06/17/Web3S#p-2"&gt;Web3S&lt;/a&gt; 
&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;If you decide you totally can’t model your world as collections of
entries populated with hyperlinks to express relationships, well then I guess APP’s
not for you. And at the level of engineering intuition, I have to say that a monster
online address book does feel different at a deep level from most online “publications”
(I thought that was why we had LDAP... but I repeat myself).&lt;/em&gt;&lt;/blockquote&gt; 
&lt;p&gt;
Now that we have AtomPub/GData as a de facto standard protocol for accessing various
kinds of non-microcontent data on the Web as a reality, I'm done debating its suitability
for the task since the horse has already left the barn. However I will continue to
ask &lt;a href="http://www.25hoursaday.com/weblog/2007/11/01/WhenWillGDataBeRFC5023Compliant.aspx"&gt;when
will GData be RFC 5023 compliant&lt;/a&gt;?
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
At the end of the day, the most disappointing thing about &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;&amp;nbsp;is
that it doesn't really further the conversation about actual interoperability across
social networking sites. If I use Orkut, I still need a MySpace account to interact
with my friends on that site. Some people have claimed that &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;&amp;nbsp;will
enable routing around such lock-in via applications like &lt;a href="http://apps.facebook.com/ilike"&gt;iLike&lt;/a&gt; and &lt;a href="http://apps.facebook.com/flixster"&gt;Flixster&lt;/a&gt; which
have their own social networks and thus could build cross-site social networking services
since they will be hosted on multiple social networking sites. However the tough part
of this problem is how a hosted application knows that &lt;a href="http://carnage4life.spaces.live.com"&gt;carnage4life@windowslivespaces&lt;/a&gt; is
the same user&amp;nbsp;as &lt;a href="http://www.facebook.com/p/Dare_Obasanjo/500050028"&gt;DareObasanjo@Facebook&lt;/a&gt;?
It seems OpenSocial completely punts on satisfying this scenario even though it wouldn't
be hard to add this as a requirement of the system. I guess the various applications
can create their own user account systems and then do the cross-site social network
bridging that way, which sucks because it will be a lot of duplicative work and will
require users to create even more accounts with various services. 
&lt;/p&gt;
&lt;p&gt;
Given that the big widget vendors like &lt;a href="http://ilike.com/"&gt;iLike&lt;/a&gt;, &lt;a href="http://www.slide.com"&gt;Slide&lt;/a&gt;&amp;nbsp;and &lt;a href="http://www.rockyou.com"&gt;RockYou&lt;/a&gt; already
have their users creating accounts on their sites that can be tied back to which social
networking site the user utilizes their widgets&amp;nbsp;on, this might be a moot point.
Wouldn't it be mad cool if the&amp;nbsp;&lt;a href="http://apps.facebook.com/topeight/"&gt;Top
Friends Facebook application&lt;/a&gt; could also show your top friends from &lt;a href="http://www.myspace.com"&gt;MySpace&lt;/a&gt; or &lt;a href="http://www.orkut.com"&gt;Orkut&lt;/a&gt;?
I suspect the valuation of various widget companies will be revised upwards in the
coming months. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
There is no mention of a user-centric application authorization model. Specifically,
there is no discussion of how users grant and revoke permission to access their personal
data to various OpenSocial applications. Regular readers of my blog are familiar with
my mantra of &lt;a href="http://www.25hoursaday.com/weblog/2007/09/02/PutTheUserInControlOtherwiseThingsFallApart.aspx"&gt;putting
the user in control&lt;/a&gt; which is why I've been so enthusiastic about &lt;a href="http://www.25hoursaday.com/weblog/2007/10/06/OAuth10IsHereDelegatedAuthorityComesToMashups.aspx"&gt;OAuth&lt;/a&gt;.
Although there is some mention of &lt;a href="http://code.google.com/apis/accounts/AuthForWebApps.html"&gt;Google's
Authentication for Web Application&lt;/a&gt; in the documentation, this seems specific to
Google's implementation of OpenSocial hosting and it is unclear to me that we should
expect that this is the same model that will be utilized by MySpace, Bebo, TypePad
or any of the other social networking sites that have promised to implement &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;.
On the other hand, Facebook has a well thought out &lt;a href="http://wiki.developers.facebook.com/index.php/Extended_application_permission"&gt;applications
permission model&lt;/a&gt; and I would have thought it would be quite easy to simply reverse
engineer that and add it to the OpenSocial spec than to simply punt on this problem. 
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Despite these misgivings, I think this is a step in the right direction. Web widget
and social graph APIs need to be standardized across the Web. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;PS:&lt;/strong&gt; I've subscribed to the &lt;a href="http://opensocialapis.blogspot.com/"&gt;Google
OpenSocial blog&lt;/a&gt;. So far there have only been posts by clueless marketing types
but I'm sure interesting technical information that addresses some of the points above
will be forthcoming. 
&lt;/p&gt;
&lt;script&gt;
digg_url = 'http://digg.com/tech_news/Google_OpenSocial_Technical_Overview_and_Critique';
&lt;/script&gt;
&lt;script src="http://digg.com/api/diggthis.js"&gt;&lt;/script&gt;&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=98477176-3d0b-4e35-a808-d05a7c725005" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,98477176-3d0b-4e35-a808-d05a7c725005.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
      <category>Syndication Technology</category>
      <category>XML Web Services</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=3959ba9f-cac2-411f-b6fa-b46a119665cc</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,3959ba9f-cac2-411f-b6fa-b46a119665cc.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,3959ba9f-cac2-411f-b6fa-b46a119665cc.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=3959ba9f-cac2-411f-b6fa-b46a119665cc</wfw:commentRss>
      <slash:comments>12</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
In a post entitled <a href="http://www.techcrunch.com/2007/11/01/confirmed-myspace-to-join-google-opensocial/">Checkmate?
MySpace, Bebo and SixApart To Join Google OpenSocial (confirmed)</a> Mike Arrington
writes 
</p>
        <blockquote dir="ltr" style="margin-right: 0px;">
          <p>
            <em>
              <font color="#ff0000">Google may have just come out of nowhere and checkmated
Facebook in the social networking power struggle.</font>
            </em>
          </p>
          <p>
…
</p>
          <p>
            <em>
              <strong>Update (12:30 PST): </strong>On a press call with Google now. This was
embargoed for 5:30 pm PST but they’ve moved the time up to 12:30 PST (now). Press
release will go out later this evening. My notes:</em>
          </p>
          <p>
            <em>On the call, Google CEO Eric Schmidt said “we’ve been working with MySpace for
more than a year in secret on this” (likely corresponding to their </em>
            <a href="http://www.techcrunch.com/2006/08/07/google-pegged-to-search-myspace/">
              <em>advertising
deal </em>
            </a>
            <em>announced a year ago).</em>
          </p>
          <p>
            <em>MySpace says their </em>
            <a href="http://www.techcrunch.com/2007/10/17/counterstrike-murdoch-dewolfe-annouce-myspace-platform-and-new-privacy-controls/">
              <em>new
platform efforts</em>
            </a>
            <em> will be entirely focused on OpenSocial.</em>
          </p>
          <p>
            <em>The press release names Engage.com, Friendster, hi5, Hyves, imeem, LinkedIn, Ning,
Oracle, orkut, Plaxo, Salesforce.com, Six Apart, Tianji, Viadeo, and XING as current
OpenSocial partners.</em>
          </p>
          <p>
            <em>We’re seeing a Flixster application on MySpace now through the OpenSocial APIs.
Flixster says it took them less than a day to create this. I’ll add screen shots below.</em>
          </p>
          <p>
            <em>Here’s the big question - <strong>Will Facebook now be forced to join OpenSocial?</strong> Google
says they are talking to “everyone.” This is a major strategic decision for Facebook,
and they may have little choice but to join this coalition.</em>
          </p>
          <p>
            <em>Bebo has also joined OpenSocial.</em>
          </p>
        </blockquote>
        <p>
I'm confused as to how Mike Arrington considers this a <i>checkmate</i> by Google.
At the end of the day, this announcement is simply that folks like <a href="http://www.slide.com/">Slide</a> and <a href="http://www.rockyou.com/">RockYou</a> don't
have to maintain multiple code bases for their widgets on various popular social networking
sites. In addition, it brings the widget/gadget platform on these sites to a similar
level to the <a href="http://developer.facebook.com/">Facebook platform</a>. Of course,
it won’t be on the same level unless it meets all the criteria from my post on <a href="http://www.25hoursaday.com/weblog/2007/10/18/SocialNetworkingSitePlatformsHowDevelopersShouldEvaluateTheMySpacePlatformAndOthers.aspx">how
developers should evaluate the MySpace platform</a>. Which is unlikely since besides <a href="http://www.myspace.com/">MySpace</a><a href="http://www.myspace.com/"></a>,
none of those sites have the userbase or engagement of <a href="http://www.facebook.com/">Facebook</a> users
nor does any of them have the same kind of <a href="http://www.allfacebook.com/2007/07/the-top-5-viral-facebook-techniques/">viral
properties in distributing applications that Facebook platform has built-in</a>. 
</p>
        <p>
At the end of the day, will we see widget developers like the folks at <a href="http://www.ilike.com/">iLike</a>, <a href="http://www.slide.com/">Slide</a> or <a href="http://www.scrabulous.com/">Scrabulous</a> leave
the <a href="http://developer.facebook.com/">Facebook platform</a> because of
these announcements? Unlikely. 
</p>
        <p>
Will we see a mass migration from <a href="http://www.facebook.com/">Facebook</a> to <a href="http://www.myspace.com/">MySpace</a> or <a href="http://www.orkut.com/">Orkut</a> because
you can now add <a href="http://apps.facebook.com/flixster/">Flixster</a> or <a href="http://apps.facebook.com/scrabulous/">Scrabulous</a> to
your profile on these sites? Probably not. 
</p>
        <p>
So how is this a checkmate again? 
</p>
        <p>
OpenSocial simply keeps <a href="http://www.facebook.com/">Facebook</a>’s competitors
in the game. It is more like a successful <a href="http://en.wikipedia.org/wiki/Castling">kingside
castle</a> than a <a href="http://en.wikipedia.org/wiki/Checkmate">checkmate</a>. 
</p>
        <script>
digg_url = 'http://digg.com/tech_deals/Dare_Obasanjo_aka_Carnage4Life_Some_Thoughts_on_MySpace_Bebo_and_SixApar';
</script>
        <script src="http://digg.com/api/diggthis.js">
        </script>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Backstreet%20Boys">Backstreet
Boys</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Incomplete&amp;artistTerm=Backstreet%20Boys">Incomplete</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=3959ba9f-cac2-411f-b6fa-b46a119665cc" />
      </body>
      <title>Some Thoughts on MySpace, Bebo and SixApart adopting OpenSocial</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,3959ba9f-cac2-411f-b6fa-b46a119665cc.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/11/02/SomeThoughtsOnMySpaceBeboAndSixApartAdoptingOpenSocial.aspx</link>
      <pubDate>Fri, 02 Nov 2007 03:00:01 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
In a post entitled&amp;nbsp;&lt;a href="http://www.techcrunch.com/2007/11/01/confirmed-myspace-to-join-google-opensocial/"&gt;Checkmate?
MySpace, Bebo and SixApart To Join Google OpenSocial (confirmed)&lt;/a&gt;&amp;nbsp;Mike Arrington
writes 
&lt;/p&gt;
&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; 
&lt;p&gt;
&lt;em&gt;&lt;font color="#ff0000"&gt;Google may have just come out of nowhere and checkmated
Facebook in the social networking power struggle.&lt;/font&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
…
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;Update (12:30 PST): &lt;/strong&gt;On a press call with Google now. This was
embargoed for 5:30 pm PST but they’ve moved the time up to 12:30 PST (now). Press
release will go out later this evening. My notes:&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;On the call, Google CEO Eric Schmidt said “we’ve been working with MySpace for
more than a year in secret on this” (likely corresponding to their &lt;/em&gt;&lt;a href="http://www.techcrunch.com/2006/08/07/google-pegged-to-search-myspace/"&gt;&lt;em&gt;advertising
deal &lt;/em&gt;&lt;/a&gt;&lt;em&gt;announced a year ago).&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;MySpace says their &lt;/em&gt;&lt;a href="http://www.techcrunch.com/2007/10/17/counterstrike-murdoch-dewolfe-annouce-myspace-platform-and-new-privacy-controls/"&gt;&lt;em&gt;new
platform efforts&lt;/em&gt;&lt;/a&gt;&lt;em&gt; will be entirely focused on OpenSocial.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The press release names Engage.com, Friendster, hi5, Hyves, imeem, LinkedIn, Ning,
Oracle, orkut, Plaxo, Salesforce.com, Six Apart, Tianji, Viadeo, and XING as current
OpenSocial partners.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;We’re seeing a Flixster application on MySpace now through the OpenSocial APIs.
Flixster says it took them less than a day to create this. I’ll add screen shots below.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Here’s the big question - &lt;strong&gt;Will Facebook now be forced to join OpenSocial?&lt;/strong&gt; Google
says they are talking to “everyone.” This is a major strategic decision for Facebook,
and they may have little choice but to join this coalition.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Bebo has also joined OpenSocial.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I'm confused as to how Mike Arrington considers this a &lt;i&gt;checkmate&lt;/i&gt; by Google.
At the end of the day, this announcement is simply that folks like &lt;a href="http://www.slide.com/"&gt;Slide&lt;/a&gt; and &lt;a href="http://www.rockyou.com/"&gt;RockYou&lt;/a&gt; don't
have to maintain multiple code bases for their widgets on various popular social networking
sites. In addition, it brings the widget/gadget platform on these sites to a similar
level to the &lt;a href="http://developer.facebook.com/"&gt;Facebook platform&lt;/a&gt;. Of course,
it won’t be on the same level unless it meets all the criteria from my post on &lt;a href="http://www.25hoursaday.com/weblog/2007/10/18/SocialNetworkingSitePlatformsHowDevelopersShouldEvaluateTheMySpacePlatformAndOthers.aspx"&gt;how
developers should evaluate the MySpace platform&lt;/a&gt;. Which is unlikely since besides &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;&lt;a href="http://www.myspace.com/"&gt;&lt;/a&gt;,
none of those sites have the userbase or engagement of &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; users
nor does any of them have the same kind of &lt;a href="http://www.allfacebook.com/2007/07/the-top-5-viral-facebook-techniques/"&gt;viral
properties in distributing applications that Facebook platform has built-in&lt;/a&gt;.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
At the end of the day, will we see widget developers like the folks at &lt;a href="http://www.ilike.com/"&gt;iLike&lt;/a&gt;, &lt;a href="http://www.slide.com/"&gt;Slide&lt;/a&gt;&amp;nbsp;or &lt;a href="http://www.scrabulous.com/"&gt;Scrabulous&lt;/a&gt;&amp;nbsp;leave
the &lt;a href="http://developer.facebook.com/"&gt;Facebook platform&lt;/a&gt;&amp;nbsp;because of
these announcements? Unlikely. 
&lt;/p&gt;
&lt;p&gt;
Will we see a mass migration from &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; to &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt; or &lt;a href="http://www.orkut.com/"&gt;Orkut&lt;/a&gt; because
you can now add &lt;a href="http://apps.facebook.com/flixster/"&gt;Flixster&lt;/a&gt; or &lt;a href="http://apps.facebook.com/scrabulous/"&gt;Scrabulous&lt;/a&gt;&amp;nbsp;to
your profile on these sites? Probably not. 
&lt;/p&gt;
&lt;p&gt;
So how is this a checkmate again? 
&lt;/p&gt;
&lt;p&gt;
OpenSocial simply keeps &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;’s competitors
in the game. It is more like a successful &lt;a href="http://en.wikipedia.org/wiki/Castling"&gt;kingside
castle&lt;/a&gt; than a &lt;a href="http://en.wikipedia.org/wiki/Checkmate"&gt;checkmate&lt;/a&gt;. 
&lt;/p&gt;
&lt;script&gt;
digg_url = 'http://digg.com/tech_deals/Dare_Obasanjo_aka_Carnage4Life_Some_Thoughts_on_MySpace_Bebo_and_SixApar';
&lt;/script&gt;
&lt;script src="http://digg.com/api/diggthis.js"&gt;&lt;/script&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Backstreet%20Boys"&gt;Backstreet
Boys&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Incomplete&amp;amp;artistTerm=Backstreet%20Boys"&gt;Incomplete&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=3959ba9f-cac2-411f-b6fa-b46a119665cc" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,3959ba9f-cac2-411f-b6fa-b46a119665cc.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
      <category>Windows Live</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=8e32242a-3480-4dce-b9bd-3181b2cde324</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,8e32242a-3480-4dce-b9bd-3181b2cde324.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,8e32242a-3480-4dce-b9bd-3181b2cde324.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=8e32242a-3480-4dce-b9bd-3181b2cde324</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
There’s nothing like a successful company with a near monopoly to force the software
industry to come up with standards. Or in this case, <a href="http://en.wikipedia.org/wiki/OpenDocument">as
in many others</a>, force it’s competitors to band together and call what they are
doing the standard because more than one vendor supports it. 
</p>
        <p>
From TechCrunch’s article <a href="http://www.techcrunch.com/2007/10/30/details-revealed-google-opensocial-to-be-common-apis-for-building-social-apps/">Details
Revealed: Google </a><a href="http://code.google.com/apis/opensocial">OpenSocial</a><a href="http://www.techcrunch.com/2007/10/30/details-revealed-google-opensocial-to-be-common-apis-for-building-social-apps/">(To
Launch Thursday</a><a href="http://www.techcrunch.com/2007/10/30/details-revealed-google-opensocial-to-be-common-apis-for-building-social-apps/"></a> we
learn 
</p>
        <blockquote dir="ltr" style="margin-right: 0px;">
          <p>
            <em>Google wants to create an easy way for developers to create an application that
works on all social networks. And if they pull it off, they’ll be in the center, controlling
the network. </em>
          </p>
          <p>
            <big>
              <strong>
                <font size="4">
                  <em>What They’re Launching</em>
                </font>
              </strong>
            </big>
          </p>
          <p>
            <em>OpenSocial is a set of three common APIs, defined by Google with input from partners,
that allow developers to access core functions and information at social networks:</em>
          </p>
          <ul>
            <li>
              <em>Profile Information (user data)</em>
            </li>
            <li>
              <em>Friends Information (social graph)</em>
            </li>
            <li>
              <em>Activities (things that happen, News Feed type stuff)</em>
            </li>
          </ul>
          <p>
            <em>Hosts agree to accept the API calls and return appropriate data. Google won’t
try to provide universal API coverage for special use cases, instead focusing on the
most common uses. Specialized functions/data can be accessed from the hosts directly
via their own APIs.</em>
          </p>
          <p>
            <em>Unlike Facebook, OpenSocial does not have its own markup language (Facebook requires
use of FBML for security reasons, but it also makes code unusable outside of Facebook).
Instead, developers use normal javascript and html (and can embed Flash elements).
The benefit of the Google approach is that developers can use much of their existing
front end code and simply tailor it slightly for OpenSocial, so creating applications
is even easier than on Facebook.</em>
          </p>
        </blockquote>
        <p>
Similar details are available from folks like <a href="http://gigaom.com/2007/10/30/opensocial/">Om
Malik</a> and <a href="http://blog.pmarca.com/2007/10/open-social-a-n.html">Marc
Andreesen</a>.  
</p>
        <p>
This is a brilliant move. I’ve blogged on multiple occassions that the disparate widget
platforms in social networking sites is a burden for widget developers and will lead
to a “winner takes all” situation because no one wants to support umpteen different
platforms. If enough momentum gains around <a href="http://code.google.com/apis/opensocial">OpenSocial</a>,
then three things will happen 
</p>
        <ul>
          <li>
Widget developers will start to favor coding to OpenSocial because it supports multiple
sites as well as targeting the <a href="http://developer.facebook.com/">Facebook platform</a>  </li>
          <li>
Eventually <a href="http://developer.facebook.com/">Facebook platform</a> developers
will start asking Zuckerburg and company to support <a href="http://code.google.com/apis/opensocial">OpenSocial</a> so
they only need to worry about one code base (kinda, it won’t be that easy)  </li>
          <li>
Other companies with proprietary widget platforms or plans to create one will bow
down to the tide and adopt <a href="http://code.google.com/apis/opensocial">OpenSocial</a></li>
        </ul>
        <p>
Of course, this requires a popular social networking site with a wide audience (e.g. <a href="http://www.myspace.com/">MySpace</a>) to
adopt the platform before we see this kind of traction. 
</p>
        <p>
However this is the only thing Google could have done that makes any sense. Building <a href="http://www.profy.com/2007/10/06/tagged-to-copy-facebook-platform-for-its-own-developer-offering/">a
clone of the Facebook platform</a> like some social networking sites planned would
have been dumb because that would be the tail wagging the dog. Similarly building
a competing proprietary platform would also have been dumb due to the <em>winner takes
all</em> problem I mentioned earlier. 
</p>
        <p>
This is the only move that has a chance of actually giving their anti-Facebook platform
a chance of being successful. 
</p>
        <p>
I wonder how my coworkers in Windows Live are going to take this news? 
</p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=50%20Cent">50
Cent</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=All%20Of%20Me%20%28Feat.%20Mary%20J%20Blige%29%20%28Prod%20by%20Jake%20One%29&amp;artistTerm=50%20Cent">All
Of Me (Feat. Mary J Blige) (Prod by Jake One)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=8e32242a-3480-4dce-b9bd-3181b2cde324" />
      </body>
      <title>OpenSocial: Google Proposes Widget &amp; RESTful API Standards for Social Networking Sites</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,8e32242a-3480-4dce-b9bd-3181b2cde324.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/10/31/OpenSocialGoogleProposesWidgetRESTfulAPIStandardsForSocialNetworkingSites.aspx</link>
      <pubDate>Wed, 31 Oct 2007 14:39:45 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
There’s nothing like a successful company with a near monopoly to force the software
industry to come up with standards. Or in this case, &lt;a href="http://en.wikipedia.org/wiki/OpenDocument"&gt;as
in many others&lt;/a&gt;, force it’s competitors to band together and call what they are
doing the standard because more than one vendor supports it. 
&lt;/p&gt;
&lt;p&gt;
From TechCrunch’s article &lt;a href="http://www.techcrunch.com/2007/10/30/details-revealed-google-opensocial-to-be-common-apis-for-building-social-apps/"&gt;Details
Revealed: Google &lt;/a&gt;&lt;a href="http://code.google.com/apis/opensocial"&gt;OpenSocial&lt;/a&gt;&lt;a href="http://www.techcrunch.com/2007/10/30/details-revealed-google-opensocial-to-be-common-apis-for-building-social-apps/"&gt;(To
Launch Thursday&lt;/a&gt;&lt;a href="http://www.techcrunch.com/2007/10/30/details-revealed-google-opensocial-to-be-common-apis-for-building-social-apps/"&gt;&lt;/a&gt;&amp;nbsp;we
learn 
&lt;/p&gt;
&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; 
&lt;p&gt;
&lt;em&gt;Google wants to create an easy way for developers to create an application that
works on all social networks. And if they pull it off, they’ll be in the center, controlling
the network. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;big&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;em&gt;What They’re Launching&lt;/em&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/big&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;OpenSocial is a set of three common APIs, defined by Google with input from partners,
that allow developers to access core functions and information at social networks:&lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Profile Information (user data)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Friends Information (social graph)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Activities (things that happen, News Feed type stuff)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;em&gt;Hosts agree to accept the API calls and return appropriate data. Google won’t
try to provide universal API coverage for special use cases, instead focusing on the
most common uses. Specialized functions/data can be accessed from the hosts directly
via their own APIs.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Unlike Facebook, OpenSocial does not have its own markup language (Facebook requires
use of FBML for security reasons, but it also makes code unusable outside of Facebook).
Instead, developers use normal javascript and html (and can embed Flash elements).
The benefit of the Google approach is that developers can use much of their existing
front end code and simply tailor it slightly for OpenSocial, so creating applications
is even easier than on Facebook.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Similar details are available from folks like&amp;nbsp;&lt;a href="http://gigaom.com/2007/10/30/opensocial/"&gt;Om
Malik&lt;/a&gt;&amp;nbsp;and &lt;a href="http://blog.pmarca.com/2007/10/open-social-a-n.html"&gt;Marc
Andreesen&lt;/a&gt;.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
This is a brilliant move. I’ve blogged on multiple occassions that the disparate widget
platforms in social networking sites is a burden for widget developers and will lead
to a “winner takes all” situation because no one wants to support umpteen different
platforms. If enough momentum gains around &lt;a href="http://code.google.com/apis/opensocial"&gt;OpenSocial&lt;/a&gt;,
then three things will happen 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Widget developers will start to favor coding to OpenSocial because it supports multiple
sites as well as targeting the &lt;a href="http://developer.facebook.com/"&gt;Facebook platform&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;
Eventually &lt;a href="http://developer.facebook.com/"&gt;Facebook platform&lt;/a&gt; developers
will start asking Zuckerburg and company to support &lt;a href="http://code.google.com/apis/opensocial"&gt;OpenSocial&lt;/a&gt; so
they only need to worry about one code base (kinda, it won’t be that easy) &amp;nbsp;&lt;/li&gt;
&lt;li&gt;
Other companies with proprietary widget platforms or plans to create one will bow
down to the tide and&amp;nbsp;adopt &lt;a href="http://code.google.com/apis/opensocial"&gt;OpenSocial&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Of course, this requires a popular social networking site with a wide audience (e.g. &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;)&amp;nbsp;to
adopt the platform before we see this kind of traction. 
&lt;/p&gt;
&lt;p&gt;
However this is the only thing Google could have done that makes any sense. Building &lt;a href="http://www.profy.com/2007/10/06/tagged-to-copy-facebook-platform-for-its-own-developer-offering/"&gt;a
clone of the Facebook platform&lt;/a&gt; like some social networking sites planned would
have been dumb because that would be the tail wagging the dog. Similarly building
a competing proprietary platform would also have been dumb due to the &lt;em&gt;winner takes
all&lt;/em&gt; problem I mentioned earlier. 
&lt;/p&gt;
&lt;p&gt;
This is the only move that has a chance of actually giving their anti-Facebook platform
a chance of being successful. 
&lt;/p&gt;
&lt;p&gt;
I wonder how my coworkers in Windows Live are going to take this news? 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=50%20Cent"&gt;50
Cent&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=All%20Of%20Me%20%28Feat.%20Mary%20J%20Blige%29%20%28Prod%20by%20Jake%20One%29&amp;amp;artistTerm=50%20Cent"&gt;All
Of Me (Feat. Mary J Blige) (Prod by Jake One)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=8e32242a-3480-4dce-b9bd-3181b2cde324" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,8e32242a-3480-4dce-b9bd-3181b2cde324.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
      <category>Social Software</category>
      <category>Windows Live</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=f4d1a8ff-6a8d-4e5a-ad1c-d834d0d58782</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,f4d1a8ff-6a8d-4e5a-ad1c-d834d0d58782.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,f4d1a8ff-6a8d-4e5a-ad1c-d834d0d58782.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f4d1a8ff-6a8d-4e5a-ad1c-d834d0d58782</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Dave Winer has an interesting post where he asks <a href="http://www.scripting.com/stories/2007/10/25/facebookAppOrFirefoxPlugin.html">Facebook
app or Firefox plug-in?</a> 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
Which is a more interesting platform -- Facebook or Firefox?<br /><br />
This was a topic of conversation at the Web 2.0 Summit last week in SF, not on stage,
but in a <i>LobbyCon</i>versation between myself and venture capitalist <a href="http://flickr.com/photos/scriptingnews/1619505112/"><font color="#355ea0">Bijan
Sabet</font></a>.<br /><br /><a href="http://bijansabet.com/post/17050165"><font color="#355ea0">Bijan Sabet</font></a>:
"I like that Firefox developers don't have to live in a world where they lie awake
at night worried that the platform company is going to make life hard for them."
</p>
        </blockquote>
        <p dir="ltr">
You can guess my answer to the question so I won’t bother answering. I will point
out that I doubt that <a href="http://www.techcrunch.com/2007/04/03/mozilla-to-build-social-features-into-firefox-bad-news-for-flock/">the
developers of Flock</a> would agree with the statement that Firefox doesn’t do
anything to screw developers on their platform. 
</p>
        <p dir="ltr">
I also question anyone who claims that there are more opportunities to make money
off of Firefox plugins than there are selling ads in your Facebook application. 
</p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=2Pac">2Pac</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Fight Music (feat. Xzibit)&amp;artistTerm=2Pac">Fight
Music (feat. Xzibit)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=f4d1a8ff-6a8d-4e5a-ad1c-d834d0d58782" />
      </body>
      <title>Which is better for developers, the Firefox platform vs. Facebook platform?</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,f4d1a8ff-6a8d-4e5a-ad1c-d834d0d58782.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/10/26/WhichIsBetterForDevelopersTheFirefoxPlatformVsFacebookPlatform.aspx</link>
      <pubDate>Fri, 26 Oct 2007 03:00:19 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Dave Winer has an interesting post where he asks &lt;a href="http://www.scripting.com/stories/2007/10/25/facebookAppOrFirefoxPlugin.html"&gt;Facebook
app or Firefox plug-in?&lt;/a&gt;&amp;nbsp;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
Which is a more interesting platform -- Facebook or Firefox?&lt;br&gt;
&lt;br&gt;
This was a topic of conversation at the Web 2.0 Summit last week in SF, not on stage,
but in a &lt;i&gt;LobbyCon&lt;/i&gt;versation between myself and venture capitalist &lt;a href="http://flickr.com/photos/scriptingnews/1619505112/"&gt;&lt;font color=#355ea0&gt;Bijan
Sabet&lt;/font&gt;&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://bijansabet.com/post/17050165"&gt;&lt;font color=#355ea0&gt;Bijan Sabet&lt;/font&gt;&lt;/a&gt;:
"I like that Firefox developers don't have to live in a world where they lie awake
at night worried that the platform company is going to make life hard for them."
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir=ltr&gt;
You can guess my answer to the question so I won’t bother answering. I&amp;nbsp;will point
out that I doubt that &lt;a href="http://www.techcrunch.com/2007/04/03/mozilla-to-build-social-features-into-firefox-bad-news-for-flock/"&gt;the
developers of Flock&lt;/a&gt; would agree with the&amp;nbsp;statement that Firefox doesn’t do
anything to screw developers on their platform.&amp;nbsp;
&lt;/p&gt;
&lt;p dir=ltr&gt;
I also question anyone who claims that there are more opportunities to make money
off of Firefox plugins than there are selling ads in your Facebook application. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=2Pac"&gt;2Pac&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Fight Music (feat. Xzibit)&amp;amp;artistTerm=2Pac"&gt;Fight
Music (feat. Xzibit)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=f4d1a8ff-6a8d-4e5a-ad1c-d834d0d58782" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,f4d1a8ff-6a8d-4e5a-ad1c-d834d0d58782.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=38770087-421d-4ac9-86fb-0c1a9ad30e5f</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,38770087-421d-4ac9-86fb-0c1a9ad30e5f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,38770087-421d-4ac9-86fb-0c1a9ad30e5f.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=38770087-421d-4ac9-86fb-0c1a9ad30e5f</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Today I saw a pretty useless product announced on TechCrunch called <a href="http://www.techcrunch.com/2007/10/23/with-friendcsv-data-sneaks-out-facebooks-back-door/">FriendCSV</a> which
extracts your <a href="http://www.facebook.com/">Facebook</a> friends into a CSV file
sans their <a href="http://en.wikipedia.org/wiki/Personally_identifiable_information">PII</a> (i.e.
no email address, no IM screen names, no telephone numbers, no street address). Amusingly
enough, the authors of the application brag about using the <a href="http://developer.facebook.com/">Facebook
platform</a> as it was designed to be used as if they have figured out some major
exploit. <img title="Smile" style="VERTICAL-ALIGN: middle" alt="Smile" src="http://shared.live.com/QGncRMHLLpIcOfCh--4aMA/emoticons/smile_regular.gif" /></p>
        <p>
However it did remind me of a pretty cool desktop application that I found via <a href="http://www.murarka.com/">Bubba</a> called <a href="http://www.melsam.com/outsync/">OutSync</a>.
It synchronizes the photos of your contacts in Outlook with those of any matching
people found on your friends list in <a href="http://www.facebook.com/">Facebook</a>.
If you have a Windows Mobile smartphone that is synchronized with your Exchange server
like I do, it means that you get all your friends photos on your phone which
is pretty sweet especially when you get a call from that person. Screenshots
below
</p>
        <p>
          <img alt="OutSync access request screen" src="http://www.25hoursaday.com/weblog/content/binary/outsync1.JPG" border="0" />
        </p>
        <p>
There’s that user-centric authentication model where the user grants the application
access without giving the application their username/password. Again, I’m glad <a href="http://oauth.net/documentation/spec">OAuth</a> is
standardizing this for the Web. 
</p>
        <p>
          <img src="http://www.25hoursaday.com/weblog/content/binary/outsync2.JPG" border="0" />
        </p>
        <p>
When I think of the <a href="http://developer.facebook.com/">Facebook platform</a> embracing
the “Web as a Platform” I want to see more applications like this enabled. Instead
of only utilizing my Facebook social graph in the <a href="http://www.facebook.com/marketplace/?ref=sb">Facebook
Marketplace</a> or the <a href="http://www.techcrunch.com/2007/08/07/leveraging-facebook-to-compete-with-ebay-wont-work/">Buy.com
Facebook application</a>, why can’t it be utilized on <a href="http://www.ebay.com/">eBay</a> or <a href="http://www.craigslist.com/">Craigslist</a>?
I want all the applications I use to be able to utilize my social graph to make
themselves better without having to be widgets on a particular social networking site
before they can take advantage of this knowledge.  
</p>
        <p>
          <a href="http://www.25hoursaday.com/weblog/2004/12/31/SocialSoftwareFindingBeautyInWalledGardens.aspx">Back
in 2004</a>, I wrote 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
Basically, we've gotten rid of one of major complaints about online services; maintaining
to many separate lists of people you know. One of the benefits of this is that you
can utilize this master contact list across a number of scenarios outside of just
one local application like an email application or an IM client. For example, in <a href="http://spaces.msn.com/">MSN
Spaces</a> we allow users to use their MSN Messenger allow list (people you've
granted permission to contact you via IM) as a access control list for who can
view your Space (blog, photo album, etc). <font color="#ff0000">There are a lot more
interesting things you can do once the applications you use can tell "here are the
people I know, these are the ones I trust, etc".</font> We may not get there as an
industry anytime soon but MSN users will be reaping the benefits of this integration
in more and more ways as time progresses.
</p>
        </blockquote>
        <p dir="ltr">
It’s unfortunate that almost 3 years later we haven’t made much progress on this across
the industry although it looks like the <a href="http://developer.facebook.com/">Facebook
platform</a> has gotten people finally thinking about <a href="http://www.25hoursaday.com/weblog/2007/08/19/TheProblemsFacedByAUnifiedSocialGraph.aspx">unified
social graphs</a>. Better late than never, I guess.  
</p>
        <p dir="ltr">
The one mistake I’ve been making in my thinking has been narrowly defining the applications
that should have access to your Windows Live social graph as Microsoft or Windows
Live applications. My thinking has since evolved as has that of lots of folks in the
B0rg cube. It will be an interesting couple of months with regards to social graph
APIs especially with <a href="http://www.techcrunch.com/2007/09/21/google-to-out-open-facebook-on-november-5/">Google’s
November 5th announcement</a> coming up. 
</p>
        <p>
          <strong>PS:</strong> Anyone else noticed that the <a href="http://cid-9691929e119dc195.skydrive.live.com/self.aspx/OutSync/OutSync.msi">installer
for OutSync</a> is hosted on <a href="http://skydrive.live.com/">SkyDrive</a>? 
</p>
        <p>
          <strong>PPS:</strong> I got a phone call from <a href="http://robdolin.spaces.live.com/">Rob
Dolin</a> earlier this evening and the pic from <a href="http://www.facebook.com/p/Rob_Dolin/500012538">his
Facebook profile</a> showed up my phone. Sweet!
</p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Soulja Boy">Soulja
Boy</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Crank That (Soulja Boy)&amp;artistTerm=Soulja Boy">Crank
That (Soulja Boy)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=38770087-421d-4ac9-86fb-0c1a9ad30e5f" />
      </body>
      <title>OutSync: Synchronize Your Outlook/Smartphone Contacts with FaceBook</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,38770087-421d-4ac9-86fb-0c1a9ad30e5f.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/10/24/OutSyncSynchronizeYourOutlookSmartphoneContactsWithFaceBook.aspx</link>
      <pubDate>Wed, 24 Oct 2007 03:00:11 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Today I saw a pretty useless product announced on TechCrunch called &lt;a href="http://www.techcrunch.com/2007/10/23/with-friendcsv-data-sneaks-out-facebooks-back-door/"&gt;FriendCSV&lt;/a&gt;&amp;nbsp;which
extracts your &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; friends into a CSV file
sans their &lt;a href="http://en.wikipedia.org/wiki/Personally_identifiable_information"&gt;PII&lt;/a&gt; (i.e.
no email address, no IM screen names, no telephone numbers, no street address). Amusingly
enough, the authors of the application brag about using the &lt;a href="http://developer.facebook.com/"&gt;Facebook
platform&lt;/a&gt; as it was designed to be used as if they have figured out some major
exploit. &lt;img title=Smile style="VERTICAL-ALIGN: middle" alt=Smile src="http://shared.live.com/QGncRMHLLpIcOfCh--4aMA/emoticons/smile_regular.gif"&gt; 
&lt;/p&gt;
&lt;p&gt;
However it did remind me of a pretty cool desktop application that I found via &lt;a href="http://www.murarka.com/"&gt;Bubba&lt;/a&gt;&amp;nbsp;called &lt;a href="http://www.melsam.com/outsync/"&gt;OutSync&lt;/a&gt;.
It synchronizes the photos of your contacts in Outlook with those of any matching
people found on your friends list in&amp;nbsp;&lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;.
If you have a Windows Mobile smartphone that is synchronized with your Exchange server
like I do, it means that you get all your friends&amp;nbsp;photos on your phone which
is pretty&amp;nbsp;sweet&amp;nbsp;especially when you get a call from that person. Screenshots
below
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="OutSync access request screen" src="http://www.25hoursaday.com/weblog/content/binary/outsync1.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
There’s that user-centric authentication model where the user grants the application
access without giving the application their username/password. Again, I’m glad &lt;a href="http://oauth.net/documentation/spec"&gt;OAuth&lt;/a&gt; is
standardizing this for the Web. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.25hoursaday.com/weblog/content/binary/outsync2.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
When I think of the &lt;a href="http://developer.facebook.com/"&gt;Facebook platform&lt;/a&gt; embracing
the “Web as a Platform” I want to see more applications like this enabled. Instead
of only utilizing my Facebook social graph in the &lt;a href="http://www.facebook.com/marketplace/?ref=sb"&gt;Facebook
Marketplace&lt;/a&gt; or the &lt;a href="http://www.techcrunch.com/2007/08/07/leveraging-facebook-to-compete-with-ebay-wont-work/"&gt;Buy.com
Facebook application&lt;/a&gt;, why can’t it be utilized on &lt;a href="http://www.ebay.com/"&gt;eBay&lt;/a&gt; or &lt;a href="http://www.craigslist.com/"&gt;Craigslist&lt;/a&gt;?
I want all the applications I use to be able&amp;nbsp;to utilize my social graph to make
themselves better without having to be widgets on a particular social networking site
before they can take advantage of this knowledge.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.25hoursaday.com/weblog/2004/12/31/SocialSoftwareFindingBeautyInWalledGardens.aspx"&gt;Back
in 2004&lt;/a&gt;, I wrote 
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
Basically, we've gotten rid of one of major complaints about online services; maintaining
to many separate lists of people you know. One of the benefits of this is that you
can utilize this master contact list across a number of scenarios outside of just
one local application like an email application or an IM client. For example,&amp;nbsp;in &lt;a href="http://spaces.msn.com/"&gt;MSN
Spaces&lt;/a&gt;&amp;nbsp;we allow users to use their MSN Messenger allow list (people you've
granted permission to contact&amp;nbsp;you via IM) as a access control list for who can
view your Space (blog, photo album, etc). &lt;font color=#ff0000&gt;There are a lot more
interesting things you can do once the applications you use can tell "here are the
people I know, these are the ones I trust, etc".&lt;/font&gt; We may not get there as an
industry anytime soon but MSN users will be reaping the benefits of this integration
in more and more ways as time progresses.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir=ltr&gt;
It’s unfortunate that almost 3 years later we haven’t made much progress on this across
the industry although it looks like the &lt;a href="http://developer.facebook.com/"&gt;Facebook
platform&lt;/a&gt; has gotten people finally thinking about&amp;nbsp;&lt;a href="http://www.25hoursaday.com/weblog/2007/08/19/TheProblemsFacedByAUnifiedSocialGraph.aspx"&gt;unified
social graphs&lt;/a&gt;. Better late than never, I guess.&amp;nbsp; 
&lt;/p&gt;
&lt;p dir=ltr&gt;
The one mistake I’ve been making in my thinking has been narrowly defining the applications
that should have access to your Windows Live social graph as Microsoft or Windows
Live applications. My thinking has since evolved as has that of lots of folks in the
B0rg cube. It will be an interesting couple of months with regards to social graph
APIs especially with &lt;a href="http://www.techcrunch.com/2007/09/21/google-to-out-open-facebook-on-november-5/"&gt;Google’s
November 5th announcement&lt;/a&gt; coming up. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;PS:&lt;/strong&gt; Anyone else noticed that the &lt;a href="http://cid-9691929e119dc195.skydrive.live.com/self.aspx/OutSync/OutSync.msi"&gt;installer
for OutSync&lt;/a&gt; is hosted on &lt;a href="http://skydrive.live.com/"&gt;SkyDrive&lt;/a&gt;? 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;PPS:&lt;/strong&gt; I got a phone call from &lt;a href="http://robdolin.spaces.live.com/"&gt;Rob
Dolin&lt;/a&gt; earlier this&amp;nbsp;evening and the pic from &lt;a href="http://www.facebook.com/p/Rob_Dolin/500012538"&gt;his
Facebook profile&lt;/a&gt; showed up my phone. Sweet!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Soulja Boy"&gt;Soulja
Boy&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Crank That (Soulja Boy)&amp;amp;artistTerm=Soulja Boy"&gt;Crank
That (Soulja Boy)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=38770087-421d-4ac9-86fb-0c1a9ad30e5f" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,38770087-421d-4ac9-86fb-0c1a9ad30e5f.aspx</comments>
      <category>Platforms</category>
      <category>Social Software</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=624c367b-7ac2-43e9-8d2a-0944ddfab61f</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,624c367b-7ac2-43e9-8d2a-0944ddfab61f.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,624c367b-7ac2-43e9-8d2a-0944ddfab61f.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=624c367b-7ac2-43e9-8d2a-0944ddfab61f</wfw:commentRss>
      <slash:comments>8</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I recently read two blog posts on Microsoft's <a href="http://visitmix.com/">VisitMix</a> site
recently which show how conflicted large Web players can be about embracing the fact
that <em>The</em><em>Web is the Platform</em>. The first is a blog post by Scott
Barnes entitled <a href="http://www.visitmix.com/Blogs/Mossyblog/rich-interactive-applications/">Rich
Interactive Applications</a> which contains the following excerpt 
</p>
        <blockquote>
          <p>
            <em>When you think of RIA what is it your mind casts an image to first? </em>
            <br />
            <em>... </em>
            <br />
            <em>RIA isn't about attention/eyeballs, it's supposed to be focused on empowering
end users of a defined type, to carry out mundane task through an enriching user experience.
User Experience is the key, in that a true RIA solution has the power to abstract
complexity through aggregation or 360 degree view(s) of content without altering context.</em>
            <br />
            <em>...</em>
            <br />
            <em>That is <font color="#ff0000">Rich Interactive Application (RIA)</font> shifting
the paradigm. It had nothing to do with the Internet, suffice to say it's housed within
an agent which is connected to the Internet - or - Intranet.</em>
          </p>
        </blockquote>
        <p>
This blog post was the first time I've seen the term RIA defined as Rich Interactive
Application instead of <a href="http://en.wikipedia.org/wiki/Rich_Internet_application">Rich
Internet Application</a>. Digging a little, it becomes obvious that Scott Barnes's
post is just one of many in an <a href="http://blogs.msdn.com/msmossyblog/archive/2007/10/14/rich-interactive-application-the-plot-thickens-adobe-s-not-happy.aspx">ongoing <strike>flame
war</strike> war of words</a> between developer evangelists at Microsoft and developer
evangelists at Adobe. 
</p>
        <p>
Redefining a term in such a way that it becomes all-inclusive is a recipe for
devaluing the term [which might be Scott's purpose]. This is the lesson from the all-inclusive
definitions that started to swirl around industry terms like <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture">Service
Oriented Architecture</a> and <a href="http://en.wikipedia.org/wiki/Web_2">Web 2.0</a>.
More importantly, the problem with using the term "Rich <strong>Interactive</strong> Application"
to define what developers commonly describe as RIAs is that it completely misses the
point. Developers and end users are not excited about the ability to build and
use rich interactive applications, they are excited about being able to build and
use rich interactive applications <strong>on the Web</strong>. They've had the former
for as long as desktop computers have existed, the latter is what is currently jazzing
people up (e.g. all the hype around AJAX, Flickr, YouTube, the Facebook platform, etc). 
</p>
        <p>
Don't fight the Web. People don't get excited about "interactive" desktop applications.
When was the last time your best friend, mom, daughter, sister, co-worker, etc told
you about some cool desktop app they just found or use regularly? How does that compare
that to the amount of times they've told about cool Web sites they found or use regularly? 
</p>
        <p>
Think about that for a second, Mr. Rich Interactive Application. Embrace the Web or
you will be left behind. 
</p>
        <p>
Onto Joshua Allen's post entitled <a href="http://visitmix.com/Blogs/Joshua/web-is-the-platform-srsly/">Web
is THE Platform? SRSLY?</a> which states 
</p>
        <blockquote>
          <p>
Erick Schonfeld at <a href="http://www.techcrunch.com/2007/10/18/the-web-is-the-platform/">TechCrunch
reports on Google's presentation today</a> at Web 2.0 Conference.  Jeff Huber
of Google, trying to slam Facebook and MySpace, said <em>"A lot that you have heard
here is about platforms and who is going to win. That is Paleolithic thinking. The
Web has already won. The web is the Platform. So let’s go build the programmable Web."</em></p>
          <p>
I was rather surprised, because I heard that <a href="http://www.25hoursaday.com/weblog/2007/10/16/TheWebIsThePlatformOnMicrosoftsSocialGraphAPIStrategy.aspx">same
line just two days ago, from Dare Obasanjo</a>.  Jeff apparently reads Dare's
blog, and was in a hurry to prepare his speech. 
<br />
...<br />
When I hear someone talk about the web as a platform, I have a pretty clear picture:
</p>
          <ul>
            <li>
Utilizes open standards, preferably mature specifications and preferably from W3C 
</li>
            <li>
Utilizes web client runtime that has massive deployment; depends only on functionality
that can be found in the majority of browsers 
</li>
            <li>
Runs the same no matter who is hosting the code</li>
          </ul>
          <p>
This is non-negotiable!  When any normal person writes "for the web", this is
what she means! 
</p>
        </blockquote>
        <p>
Joshua goes on to cite Google for hypocrisy because it's widget platform is every
bit as proprietary as those of MySpace and Facebook, and Google's doesn't use any
of the ad-hoc standards for exposing social graph data in a shareable way (FOAF, XFN,
etc). 
</p>
        <p>
Although all the things Joshua lists are important, they aren't what I was really
harping on when I wrote <a href="http://www.25hoursaday.com/weblog/2007/10/16/TheWebIsThePlatformOnMicrosoftsSocialGraphAPIStrategy.aspx">the
post referenced by Joshua</a>. The problem with the <a href="http://developers.facebook.com">Facebook
platform</a> is that although you can use it to build Web applications, <em>they are
not on the Web</em>. What do I mean by being on the Web? Here's a sampling of writings
from across the Web that does a better of job of explaining this than I ever could
</p>
        <p>
          <a href="http://dig.csail.mit.edu/breadcrumbs/node/144">Tim Berners-Lee</a>
        </p>
        <blockquote>
          <p>
            <em>When I invented the Web, I didn't have to ask anyone's permission. Now, hundreds
of millions of people are using it freely.</em>
          </p>
        </blockquote>
        <p>
          <a href="http://www.kottke.org/07/07/facebook-vs-aol-redux">Jason Kottke</a>
        </p>
        <blockquote>
          <p>
            <em>Faced with competition from this open web, AOL lost...running a closed service
with custom content and interfaces was no match for the wild frontier of the web.
Maybe if they'd done some things differently, they would have fared better, but they
still would have lost. In competitive markets, open and messy trumps closed and controlled
in the long run.</em>
          </p>
        </blockquote>
        <p>
          <a href="http://www.dashes.com/anil/2007/10/rainman-blackbird-facebook-and-the-new-tables.html">Anil
Dash</a>
        </p>
        <blockquote>
          <p>
            <em>It's not true to say that Facebook is the new AOL, and it's oversimplification
to say that Facebook's API is the new Blackbird, or the new Rainman. But Facebook
is part of the web. Think of the web, of the Internet itself, as water. Proprietary
platforms based on the web are ice cubes. They can, for a time, suspend themselves
above the web at large. But over time, they only ever melt into the water.</em>
          </p>
        </blockquote>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=624c367b-7ac2-43e9-8d2a-0944ddfab61f" />
      </body>
      <title>If You Fight the Web, You Will Lose.</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,624c367b-7ac2-43e9-8d2a-0944ddfab61f.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/10/20/IfYouFightTheWebYouWillLose.aspx</link>
      <pubDate>Sat, 20 Oct 2007 16:03:20 GMT</pubDate>
      <description>&lt;p&gt;
I recently read two blog posts on Microsoft's &lt;a href="http://visitmix.com/"&gt;VisitMix&lt;/a&gt; site
recently which show how conflicted large Web players can be about embracing the&amp;nbsp;fact
that&amp;nbsp;&lt;em&gt;The&lt;/em&gt; &lt;em&gt;Web is the Platform&lt;/em&gt;. The first is a blog post by Scott
Barnes entitled &lt;a href="http://www.visitmix.com/Blogs/Mossyblog/rich-interactive-applications/"&gt;Rich
Interactive Applications&lt;/a&gt;&amp;nbsp;which contains the following excerpt 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;When you think of RIA what is it your mind casts an image to first? &lt;/em&gt;
&lt;br&gt;
&lt;em&gt;... &lt;/em&gt;
&lt;br&gt;
&lt;em&gt;RIA isn't about attention/eyeballs, it's supposed to be focused on empowering
end users of a defined type, to carry out mundane task through an enriching user experience.
User Experience is the key, in that a true RIA solution has the power to abstract
complexity through aggregation or 360 degree view(s) of content without altering context.&lt;/em&gt; 
&lt;br&gt;
&lt;em&gt;...&lt;/em&gt; 
&lt;br&gt;
&lt;em&gt;That is &lt;font color="#ff0000"&gt;Rich Interactive Application (RIA)&lt;/font&gt; shifting
the paradigm. It had nothing to do with the Internet, suffice to say it's housed within
an agent which is connected to the Internet - or - Intranet.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This blog post was the first time I've seen the term RIA defined as Rich Interactive
Application instead of &lt;a href="http://en.wikipedia.org/wiki/Rich_Internet_application"&gt;Rich
Internet Application&lt;/a&gt;. Digging a little, it becomes obvious that Scott Barnes's
post is just one of many in an &lt;a href="http://blogs.msdn.com/msmossyblog/archive/2007/10/14/rich-interactive-application-the-plot-thickens-adobe-s-not-happy.aspx"&gt;ongoing &lt;strike&gt;flame
war&lt;/strike&gt; war of words&lt;/a&gt; between developer evangelists at Microsoft and developer
evangelists at Adobe. 
&lt;/p&gt;
&lt;p&gt;
Redefining a&amp;nbsp;term in such a way that it becomes all-inclusive is a recipe for
devaluing the term [which might be Scott's purpose]. This is the lesson from the all-inclusive
definitions that started to swirl around industry terms like &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture"&gt;Service
Oriented Architecture&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Web_2"&gt;Web 2.0&lt;/a&gt;.
More importantly, the problem with using the term "Rich &lt;strong&gt;Interactive&lt;/strong&gt; Application"
to define what developers commonly describe as RIAs is that it completely misses the
point.&amp;nbsp;Developers and end users are not excited about the ability to build and
use rich interactive applications, they are excited about being able to build and
use rich interactive applications &lt;strong&gt;on the Web&lt;/strong&gt;. They've had the former
for as long as desktop computers have existed, the latter is what is currently jazzing
people up (e.g. all the hype around AJAX, Flickr, YouTube, the Facebook platform,&amp;nbsp;etc). 
&lt;/p&gt;
&lt;p&gt;
Don't fight the Web. People don't get excited about "interactive" desktop applications.
When was the last time your best friend, mom, daughter, sister, co-worker, etc told
you about some cool desktop app they just found or use regularly? How does that compare
that to the amount of times they've told about cool Web sites they found or use regularly? 
&lt;/p&gt;
&lt;p&gt;
Think about that for a second, Mr. Rich Interactive Application. Embrace the Web or
you will be left behind. 
&lt;/p&gt;
&lt;p&gt;
Onto Joshua Allen's post entitled &lt;a href="http://visitmix.com/Blogs/Joshua/web-is-the-platform-srsly/"&gt;Web
is THE Platform? SRSLY?&lt;/a&gt;&amp;nbsp;which states 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Erick Schonfeld at &lt;a href="http://www.techcrunch.com/2007/10/18/the-web-is-the-platform/"&gt;TechCrunch
reports on Google's presentation today&lt;/a&gt; at Web 2.0 Conference.&amp;nbsp; Jeff Huber
of Google, trying to slam Facebook and MySpace, said &lt;em&gt;"A lot that you have heard
here is about platforms and who is going to win. That is Paleolithic thinking. The
Web has already won. The web is the Platform. So let’s go build the programmable Web."&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
I was rather surprised, because I heard that &lt;a href="http://www.25hoursaday.com/weblog/2007/10/16/TheWebIsThePlatformOnMicrosoftsSocialGraphAPIStrategy.aspx"&gt;same
line just two days ago, from Dare Obasanjo&lt;/a&gt;.&amp;nbsp; Jeff apparently reads Dare's
blog, and was in a hurry to prepare his speech. 
&lt;br&gt;
...&lt;br&gt;
When I hear someone talk about the web as a platform, I have a pretty clear picture:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Utilizes open standards, preferably mature specifications and preferably from W3C 
&lt;li&gt;
Utilizes web client runtime that has massive deployment; depends only on functionality
that can be found in the majority of browsers 
&lt;li&gt;
Runs the same no matter who is hosting the code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This is non-negotiable!&amp;nbsp; When any normal person writes "for the web", this is
what she means!&amp;nbsp;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Joshua goes on to cite Google for hypocrisy because it's widget platform is every
bit as proprietary as those of MySpace and Facebook, and Google's doesn't use any
of the ad-hoc standards for exposing social graph data in a shareable way (FOAF, XFN,
etc). 
&lt;/p&gt;
&lt;p&gt;
Although all the things Joshua lists are important, they aren't what I was really
harping on when I wrote &lt;a href="http://www.25hoursaday.com/weblog/2007/10/16/TheWebIsThePlatformOnMicrosoftsSocialGraphAPIStrategy.aspx"&gt;the
post referenced by Joshua&lt;/a&gt;. The problem with the &lt;a href="http://developers.facebook.com"&gt;Facebook
platform&lt;/a&gt; is that although you can use it to build Web applications, &lt;em&gt;they are
not on the Web&lt;/em&gt;. What do I mean by being on the Web? Here's a sampling of&amp;nbsp;writings
from across the Web that does a better of job of explaining this than I ever could
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://dig.csail.mit.edu/breadcrumbs/node/144"&gt;Tim Berners-Lee&lt;/a&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;When I invented the Web, I didn't have to ask anyone's permission. Now, hundreds
of millions of people are using it freely.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;a href="http://www.kottke.org/07/07/facebook-vs-aol-redux"&gt;Jason Kottke&lt;/a&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Faced with competition from this open web, AOL lost...running a closed service
with custom content and interfaces was no match for the wild frontier of the web.
Maybe if they'd done some things differently, they would have fared better, but they
still would have lost. In competitive markets, open and messy trumps closed and controlled
in the long run.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;a href="http://www.dashes.com/anil/2007/10/rainman-blackbird-facebook-and-the-new-tables.html"&gt;Anil
Dash&lt;/a&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;It's not true to say that Facebook is the new AOL, and it's oversimplification
to say that Facebook's API is the new Blackbird, or the new Rainman. But Facebook
is part of the web. Think of the web, of the Internet itself, as water. Proprietary
platforms based on the web are ice cubes. They can, for a time, suspend themselves
above the web at large. But over time, they only ever melt into the water.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=624c367b-7ac2-43e9-8d2a-0944ddfab61f" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,624c367b-7ac2-43e9-8d2a-0944ddfab61f.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=957dfbaf-6950-4e4f-9e68-b1a7f567c02c</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,957dfbaf-6950-4e4f-9e68-b1a7f567c02c.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,957dfbaf-6950-4e4f-9e68-b1a7f567c02c.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=957dfbaf-6950-4e4f-9e68-b1a7f567c02c</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>Social Networking Site Platforms: How Developers Should Evaluate the MySpace platform (and others)</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,957dfbaf-6950-4e4f-9e68-b1a7f567c02c.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/10/18/SocialNetworkingSitePlatformsHowDevelopersShouldEvaluateTheMySpacePlatformAndOthers.aspx</link>
      <pubDate>Thu, 18 Oct 2007 15:23:41 GMT</pubDate>
      <description>&lt;p&gt;
I&amp;rsquo;ve been reading recently that a number of social networking sites are rushing
to launch [or re-launch] a widgets platform given the success of the &lt;a href="http://developer.facebook.com/"&gt;Facebook
platform&lt;/a&gt;.&amp;nbsp;There have&amp;nbsp;been &lt;a href="http://www.techcrunch.com/2007/10/17/counterstrike-murdoch-dewolfe-annouce-myspace-platform-and-new-privacy-controls/"&gt;announcements
about a &lt;/a&gt;&lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;&lt;a href="http://www.myspace.com/"&gt; platform&lt;/a&gt;&amp;nbsp;which
claim that 
&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt; 
&lt;li&gt;
&lt;em&gt;it will essentially be a set of APIs and a new markup language that will allow
third party developers to create applications that run within MySpace. Developers
will be able to include Flash applets, iFrame elements and Javascript snippets in
their applications, and access most of the core MySpace resources (profile information,
friend list, activity history, etc.). Unlike existing widgets on MySpace, developers
will be able to access deep profile and other information about users and bake it
into the applications.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Advertising can be included on the application pages (called control pages) and
developers will keep 100% of the revenue. Ads may not be placed within widgets that
appear on MySpace pages, however.&lt;/em&gt;
&lt;/li&gt;&lt;/blockquote&gt; 
&lt;p dir="ltr"&gt;
There have been &lt;a href="http://www.techcrunch.com/2007/06/24/linkedin-to-open-platform-in-response-to-facebook/"&gt;similar
announcements from LinkedIn&lt;/a&gt;&amp;nbsp;and &lt;a href="http://www.techcrunch.com/2007/09/21/google-to-out-open-facebook-on-november-5/"&gt;Google&lt;/a&gt;.
The problem is that every one of these widget platforms being proposed by the various
social networking sites are incompatible. This means that&amp;nbsp;Web&amp;nbsp;developers
has to build a separate&amp;nbsp;application for each of these sites using proprietary
technologies (e.g. &lt;a href="http://wiki.developers.facebook.com/index.php/FBML"&gt;FBML&lt;/a&gt;)
and proprietary APIs (e.g. &lt;a href="http://developer.facebook.com/documentation.php?doc=fql"&gt;FQL&lt;/a&gt;).
Since very few Web developers or Web companies will be able to support significant
applications on every one of these platforms, the question then becomes &amp;ldquo;Which
platform should you bet on?&amp;rdquo; and &amp;ldquo;How do you make the decision to bet
on a platform.&amp;rdquo;
&lt;/p&gt;
&lt;p dir="ltr"&gt;
Right now the gold standard in widget platforms for social networking sites is the &lt;a href="http://developer.facebook.com/"&gt;Facebook
platform&lt;/a&gt;. There are several reasons for this and competitors planning to build
similar platforms need to meet the following criteria. 
&lt;/p&gt;
&lt;ol dir="ltr"&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;Monetization:&lt;/strong&gt; &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; encourages
developers to monetize their widgets by placing ads in their widgets. Although &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; has
not actively helped developers by providing an ad platform, there is now a healthy
marketplace of &lt;a href="http://www.techcrunch.com/2007/08/30/socialmedia-opens-self-serve-facebook-advertising-for-all/"&gt;Facebook
ad networks&lt;/a&gt; that developers can choose from. It has even been rumored that Google
will be getting in the Facebook ad provider game.&amp;nbsp;+1 to&amp;nbsp;&lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;Distribution and Reach:&lt;/strong&gt; A&amp;nbsp;big problem you&amp;rsquo;ll face when
you&amp;rsquo;ve built a great product is that it is a lot harder than you expect for
people to actually find out about and try your product. This means any avenue that
increases the potential reach and distribution of your product is bringing money in
your pocket. Not only does &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; have several
million active and engaged users,&amp;nbsp;the Facebook platform also provides &lt;a href="http://www.allfacebook.com/2007/07/the-top-5-viral-facebook-techniques/"&gt;several
mechanisms that encourage the viral spread of applications&lt;/a&gt; which developers consistently
rave about.&amp;nbsp;No other social networking site&amp;rsquo;s widget platform even comes
close. +1 to &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;Access to User Data:&lt;/strong&gt; Social networking sites are all about connecting
people to the people they care about&amp;nbsp;and their interests. This means that applications
built on these platforms should be able to determine a user&amp;rsquo;s friends and interests
to be able to give an optimal experience. The &lt;a href="http://developer.facebook.com/"&gt;Facebook
platform&lt;/a&gt; is unprecedented in the arena of widget platforms when it comes to the
amount of user information it&amp;nbsp;exposes to applications with methods like &lt;a href="http://developers.facebook.com/documentation.php?v=1.0&amp;amp;method=friends.get"&gt;friends.get&lt;/a&gt;,&amp;nbsp;&lt;a href="http://developers.facebook.com/documentation.php?v=1.0&amp;amp;method=users.getInfo"&gt;users.getInfo&lt;/a&gt;, &lt;a href="http://developers.facebook.com/documentation.php?v=1.0&amp;amp;method=photos.get"&gt;photos.get&lt;/a&gt; and
even &lt;a href="http://developers.facebook.com/documentation.php?v=1.0&amp;amp;method=marketplace.getListings"&gt;marketplace.getListings&lt;/a&gt;.
+1 to &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;Ability to Build an Integrated and Immersive Experience:&lt;/strong&gt; One place
where the &lt;a href="http://developer.facebook.com/"&gt;Facebook platform&lt;/a&gt; really changed
the game is that widgets weren&amp;rsquo;t just relegated to a tiny box on the user&amp;rsquo;s
profile like they are on other social networking sites but instead developers could
build &lt;a href="http://developers.facebook.com/anatomy.php"&gt;full blown applications
that integrated fully into the Facebook experience&lt;/a&gt;. It&amp;rsquo;s a lot easier to
keep users engaged and build non-intrusive advertising into your application if your
entire application doesn&amp;rsquo;t have to fit in some 4&amp;rdquo; X 4&amp;rdquo; box on the
user&amp;rsquo;s profile. +1 to &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;Applications Shielded from the &amp;ldquo;Winner&amp;rsquo;s Curse&amp;rdquo; of Web Development:&lt;/strong&gt; The
more successful your application becomes on the Web, the more money you have to spend
on server related resources. Everyone knows &lt;a href="http://seattletimes.nwsource.com/html/businesstechnology/2003752014_brier18.html"&gt;the
story of iLike scrambling to borrow money and servers&lt;/a&gt; because their Facebook application
was more successful than they anticipated. Since a lot of widget developers are not&amp;nbsp;richly
funded startups or big&amp;nbsp;companies,&amp;nbsp;they may not be able to bear the costs
of actually&amp;nbsp;building a successful Web application without help from the&amp;nbsp;platform
vendor. A number of platform vendors provides hosting&amp;nbsp;for static files and data
storage&amp;nbsp;APIs although none&amp;nbsp;go as far as full blown application hosting...yet.&amp;nbsp;&amp;nbsp;+0.5
to &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;. 
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
From my perspective, if a social networking site&amp;rsquo;s widget&amp;nbsp;platform doesn&amp;rsquo;t
meet&amp;nbsp;&lt;strong&gt;all&lt;/strong&gt; criteria, then it&amp;nbsp;can&amp;rsquo;t be considered&amp;nbsp;a
real competitor to Facebook&amp;rsquo;s platform. And as a developer if I had to choose
between that platform and Facebook&amp;rsquo;s, there would be no choice to make. 
&lt;/p&gt;
&lt;p&gt;
Now if you can afford multiple development efforts building&amp;nbsp;widgets/applications&amp;nbsp;for&amp;nbsp;several
disparate social networking site platforms, the list above is a good starting point
for prioritizing&amp;nbsp;the which&amp;nbsp;social networking site&amp;rsquo;s to build widgets/applications
for first.&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;p dir="ltr"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=T.I."&gt;T.I.&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=U Don't Know Me&amp;amp;artistTerm=T.I."&gt;U
Don't Know Me&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=957dfbaf-6950-4e4f-9e68-b1a7f567c02c" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,957dfbaf-6950-4e4f-9e68-b1a7f567c02c.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=62a72922-c081-493b-a89c-cae574b73ee6</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,62a72922-c081-493b-a89c-cae574b73ee6.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,62a72922-c081-493b-a89c-cae574b73ee6.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=62a72922-c081-493b-a89c-cae574b73ee6</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>The Web is the Platform: On Microsoft's Social Graph API Strategy</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,62a72922-c081-493b-a89c-cae574b73ee6.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/10/16/TheWebIsThePlatformOnMicrosoftsSocialGraphAPIStrategy.aspx</link>
      <pubDate>Tue, 16 Oct 2007 16:40:53 GMT</pubDate>
      <description>&lt;p&gt;
Mary Jo Foley has a delightful post entitled &lt;a href="http://blogs.zdnet.com/microsoft/?p=833"&gt;Are
all &amp;lsquo;open&amp;rsquo; Web platforms created equal?&lt;/a&gt;&amp;nbsp;where she wonders why
there is more hype around &lt;a href="http://developer.facebook.com/"&gt;the Facebook platform&lt;/a&gt;, &lt;a href="http://www.techcrunch.com/2007/09/21/google-to-out-open-facebook-on-november-5/"&gt;Google&amp;rsquo;s
muched hyped attempt to counter it on November 5th&lt;/a&gt; and other efforts&amp;nbsp;that &lt;a href="http://www.dashes.com/anil/2007/10/rainman-blackbird-facebook-and-the-new-tables.html"&gt;Anil
Dash has accurately described as the new Blackbird&lt;/a&gt; as opposed to open API efforts
from Microsoft. She posits two theories which are excerpted below 
&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;Who isn&amp;rsquo;t mentioned in any of these conversations? Microsoft. Is it because
Microsoft hasn&amp;rsquo;t opened up its various Windows Live APIs to other developers?
Nope. Microsoft announced in late April its plans for &lt;/em&gt;&lt;a href="http://blogs.zdnet.com/microsoft/?p=413"&gt;&lt;em&gt;opening
up and providing licensing terms for several of its key Windows Live APIs&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
including Windows Live Contacts, Windows Live Spaces Photo Control and Windows Live
Data Protocols.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;So why is Microsoft seemingly irrelevant to the conversation, when it comes to
opening up its Web platform? There are a few different theories.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&amp;ldquo;I think the excitement about the Facebook platform stems from the fact
that it addresses the problem of building publicity and distribution for a new application.
Any developer can create an application for Facebook, and the social network will
help propagate that application, exposing it to new users,&amp;rdquo; said Matt Rosoff,
an analyst with Directions on Microsoft.&lt;/em&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;em&gt;&amp;hellip;&lt;/em&gt;
&lt;br /&gt;
&lt;p&gt;
&lt;em&gt;Microsoft, for its part, believes it is offering Web platform APIs the way that
developers want, making them available under different business terms and permitting
third parties to customize them inside their own sites, according to George Moore,
General Manager of Windows Live. But Moore also acknowledges Microsoft has a different
outlook in terms of which data it exposes via its APIs.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&amp;ldquo;Facebook gives you access to your social-graph (social-networking) data.
We don&amp;rsquo;t do that. &lt;/em&gt;&lt;a href="http://dev.live.com/"&gt;&lt;em&gt;We have a gallery&lt;/em&gt;&lt;/a&gt;&lt;em&gt; that
allows users to extend Live Spaces,&amp;rdquo; Moore said.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Moore declined to comment on when or if Microsoft planned to allow developers
to tap directly into user&amp;rsquo;s social-graph data like Facebook has done.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir="ltr"&gt;
I see GeorgeM all the time, so I doubt he&amp;rsquo;ll mind if I clarify his statement
above since it gives the wrong impression of our efforts given the context in which
it was placed. If we go back to &lt;a href="http://www.25hoursaday.com/weblog/2007/08/30/TheDifferenceBetweenASocialNetworkSiteASocialGraphApplicationAndASocialOS.aspx"&gt;the
definition of a social graph&lt;/a&gt;&amp;nbsp;it&amp;rsquo;s clear that what is important is that
it is a&amp;nbsp;graph of user relationships not one that is tied to a particular site
or service. From that perspective the &lt;a href="http://msdn2.microsoft.com/en-us/library/bb447750.aspx"&gt;Windows
Live Contacts API&lt;/a&gt; which provides a RESTful interface to the contents of a user&amp;rsquo;s&amp;nbsp;Windows
Live&amp;nbsp;address book&amp;nbsp;complete with the list of tags/relationship types the
user has applied to these contacts (e.g. &amp;ldquo;Family&amp;rdquo;, &amp;ldquo;Friends&amp;rdquo;,
&amp;ldquo;Coworkers&amp;rdquo;, etc) as well as which of these contacts are the user&amp;rsquo;s
buddies in &lt;a href="http://messenger.live.com/"&gt;Windows Live Messenger&lt;/a&gt; is a social
graph API.&amp;nbsp;
&lt;/p&gt;
&lt;p dir="ltr"&gt;
On the other hand, this API does not give you access to the user&amp;rsquo;s &lt;a href="http://carnage4life.spaces.live.com/friends/"&gt;Spaces
friends list&lt;/a&gt;.&amp;nbsp;&amp;nbsp;My assumption is that Mary Jo&amp;rsquo;s questions were
specific to social networking sites which is why George gave that misleading answer.
In addition, &lt;a href="http://www.goland.org/"&gt;Yaron&lt;/a&gt; is fond of pointing out to
me that the API is in alpha so there is still a lot that can change from now until
we stamp it as v1. Until then, I&amp;rsquo;ll also decline to comment on any future plans. 
&lt;/p&gt;
&lt;p dir="ltr"&gt;
As for the claim made by Matt Rosoff, I tend to agree with his assertion that the
viral propagation of applications via the Facebook&amp;rsquo;s social graph is attractive
to developers. However this attractiveness comes with the price of both the users
and developers being &lt;a href="http://www.scripting.com/davenet/2001/07/06/theMicroChannelArchitectur.html"&gt;locked
in Facebook&amp;rsquo;s trunk&lt;/a&gt;. 
&lt;/p&gt;
&lt;p dir="ltr"&gt;
I personally believe that the Web is the platform and this philosophy shines through
in the API efforts at Microsoft.&amp;nbsp;It may be that this is not as attractive to
developers today as it should be but eventually the Web will win. Everyone who has
fought the Web has lost. &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; will not
be an exception. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Tony Yayo"&gt;Tony
Yayo&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=I Know You Dont Love Me (feat. G-Unit)&amp;amp;artistTerm=Tony Yayo"&gt;I
Know You Dont Love Me (feat. G-Unit)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=62a72922-c081-493b-a89c-cae574b73ee6" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,62a72922-c081-493b-a89c-cae574b73ee6.aspx</comments>
      <category>Platforms</category>
      <category>Windows Live</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=4fc797a1-5631-4192-85e9-9f8467acd025</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,4fc797a1-5631-4192-85e9-9f8467acd025.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,4fc797a1-5631-4192-85e9-9f8467acd025.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4fc797a1-5631-4192-85e9-9f8467acd025</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Rock Star (feat. Ludacris &amp; Kid Rock)&amp;artistTerm=Ludacris">
          </a>I
recently got an email from a developer about my post <a href="http://www.25hoursaday.com/weblog/2007/10/06/ThoughtsOnAmazonsInternalStorageSystemDynamo.aspx">Thoughts
on Amazon's Internal Storage System (Dynamo)</a> which claimed that I seem
to be romanticizing distributed systems that favor availability over consistency.
He pointed out that although this sounds nice on paper, it places a significant burden
on application developers. He is 100% right. This has been my experience in Windows
Live and I’ve heard enough second hand to assume it is the experience at Amazon as
well when it comes to <a href="http://allthingsdistributed.com/2007/10/amazons_dynamo.html">Dynamo</a>. 
</p>
        <p>
I thought an example of how this trade-off affects developers would be a useful excercise
and may be of interest to my readers. The following example is hypothetical and should
not be construed as describing the internal architectures of any production systems
I am aware of. 
</p>
        <p>
          <strong>Scenario:</strong>
          <a href="http://www.facebook.com/p/Torsten_Rendelmann/549254553">Torsten
Rendelmann</a>, a <a href="http://www.facebook.com/">Facebook</a> user in Germany,
accepts a friend request from <a href="http://www.facebook.com/p/Dare_Obasanjo/500050028">Dare
Obasanjo</a> who is a <a href="http://www.facebook.com/">Facebook</a> user in the
United States. 
</p>
        <p>
          <strong>The Distributed System</strong>: To improve the response times for users in
Europe, imagine <a href="http://www.facebook.com/">Facebook</a> has a data center
in London while American users a serviced from a Data Center in Palo Alto. To
achieve this, the user database is broken up in a process commonly described as <a href="http://www.highscalability.com/unorthodox-approach-database-design-coming-shard">sharding</a>. <em>The
question of if and how data is replicated across both data centers isn’t relevant
to this example.</em></p>
        <p>
The application developer who owns the confirm_friend_request() method, will
ideally want to write code that took the following form 
</p>
        <blockquote>
          <code>
            <p>
public void confirm_friend_request(user1, user2){
</p>
            <p>
  begin_transaction(); 
<br />
  update_friend_list(user1, user2, status.confirmed); //palo alto 
<br />
  update_friend_list(user2, user1, status.confirmed); //london 
<br />
  end_transaction(); 
</p>
            <p>
} 
</p>
          </code>
        </blockquote>
        <p>
Yay, <a href="http://en.wikipedia.org/wiki/Distributed_transaction">distributed transactions</a>.
You have to love a feature that <a href="http://publib.boulder.ibm.com/infocenter/cicsts/v3r1/index.jsp?topic=/com.ibm.cics.ts31.doc/dfhp6/dfhp61i.htm">every
vendor advises you not to use</a> if you care about performance. So obviously this
doesn’t work for a large scale distributed system where performance and availabilty
are important.  
</p>
        <p>
Things get particularly ugly when you realize that either data center or the specific
server a user’s data is stored on could be unreachable for a variety of reasons (e.g.
DoS attack, high seasonal load, drunk sys admin tripped over a power cord, hard drive
failure due to cheap components, etc). 
</p>
        <p>
There are a number of options one can consider when availability and high performance
are considered to be more important than data consistency in the above example. Below
are three potential implementations of the code above each with it’s own set of trade
offs. 
</p>
        <p>
OPTION I: Application developer performs manual rollback on error 
</p>
        <blockquote>
          <code>
            <p>
public void confirm_friend_request_A(user1, user2){
</p>
            <p>
 try{<br />
   update_friend_list(user1, user2, status.confirmed); //palo alto <br />
 }catch(exception e){ <br />
  report_error(e); <br />
  return; 
<br />
 } 
</p>
            <p>
 try{ 
<br />
  update_friend_list(user2, user1, status.confirmed); //london 
<br />
 }catch(exception e) {<br />
  revert_friend_list(user1, user2); 
<br />
  report_error(e); 
<br />
  return; <br />
 }<br /><br />
} 
</p>
            <p>
            </p>
          </code>
        </blockquote>
        <p>
The problem here is that we don’t handle the case where revert_friend_list() fails.
This means that Dare (user1) may end up having Torsten (user2) on his friend list
but Torsten won’t have Dare on his friend list. The database has lied. 
</p>
        <p>
OPTION II: Failed events are placed in a message queue to be retried until they succeed.   
</p>
        <blockquote>
          <p>
public void confirm_friend_request_B(user1, user2){
</p>
          <p>
 try{<br />
   update_friend_list(user1, user2, status.confirmed); //palo alto <br />
 }catch(exception e){ <br />
  report_error(e); <br />
  add_to_retry_queue(operation.updatefriendlist, user1, user2, current_time()); <br />
 } 
</p>
          <p>
 try{ 
<br />
  update_friend_list(user2, user1, status.confirmed); //london 
<br />
 }catch(exception e) {<br />
  report_error(e); <br />
  add_to_retry_queue(operation.updatefriendlist, user2, user1, current_time());  <br />
 }<br /><br />
} 
</p>
        </blockquote>
        <p>
Depending on how long the error exists and how long it takes an item to sit in the
message queue, there will be times when the Dare (user1) may end up having Torsten
(user2) on his friend list but Torsten won’t have Dare on his friend list. The database
has lied, again.
</p>
        <p>
OPTION III: System always accepts updates but application developers may have to resolve
data conflicts later. (The Dynamo approach) 
</p>
        <blockquote>
          <code>
            <p>
              <font color="#008000">/* update_friend_list always succeeds but may enqueue an item
in message queue to try again later in the event of failure. This failure is not propagated
to callers of the method.  */</font>
              <br />
            </p>
            <p>
public void confirm_friend_request_C(user1, user2){<br />
   update_friend_list(user1, user2, status.confirmed); // palo alto<br />
   update_friend_list(user2, user1, status.confirmed); //london 
</p>
}<br /><p></p><p><font color="#008000">/* get_friends() method has to reconcile results returned by
get_friends() because there may be data inconsistency due to a conflict because a
change that was applied from the message queue is contradictory to a subsequent
change by the user.  In this case, status is a bitflag where all conflicts
are merged and it is up to app developer to figure out what to do. */</font> 
</p><p>
  public list get_friends(user1){ <br />
      list actual_friends = new list();<br />
      list friends = get_friends();   
</p><p>
      foreach (friend in friends){      
</p><p>
        if(friend.status == friendstatus.confirmed){ <font color="#008000">//no
conflict</font><br />
           actual_friends.add(friend); 
</p><p>
        }else if((friend.status &amp;= friendstatus.confirmed) <br />
                  
and !(friend.status &amp;= friendstatus.deleted)){ 
</p><p>
        <font color="#008000">  // assume
friend is confirmed as long as it wasn’t also deleted<br /></font>          friend.status = friendstatus.confirmed;              <br />
          actual_friends.add(friend); <br />
          update_friends_list(user1,
friend, status.confirmed);
</p><p>
        }else{ <font color="#008000">//assume deleted
if there is a conflict with a delete</font><br />
          update_friends_list( user1,
friend, status.deleted)<br />
        } 
</p><p>
      }//foreach
</p><p>
   return actual_friends;<br />
}
</p></code>
        </blockquote>
        <p>
These are just a few of the many approaches that can be implemented in such a distributed
system to get around the performance and availability implications of using distributed
transactions. The main problem with them is that in every single case, the application
developer has an extra burden placed on his shoulders due to inherent fragility of
distributed systems. For a lot of developers, the shock of this realization is
akin to the shock of programming in C++ after using C# or Ruby for a couple of
years. Manual memory management? Actually having to perform bounds checking arrays? Being
unable to use decades old technology like database transactions? 
</p>
        <p>
The challenge in building a distributed storage system like <a href="http://labs.google.com/papers/bigtable.html">BigTable</a> or <a href="http://allthingsdistributed.com/2007/10/amazons_dynamo.html">Dynamo</a> is
in balancing the need for high availability and performance while not building a system
that encourages all sorts of insidious bugs to exist in the system <em>by design</em>. 
Some might argue that <a href="http://allthingsdistributed.com/2007/10/amazons_dynamo.html">Dynamo</a> goes
to far in the burden that it places on developers while there are others that would
argue that it doesn’t go far enough. 
</p>
        <p>
In what camp do you fall? 
</p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=R. Kelly">R.
Kelly</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Rock Star (feat. Ludacris &amp; Kid Rock)&amp;artistTerm=R. Kelly">Rock
Star (feat. Ludacris &amp; Kid Rock)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=4fc797a1-5631-4192-85e9-9f8467acd025" />
      </body>
      <title>When Databases Lie: Consistency vs. Availability in Distributed Systems</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,4fc797a1-5631-4192-85e9-9f8467acd025.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/10/10/WhenDatabasesLieConsistencyVsAvailabilityInDistributedSystems.aspx</link>
      <pubDate>Wed, 10 Oct 2007 03:00:12 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Rock Star (feat. Ludacris &amp;amp; Kid Rock)&amp;amp;artistTerm=Ludacris"&gt;&lt;/a&gt;I
recently got an email from a developer about my post &lt;a href="http://www.25hoursaday.com/weblog/2007/10/06/ThoughtsOnAmazonsInternalStorageSystemDynamo.aspx"&gt;Thoughts
on Amazon's Internal Storage System (Dynamo)&lt;/a&gt;&amp;nbsp;which&amp;nbsp;claimed that I seem
to be romanticizing distributed systems that&amp;nbsp;favor availability&amp;nbsp;over consistency.
He pointed out that although this sounds nice on paper, it places a significant burden
on application developers. He is 100% right. This has been my experience in Windows
Live and I’ve heard enough second hand to assume it is the experience at Amazon as
well when it comes to &lt;a href="http://allthingsdistributed.com/2007/10/amazons_dynamo.html"&gt;Dynamo&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
I thought an example of how this trade-off affects developers would be a useful excercise
and may be of interest to my readers. The following example is hypothetical and should
not be construed as describing the internal architectures of any production systems
I am aware of. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Scenario:&lt;/strong&gt; &lt;a href="http://www.facebook.com/p/Torsten_Rendelmann/549254553"&gt;Torsten
Rendelmann&lt;/a&gt;, a &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; user in Germany,
accepts a friend request from&amp;nbsp;&lt;a href="http://www.facebook.com/p/Dare_Obasanjo/500050028"&gt;Dare
Obasanjo&lt;/a&gt; who is a &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; user in the
United States. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The Distributed System&lt;/strong&gt;: To improve the response times for users in
Europe, imagine&amp;nbsp;&lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; has a data center
in London while American users a serviced from a Data Center in Palo Alto.&amp;nbsp;To
achieve this, the user database is broken up in a process commonly described as &lt;a href="http://www.highscalability.com/unorthodox-approach-database-design-coming-shard"&gt;sharding&lt;/a&gt;.&amp;nbsp;&lt;em&gt;The
question of if and how&amp;nbsp;data is replicated across both data centers isn’t relevant
to this example.&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
The&amp;nbsp;application developer who owns the confirm_friend_request() method, will
ideally want to write code that took the following form&amp;nbsp;
&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt; 
&lt;p&gt;
public void&amp;nbsp;confirm_friend_request(user1, user2){
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; begin_transaction(); 
&lt;br&gt;
&amp;nbsp; update_friend_list(user1, user2, status.confirmed); //palo alto 
&lt;br&gt;
&amp;nbsp; update_friend_list(user2, user1, status.confirmed); //london 
&lt;br&gt;
&amp;nbsp; end_transaction(); 
&lt;p&gt;
}&amp;nbsp;
&lt;/p&gt;
&lt;/code&gt;&lt;/blockquote&gt; 
&lt;p&gt;
Yay, &lt;a href="http://en.wikipedia.org/wiki/Distributed_transaction"&gt;distributed transactions&lt;/a&gt;.
You have to love a feature that &lt;a href="http://publib.boulder.ibm.com/infocenter/cicsts/v3r1/index.jsp?topic=/com.ibm.cics.ts31.doc/dfhp6/dfhp61i.htm"&gt;every
vendor advises you not to use&lt;/a&gt; if you care about performance. So obviously this
doesn’t work for a large scale distributed system where performance and availabilty
are important. &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Things get particularly ugly when you realize that either data center or the specific
server a user’s data is stored on could be unreachable for a variety of reasons (e.g.
DoS attack, high seasonal load, drunk sys admin tripped over a power cord, hard drive
failure due to cheap components, etc). 
&lt;/p&gt;
&lt;p&gt;
There are a number of options one can consider when availability and high performance
are considered to be more important than data consistency in the above example. Below
are three potential implementations of the code above each with it’s own set of trade
offs. 
&lt;/p&gt;
&lt;p&gt;
OPTION I: Application developer performs manual rollback on error 
&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt; 
&lt;p&gt;
public void&amp;nbsp;confirm_friend_request_A(user1, user2){
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;try{&lt;br&gt;
&amp;nbsp;&amp;nbsp; update_friend_list(user1, user2, status.confirmed); //palo alto&amp;nbsp;&lt;br&gt;
&amp;nbsp;}catch(exception e){&amp;nbsp;&lt;br&gt;
&amp;nbsp; report_error(e);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;return; 
&lt;br&gt;
&amp;nbsp;} 
&lt;p&gt;
&amp;nbsp;try{ 
&lt;br&gt;
&amp;nbsp; update_friend_list(user2, user1, status.confirmed); //london 
&lt;br&gt;
&amp;nbsp;}catch(exception e) {&lt;br&gt;
&amp;nbsp; revert_friend_list(user1, user2); 
&lt;br&gt;
&amp;nbsp; report_error(e); 
&lt;br&gt;
&amp;nbsp; return;&amp;nbsp;&lt;br&gt;
&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
} 
&lt;p&gt;
&lt;/p&gt;
&lt;/code&gt;&lt;/blockquote&gt; 
&lt;p&gt;
The problem here is that we don’t handle the case where revert_friend_list() fails.
This means that Dare (user1) may end up having Torsten (user2) on his friend list
but Torsten won’t have Dare on his friend list. The database has lied. 
&lt;/p&gt;
&lt;p&gt;
OPTION II: Failed events are placed in a message queue to be retried until they succeed.&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
public void&amp;nbsp;confirm_friend_request_B(user1, user2){
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;try{&lt;br&gt;
&amp;nbsp;&amp;nbsp; update_friend_list(user1, user2, status.confirmed); //palo alto&amp;nbsp;&lt;br&gt;
&amp;nbsp;}catch(exception e){&amp;nbsp;&lt;br&gt;
&amp;nbsp; report_error(e);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;add_to_retry_queue(operation.updatefriendlist, user1, user2, current_time());&amp;nbsp;&lt;br&gt;
&amp;nbsp;} 
&lt;p&gt;
&amp;nbsp;try{ 
&lt;br&gt;
&amp;nbsp; update_friend_list(user2, user1, status.confirmed); //london 
&lt;br&gt;
&amp;nbsp;}catch(exception e) {&lt;br&gt;
&amp;nbsp; report_error(e);&amp;nbsp;&lt;br&gt;
&amp;nbsp; add_to_retry_queue(operation.updatefriendlist, user2, user1, current_time());&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
} 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Depending on how long the error exists and how long it takes an item to sit in the
message queue, there will be times when the Dare (user1) may end up having Torsten
(user2) on his friend list but Torsten won’t have Dare on his friend list. The database
has lied, again.
&lt;/p&gt;
&lt;p&gt;
OPTION III: System always accepts updates but application developers may have to resolve
data conflicts later. (The Dynamo approach) 
&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt; 
&lt;p&gt;
&lt;font color=#008000&gt;/* update_friend_list always succeeds but may enqueue an item
in message queue to try again later in the event of failure. This failure is not propagated
to callers of the method. &amp;nbsp;*/&lt;/font&gt; 
&lt;br&gt;
&lt;p&gt;
public void&amp;nbsp;confirm_friend_request_C(user1, user2){&lt;br&gt;
&amp;nbsp;&amp;nbsp; update_friend_list(user1, user2, status.confirmed); //&amp;nbsp;palo alto&lt;br&gt;
&amp;nbsp;&amp;nbsp; update_friend_list(user2, user1, status.confirmed); //london&amp;nbsp;
&lt;/p&gt;
}&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#008000&gt;/* get_friends() method has to reconcile results returned by get_friends()
because there may be data inconsistency due to a conflict because a change that was
applied from the message queue is&amp;nbsp;contradictory to a subsequent change by the
user.&amp;nbsp;&amp;nbsp;In this case, status is a bitflag where all conflicts are merged
and it is up to app developer to figure out what to do. */&lt;/font&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; public list get_friends(user1){&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list actual_friends = new list();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list&amp;nbsp;friends = get_friends();&amp;nbsp;&amp;nbsp; 
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (friend in friends){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(friend.status == friendstatus.confirmed){ &lt;font color=#008000&gt;//no
conflict&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; actual_friends.add(friend); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if((friend.status &amp;amp;= friendstatus.confirmed)&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
and !(friend.status &amp;amp;= friendstatus.deleted)){ 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#008000&gt;&amp;nbsp; // assume
friend is confirmed as long as it wasn’t also deleted&lt;br&gt;
&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; friend.status = friendstatus.confirmed;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; actual_friends.add(friend);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;update_friends_list(user1,
friend, status.confirmed);
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else{ &lt;font color=#008000&gt;//assume deleted
if there is a conflict with a delete&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update_friends_list( user1,
friend, status.deleted)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }//foreach
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp; return actual_friends;&lt;br&gt;
}
&lt;/p&gt;
&lt;/code&gt;&lt;/blockquote&gt; 
&lt;p&gt;
These are just a few of the many approaches that can be implemented in such a distributed
system to get around the performance and availability implications of using distributed
transactions. The main problem with them is that in every single case, the application
developer has an extra burden placed on his shoulders due to inherent fragility of
distributed systems.&amp;nbsp;For a lot of developers, the shock of this realization is
akin to the shock of programming in C++ after using C# or Ruby for a&amp;nbsp;couple of
years. Manual memory management? Actually having to perform bounds checking arrays?&amp;nbsp;Being
unable to use decades old technology like database transactions? 
&lt;/p&gt;
&lt;p&gt;
The challenge in building a distributed storage system like &lt;a href="http://labs.google.com/papers/bigtable.html"&gt;BigTable&lt;/a&gt; or &lt;a href="http://allthingsdistributed.com/2007/10/amazons_dynamo.html"&gt;Dynamo&lt;/a&gt;&amp;nbsp;is
in balancing the need for high availability and performance while not building a system
that encourages all sorts of insidious bugs to exist in the system &lt;em&gt;by design&lt;/em&gt;.&amp;nbsp;
Some might argue that &lt;a href="http://allthingsdistributed.com/2007/10/amazons_dynamo.html"&gt;Dynamo&lt;/a&gt;&amp;nbsp;goes
to far in the burden that it places on developers while there are others that would
argue that it doesn’t go far enough. 
&lt;/p&gt;
&lt;p&gt;
In what camp do you fall? 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=R. Kelly"&gt;R.
Kelly&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Rock Star (feat. Ludacris &amp;amp; Kid Rock)&amp;amp;artistTerm=R. Kelly"&gt;Rock
Star (feat. Ludacris &amp;amp; Kid Rock)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=4fc797a1-5631-4192-85e9-9f8467acd025" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,4fc797a1-5631-4192-85e9-9f8467acd025.aspx</comments>
      <category>Platforms</category>
      <category>Programming</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=651b7191-6e26-4fd3-95bf-d9d4b0e7c8fa</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,651b7191-6e26-4fd3-95bf-d9d4b0e7c8fa.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,651b7191-6e26-4fd3-95bf-d9d4b0e7c8fa.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=651b7191-6e26-4fd3-95bf-d9d4b0e7c8fa</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yaron Goland has an entertaining post entitled <a href="http://www.goland.org/revengeofbabble/">Interoperability
Wars - Episode 6 - Part 1 - Revenge of Babble</a> about some of the philosophical
discussions we’ve been having at work about the <a href="http://www.rfc-editor.org/rfc/rfc5023.txt">Atom
Publishing Protocol</a> (RFC 5023). The entire post is hilarious if you are an
XML protocol geek and I recommend reading it. The following excerpt is a good starting
point for <a href="http://www.25hoursaday.com/weblog/2007/06/09/WhyGDataAPPFailsAsAGeneralPurposeEditingProtocolForTheWeb.aspx">another
discussion about APP’s suitability as a general purpose editing protocol
for the Web</a>. Yaron writes 
</p>
        <blockquote>
          <p>
            <b>Emperor Babble</b>: Excellent, Weasdel's death will serve us well in lulling the
forces of interoperability into thinking they are making progress. Welcome Restafarian,
it is time you understood your true place in my plans.
</p>
          <p>
            <b>Luke Restafarian</b>: Do what you want to me emperor, but the noble cause of interoperability
will prevail!
</p>
          <p>
The Emperor turns to the center of the chamber where a form, almost blinding in its
clarity, takes shape:
</p>
          <pre xml:space="preserve">GET /someuser/profile HTTP/1.1<br />
host: example.com<br />
content-type: application/xml<br />
<br />
&lt;profile xmlns="http://example.com"&gt;<br />
&lt;professional&gt;<br />
&lt;workTitle&gt;…&lt;/workTitle&gt;<br />
…<br />
&lt;/professional&gt;<br />
&lt;personal&gt;<br />
&lt;spouseName&gt;<br />
…<br />
&lt;/spouseName&gt;<br />
…<br />
&lt;/personal&gt;<br />
&lt;clothingPreferences&gt;<br />
&lt;favoriteColors&gt;<br />
&lt;shirts&gt;…&lt;/shirts&gt;<br />
…<br />
&lt;/favoriteColors&gt;<br />
…<br />
&lt;/clothingPreferences&gt;<br />
…<br />
&lt;/profile&gt;</pre>
          <p>
Darth Sudsy is momentarily taken aback from the appearance of the pure interoperable
data while Luke Restafarian seems strengthened by it. The Emperor turns back to Luke
and then speaks.
</p>
          <p>
            <b>Emperor Babble</b>: I see it strengthens you Restafarian, no matter. But look again
at your blessed interoperability.
</p>
          <p>
When the Emperor turns back to the form the form begins to morph, growing darker and
more sinister:
</p>
          <pre xml:space="preserve">GET /someuser/profileFeed HTTP/1.1<br />
host: example.com<br />
content-type: application/ATOM+xml<br />
<br />
&lt;feed xmlns="http://www.w3.org/2005/Atom"&gt;<br />
&lt;title/&gt;<br />
&lt;updated&gt;2000-01-01T00:00:00Z&lt;/updated&gt;<br />
&lt;author&gt;<br />
&lt;name/&gt;<br />
&lt;/author&gt;<br />
&lt;id&gt;http://www.example.com/someuser/profileFeed&lt;/id&gt;<br />
&lt;category scheme="http://example.com/categories" term="Profile"/&gt;<br />
&lt;entry&gt;<br />
&lt;title/&gt;<br />
&lt;id&gt;http://www.example.com/someuser/profilesFeed/professional&lt;/id&gt;<br />
&lt;updated&gt;2000-01-01T00:00:00Z&lt;/updated&gt;<br />
&lt;content type="Application/XML" xmlns:e="http://example.com"&gt;<br />
&lt;workTitle&gt;…&lt;/workTitle&gt;<br />
…<br />
&lt;/content&gt;<br />
&lt;/entry&gt;<br />
&lt;entry&gt;<br />
&lt;title/&gt;<br />
&lt;id&gt;http://www.example.com/someuser/profilesFeed/personal&lt;/id&gt;<br />
&lt;updated&gt;2000-01-01T00:00:00Z&lt;/updated&gt;<br />
&lt;content type="Application/XML" xmlns:e="http://example.com"&gt;<br />
&lt;spouseName&gt;<br />
…<br />
&lt;/spouseName&gt;<br />
…<br />
&lt;/content&gt;<br />
&lt;/entry&gt;<br />
&lt;entry&gt;<br />
&lt;title/&gt;<br />
&lt;id&gt;http://www.example.com/someuser/profilesFeed/clothingPreferences&lt;/id&gt;<br />
&lt;updated&gt;2000-01-01T00:00:00Z&lt;/updated&gt;<br />
&lt;content type="Application/XML" xmlns:e="http://example.com"&gt;<br />
&lt;favoriteColors&gt;<br />
&lt;shirts&gt;…&lt;/shirts&gt;<br />
…<br />
&lt;/favoriteColors&gt;<br />
…<br />
&lt;/content&gt;<br />
&lt;/entry&gt;<br />
&lt;/feed&gt;</pre>
          <p>
Luke, having recognized the syntax, clearly expects to get another wave of strength
but instead he feels sickly. The emperor, looking slightly stronger, turns from the
form to look at Luke.
</p>
          <p>
            <b>Luke Restafarian</b>: What have you done? That structure is clearly taken from
Princess Ape-Pea's system, she is a true follower of interoperability, I should be
getting stronger but somehow it's making me ill.
</p>
          <p>
            <b>Emperor Babble</b>: You begin to understand young Restafarian. Used properly Princess
Ape-Pea's system does indeed honor all the qualities of rich interoperability. But
look more carefully at this particular example of her system. Is it not beautiful?
Its needless complexity, its useless elements, its bloated form, they herald true
incompatibility. No developer will be able to manually deal with such an incomprehensible
monstrosity. We have taken your pure interoperable data and hidden it in a mud of
useless scaffolding. Princess Ape-Pea and your other minions will accept this poison
as adhering to your precious principles of interoperability but in point of fact by
turning Princess Ape-Pea's system into a generic structured data manipulation protocol
we have forced the data to contort into unnatural forms that are so hard to read,
so difficult to understand that no programmer will ever deal with it directly. We
will see no repeat of those damned Hit-Tip Knights building their own stacks in a
matter of hours in order to enable basic interoperability. In this new world even
the most trivial data visualizations and manipulations become a nightmare. Instead
of simple transversals of hierarchical structures programmers will be forced into
a morass of categories and artificial entry containers. Behold!
</p>
        </blockquote>
        <p>
Yaron’s point is that since Atom is primarily designed for representing streams of
microcontent, the only way to represent other types of data in Atom is to tunnel them
as custom XML formats or proprietary extensions to Atom. At this point you’ve added
an unnecessary layer of complexity. 
</p>
        <p>
The same thing applies to the actual Atom Publishing Protocol. The current design
requires clients to <a href="http://bitworking.org/projects/atom/draft-ietf-atompub-protocol-15.html#edit-no-lost-update">use
optimistic concurrency to handle conflicts on updates</a> which seems like unnecessary
complexity to push to clients as opposed to a “last update wins” scheme. Unfortunately,
APP’s interaction model doesn’t support granular updates which means such a scheme
isn’t supported by the current design. A number of APP experts have realized
this deficiency as you can see from James Snell of IBM’s post entitled <a href="http://www.snellspace.com/wp/?p=683">Beyond
APP - Partial updates</a> and John Panzer of Google’s post entitled <a href="http://journals.aol.com/panzerjohn/abstractioneer/entries/2007/08/08/restful-partial-updates-patchranges/1535">RESTful
partial updates: PATCH+Ranges</a>. 
</p>
        <p>
A potential counter argument that can be presented when pointing these deficiencies
of the <a href="http://www.rfc-editor.org/rfc/rfc5023.txt">Atom Publishing Protocol</a> when
used outside it’s core scenarios of microcontent publishing is that <a href="http://code.google.com/apis/gdata/index.html">Google
exposes all their services using GData</a> which is effectively APP. This is true,
but there are a couple of points to consider 
</p>
        <ol>
          <li>
Google had to <strong><font color="#ff0000">embrace and extend</font></strong> the
Atom format with <a href="http://code.google.com/apis/gdata/elements.html">several
proprietary extensions</a> to represent data that was not simply microcontent. 
</li>
          <li>
APP experts do not recommend embracing and extending the Atom format the way Google
has done since it obviously fragments interoperability. See Joe Gregorio’s post entitled <a href="http://bitworking.org/news/197/In-which-we-narrowly-save-Dare-from-inventing-his-own-publishing-protocol">In
which we narrowly save Dare from inventing his own publishing protocol</a> and
James Snell’s post entitled <a href="http://www.snellspace.com/wp/?p=681">Silly</a> for
more details. </li>
          <li>
Such practices leads to a world where <a href="http://jcheng.wordpress.com/2007/06/12/microsoft-is-not-sabotaging-app-probably/">we
have applications that can only speak Google’s flavor of Atom</a>. I remember when
it used to be a bad thing when Microsoft did this but for some reason Google gets
a pass. 
</li>
          <li>
Google has recognized the additional complexity they’ve created and now ship <a href="http://code.google.com/apis/gdata/clientlibs.html">GData
client libraries for several popular platforms</a> which they <a href="http://code.google.com/apis/gdata/basics.html#Audience">recommend
over talking directly to the protocol</a>. I don’t know about you but I don’t need
a vendor specific client library to process RSS feeds or access WebDAV resources,
so why do I need one to talk to Google’s APP implementation? 
</li>
        </ol>
        <p>
It seems that while we weren’t looking, Google move us a step away from
a world of simple, protocol-based interoperability on the Web to one based on running <em>the
right platform</em> with <em>the right libraries</em>. 
</p>
        <p>
Usually I wouldn’t care about whatever bad decisions the folks at Google are making
with their API platform. However the problem is that it sends out the wrong message
to other Web companies that are building Web APIs. The message that it’s all about
embracing and extending Internet standards with interoperability being based
on everyone running sanctioned client libraries instead of via simple, RESTful
protocols is harmful to the Internet. Unfortunately, this harkens to the bad old days
of Microsoft and I’d hate for us to begin a race to the bottom in this arena. 
</p>
        <p>
On the other hand, arguing about XML data formats and RESTful protocols are all
variations of arguments about <a href="http://en.wikipedia.org/wiki/Color_of_the_bikeshed">what
color to paint the bike shed</a>. At the end of the day, the important things are
(i) building a compelling end user service and (ii) exposing compelling functionality
via APIs to that service. The <a href="http://wiki.developers.facebook.com/index.php/API">Facebook
REST APIs</a> are a clusterfuck of inconsistency while the <a href="http://www.flickr.com/services/api/">Flickr
APIs</a> are impressive in how they push irrelevant details of the internals of the
service into the developer API (NSIDs anyone?). However both of these APIs are
massively popular. 
</p>
        <p>
From that perspective, what Google has done with <a href="http://code.google.com/apis/gdata/index.html">GData</a> is
smart in that by standardizing on it even though it isn’t the right tool for the job,
they’ve skipped the sorts of ridiculous what-color-to-paint-the-bike-shed discussions
that prompted Yaron to write his blog post in the first place. <img title="Wink" style="VERTICAL-ALIGN: middle" alt="Wink" src="http://shared.live.com/QGncRMHLLpIcOfCh--4aMA/emoticons/smile_wink.gif" /></p>
        <p>
With that out of the way they can focus on building compelling Web services and exposing
interesting functionality via their APIs. By the way, am I the last person to find
out about the <a href="http://code.google.com/apis/youtube/overview.html">YouTube
GData API</a>?. 
</p>
        <p>
        </p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=DJ Khaled">DJ
Khaled</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=I'm So Hood (feat. T-Pain, Trick Daddy, Rick Ross &amp; Plies)&amp;artistTerm=DJ Khaled">I'm
So Hood (feat. T-Pain, Trick Daddy, Rick Ross &amp; Plies)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=651b7191-6e26-4fd3-95bf-d9d4b0e7c8fa" />
      </body>
      <title>One Protocol to Rule Them All and in the Darkness Bind Them</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,651b7191-6e26-4fd3-95bf-d9d4b0e7c8fa.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/10/10/OneProtocolToRuleThemAllAndInTheDarknessBindThem.aspx</link>
      <pubDate>Wed, 10 Oct 2007 03:00:04 GMT</pubDate>
      <description>&lt;p&gt;
Yaron Goland has an entertaining post entitled &lt;a href="http://www.goland.org/revengeofbabble/"&gt;Interoperability
Wars - Episode 6 - Part 1 - Revenge of Babble&lt;/a&gt;&amp;nbsp;about some of the philosophical
discussions we’ve been having at work about the &lt;a href="http://www.rfc-editor.org/rfc/rfc5023.txt"&gt;Atom
Publishing Protocol&lt;/a&gt;&amp;nbsp;(RFC 5023). The entire post is hilarious if you are an
XML protocol geek and I recommend reading it. The following excerpt is a good starting
point for &lt;a href="http://www.25hoursaday.com/weblog/2007/06/09/WhyGDataAPPFailsAsAGeneralPurposeEditingProtocolForTheWeb.aspx"&gt;another
discussion&amp;nbsp;about&amp;nbsp;APP’s suitability&amp;nbsp;as a general purpose editing protocol
for the Web&lt;/a&gt;. Yaron writes 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;b&gt;Emperor Babble&lt;/b&gt;: Excellent, Weasdel's death will serve us well in lulling the
forces of interoperability into thinking they are making progress. Welcome Restafarian,
it is time you understood your true place in my plans.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Luke Restafarian&lt;/b&gt;: Do what you want to me emperor, but the noble cause of interoperability
will prevail!
&lt;/p&gt;
&lt;p&gt;
The Emperor turns to the center of the chamber where a form, almost blinding in its
clarity, takes shape:
&lt;/p&gt;
&lt;pre xml:space="preserve"&gt;GET /someuser/profile HTTP/1.1&lt;br&gt;
host: example.com&lt;br&gt;
content-type: application/xml&lt;br&gt;
&lt;br&gt;
&amp;lt;profile xmlns="http://example.com"&amp;gt;&lt;br&gt;
&amp;lt;professional&amp;gt;&lt;br&gt;
&amp;lt;workTitle&amp;gt;…&amp;lt;/workTitle&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/professional&amp;gt;&lt;br&gt;
&amp;lt;personal&amp;gt;&lt;br&gt;
&amp;lt;spouseName&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/spouseName&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/personal&amp;gt;&lt;br&gt;
&amp;lt;clothingPreferences&amp;gt;&lt;br&gt;
&amp;lt;favoriteColors&amp;gt;&lt;br&gt;
&amp;lt;shirts&amp;gt;…&amp;lt;/shirts&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/favoriteColors&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/clothingPreferences&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/profile&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Darth Sudsy is momentarily taken aback from the appearance of the pure interoperable
data while Luke Restafarian seems strengthened by it. The Emperor turns back to Luke
and then speaks.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Emperor Babble&lt;/b&gt;: I see it strengthens you Restafarian, no matter. But look again
at your blessed interoperability.
&lt;/p&gt;
&lt;p&gt;
When the Emperor turns back to the form the form begins to morph, growing darker and
more sinister:
&lt;/p&gt;
&lt;pre xml:space="preserve"&gt;GET /someuser/profileFeed HTTP/1.1&lt;br&gt;
host: example.com&lt;br&gt;
content-type: application/ATOM+xml&lt;br&gt;
&lt;br&gt;
&amp;lt;feed xmlns="http://www.w3.org/2005/Atom"&amp;gt;&lt;br&gt;
&amp;lt;title/&amp;gt;&lt;br&gt;
&amp;lt;updated&amp;gt;2000-01-01T00:00:00Z&amp;lt;/updated&amp;gt;&lt;br&gt;
&amp;lt;author&amp;gt;&lt;br&gt;
&amp;lt;name/&amp;gt;&lt;br&gt;
&amp;lt;/author&amp;gt;&lt;br&gt;
&amp;lt;id&amp;gt;http://www.example.com/someuser/profileFeed&amp;lt;/id&amp;gt;&lt;br&gt;
&amp;lt;category scheme="http://example.com/categories" term="Profile"/&amp;gt;&lt;br&gt;
&amp;lt;entry&amp;gt;&lt;br&gt;
&amp;lt;title/&amp;gt;&lt;br&gt;
&amp;lt;id&amp;gt;http://www.example.com/someuser/profilesFeed/professional&amp;lt;/id&amp;gt;&lt;br&gt;
&amp;lt;updated&amp;gt;2000-01-01T00:00:00Z&amp;lt;/updated&amp;gt;&lt;br&gt;
&amp;lt;content type="Application/XML" xmlns:e="http://example.com"&amp;gt;&lt;br&gt;
&amp;lt;workTitle&amp;gt;…&amp;lt;/workTitle&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/content&amp;gt;&lt;br&gt;
&amp;lt;/entry&amp;gt;&lt;br&gt;
&amp;lt;entry&amp;gt;&lt;br&gt;
&amp;lt;title/&amp;gt;&lt;br&gt;
&amp;lt;id&amp;gt;http://www.example.com/someuser/profilesFeed/personal&amp;lt;/id&amp;gt;&lt;br&gt;
&amp;lt;updated&amp;gt;2000-01-01T00:00:00Z&amp;lt;/updated&amp;gt;&lt;br&gt;
&amp;lt;content type="Application/XML" xmlns:e="http://example.com"&amp;gt;&lt;br&gt;
&amp;lt;spouseName&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/spouseName&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/content&amp;gt;&lt;br&gt;
&amp;lt;/entry&amp;gt;&lt;br&gt;
&amp;lt;entry&amp;gt;&lt;br&gt;
&amp;lt;title/&amp;gt;&lt;br&gt;
&amp;lt;id&amp;gt;http://www.example.com/someuser/profilesFeed/clothingPreferences&amp;lt;/id&amp;gt;&lt;br&gt;
&amp;lt;updated&amp;gt;2000-01-01T00:00:00Z&amp;lt;/updated&amp;gt;&lt;br&gt;
&amp;lt;content type="Application/XML" xmlns:e="http://example.com"&amp;gt;&lt;br&gt;
&amp;lt;favoriteColors&amp;gt;&lt;br&gt;
&amp;lt;shirts&amp;gt;…&amp;lt;/shirts&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/favoriteColors&amp;gt;&lt;br&gt;
…&lt;br&gt;
&amp;lt;/content&amp;gt;&lt;br&gt;
&amp;lt;/entry&amp;gt;&lt;br&gt;
&amp;lt;/feed&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Luke, having recognized the syntax, clearly expects to get another wave of strength
but instead he feels sickly. The emperor, looking slightly stronger, turns from the
form to look at Luke.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Luke Restafarian&lt;/b&gt;: What have you done? That structure is clearly taken from
Princess Ape-Pea's system, she is a true follower of interoperability, I should be
getting stronger but somehow it's making me ill.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Emperor Babble&lt;/b&gt;: You begin to understand young Restafarian. Used properly Princess
Ape-Pea's system does indeed honor all the qualities of rich interoperability. But
look more carefully at this particular example of her system. Is it not beautiful?
Its needless complexity, its useless elements, its bloated form, they herald true
incompatibility. No developer will be able to manually deal with such an incomprehensible
monstrosity. We have taken your pure interoperable data and hidden it in a mud of
useless scaffolding. Princess Ape-Pea and your other minions will accept this poison
as adhering to your precious principles of interoperability but in point of fact by
turning Princess Ape-Pea's system into a generic structured data manipulation protocol
we have forced the data to contort into unnatural forms that are so hard to read,
so difficult to understand that no programmer will ever deal with it directly. We
will see no repeat of those damned Hit-Tip Knights building their own stacks in a
matter of hours in order to enable basic interoperability. In this new world even
the most trivial data visualizations and manipulations become a nightmare. Instead
of simple transversals of hierarchical structures programmers will be forced into
a morass of categories and artificial entry containers. Behold!
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Yaron’s point is that since Atom is primarily designed for representing streams of
microcontent, the only way to represent other types of data in Atom is to tunnel them
as custom XML formats or proprietary extensions to Atom. At this point you’ve added
an unnecessary layer of complexity. 
&lt;/p&gt;
&lt;p&gt;
The same thing applies to the actual Atom Publishing Protocol. The current design
requires clients to &lt;a href="http://bitworking.org/projects/atom/draft-ietf-atompub-protocol-15.html#edit-no-lost-update"&gt;use
optimistic concurrency to handle conflicts on updates&lt;/a&gt; which seems like unnecessary
complexity to push to clients as opposed to a “last update wins” scheme. Unfortunately,
APP’s interaction&amp;nbsp;model doesn’t support granular updates which means such a scheme
isn’t supported by&amp;nbsp;the current design. A number of APP experts have realized
this deficiency as you can&amp;nbsp;see from James Snell of IBM’s post entitled &lt;a href="http://www.snellspace.com/wp/?p=683"&gt;Beyond
APP - Partial updates&lt;/a&gt;&amp;nbsp;and John Panzer of Google’s post entitled &lt;a href="http://journals.aol.com/panzerjohn/abstractioneer/entries/2007/08/08/restful-partial-updates-patchranges/1535"&gt;RESTful
partial updates: PATCH+Ranges&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
A potential&amp;nbsp;counter argument&amp;nbsp;that can be presented when pointing these deficiencies
of the&amp;nbsp;&lt;a href="http://www.rfc-editor.org/rfc/rfc5023.txt"&gt;Atom Publishing Protocol&lt;/a&gt;&amp;nbsp;when
used outside it’s core scenarios of microcontent publishing is that &lt;a href="http://code.google.com/apis/gdata/index.html"&gt;Google
exposes all their services using GData&lt;/a&gt; which is effectively APP. This is true,
but there are a couple of points to consider 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Google had to &lt;strong&gt;&lt;font color=#ff0000&gt;embrace and extend&lt;/font&gt;&lt;/strong&gt; the Atom
format with &lt;a href="http://code.google.com/apis/gdata/elements.html"&gt;several proprietary
extensions&lt;/a&gt; to represent data that was not simply&amp;nbsp;microcontent. 
&lt;/li&gt;
&lt;li&gt;
APP experts do not recommend embracing and extending the Atom format the way Google
has done since it obviously fragments interoperability. See Joe Gregorio’s post entitled &lt;a href="http://bitworking.org/news/197/In-which-we-narrowly-save-Dare-from-inventing-his-own-publishing-protocol"&gt;In
which we narrowly save Dare from inventing his own publishing protocol&lt;/a&gt;&amp;nbsp;and
James Snell’s post entitled &lt;a href="http://www.snellspace.com/wp/?p=681"&gt;Silly&lt;/a&gt;&amp;nbsp;for
more details.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;
Such&amp;nbsp;practices leads to a world where &lt;a href="http://jcheng.wordpress.com/2007/06/12/microsoft-is-not-sabotaging-app-probably/"&gt;we
have applications that can only speak Google’s flavor of Atom&lt;/a&gt;. I remember when
it used to be a bad thing when Microsoft did this but for some reason Google gets
a pass. 
&lt;/li&gt;
&lt;li&gt;
Google has recognized the additional complexity they’ve created and now ship &lt;a href="http://code.google.com/apis/gdata/clientlibs.html"&gt;GData
client libraries for several popular platforms&lt;/a&gt; which they&amp;nbsp;&lt;a href="http://code.google.com/apis/gdata/basics.html#Audience"&gt;recommend
over talking directly to the protocol&lt;/a&gt;. I don’t know about you but I don’t need
a vendor specific client library to process RSS feeds or access WebDAV resources,
so why do I need one to talk to Google’s APP implementation? 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
It seems that while we weren’t looking, Google&amp;nbsp;move us a&amp;nbsp;step away&amp;nbsp;from
a world of simple, protocol-based interoperability on the Web to one based on running &lt;em&gt;the
right platform&lt;/em&gt; with &lt;em&gt;the right libraries&lt;/em&gt;.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Usually I wouldn’t care about whatever bad decisions the folks at Google are making
with their API platform. However the problem is that it sends out the wrong message
to other Web companies that are building Web APIs. The message that it’s all about
embracing and extending Internet standards with interoperability&amp;nbsp;being based
on everyone running sanctioned client libraries instead of via simple,&amp;nbsp;RESTful
protocols is harmful to the Internet. Unfortunately, this harkens to the bad old days
of Microsoft and I’d hate for us to begin a race to the bottom in this arena. 
&lt;/p&gt;
&lt;p&gt;
On the other hand, arguing about XML data formats and RESTful protocols&amp;nbsp;are all
variations of arguments about &lt;a href="http://en.wikipedia.org/wiki/Color_of_the_bikeshed"&gt;what
color to paint the bike shed&lt;/a&gt;. At the end of the day, the important things are
(i) building a compelling end user service and (ii) exposing compelling functionality
via APIs to that service.&amp;nbsp;The &lt;a href="http://wiki.developers.facebook.com/index.php/API"&gt;Facebook
REST APIs&lt;/a&gt; are a clusterfuck of inconsistency while the &lt;a href="http://www.flickr.com/services/api/"&gt;Flickr
APIs&lt;/a&gt; are impressive in how they push irrelevant details of the internals of the
service into the developer API (NSIDs anyone?). However&amp;nbsp;both of these APIs are
massively popular. 
&lt;/p&gt;
&lt;p&gt;
From&amp;nbsp;that perspective, what Google has done with &lt;a href="http://code.google.com/apis/gdata/index.html"&gt;GData&lt;/a&gt; is
smart in that by standardizing on it even though it isn’t the right tool for the job,
they’ve skipped the sorts of&amp;nbsp;ridiculous what-color-to-paint-the-bike-shed discussions
that prompted Yaron to write his blog post in the first place. &lt;img title=Wink style="VERTICAL-ALIGN: middle" alt=Wink src="http://shared.live.com/QGncRMHLLpIcOfCh--4aMA/emoticons/smile_wink.gif"&gt; 
&lt;/p&gt;
&lt;p&gt;
With that out of the way they can focus on building compelling Web services and exposing
interesting functionality via their APIs. By the way, am I the last person to find
out about the &lt;a href="http://code.google.com/apis/youtube/overview.html"&gt;YouTube
GData API&lt;/a&gt;?. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=DJ Khaled"&gt;DJ
Khaled&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=I'm So Hood (feat. T-Pain, Trick Daddy, Rick Ross &amp;amp; Plies)&amp;amp;artistTerm=DJ Khaled"&gt;I'm
So Hood (feat. T-Pain, Trick Daddy, Rick Ross &amp;amp; Plies)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=651b7191-6e26-4fd3-95bf-d9d4b0e7c8fa" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,651b7191-6e26-4fd3-95bf-d9d4b0e7c8fa.aspx</comments>
      <category>Platforms</category>
      <category>XML Web Services</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=7b21c343-50de-44f1-b514-53d48ba39b33</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,7b21c343-50de-44f1-b514-53d48ba39b33.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,7b21c343-50de-44f1-b514-53d48ba39b33.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=7b21c343-50de-44f1-b514-53d48ba39b33</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
This is another post I was planning to write a few weeks ago which got interrupted
by my wedding and honeymoon. <img src="file:///C:/Program%20Files/BlogJet/Data/Smiles/smile3.gif" /></p>
        <p>
A few weeks ago, Joel Spolsky wrote a post entitled <a href="http://www.joelonsoftware.com/items/2007/09/18.html">Strategy
Letter VI</a> which I initially dismissed as the ravings of a desktop developer who
is trying to create an analogy when one doesn’t exist. The Web isn’t the desktop,
or didn’t he read <a href="http://jeremy.zawodny.com/blog/archives/009417.html">There
is no Web Operating System (or WebOS)</a>? By the second time I read it, I realized
that if you ignore some of the desktop-centric thinking in Joel’s article, then not
only is Joel’s article quite insightful but some of what he wrote is already coming
to pass. 
</p>
        <p>
The relevant excerpt from Joel’s article is 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>Somebody is going to write a compelling SDK that you can use to make powerful
Ajax applications with common user interface elements that work together. And whichever
SDK wins the most developer mindshare will have the same kind of competitive stronghold
as </em>
            <a href="http://www.joelonsoftware.com/articles/APIWar.html">
              <em>Microsoft
had with their Windows API</em>
            </a>
            <em>. </em>
          </p>
          <p>
            <em>If you’re a web app developer, and you don’t want to support the SDK everybody
else is supporting, you’ll increasingly find that people won’t use your web app, because
it doesn’t, you know, cut and paste and support address book synchronization and whatever
weird new interop features we’ll want in 2010.</em>
          </p>
          <p>
            <em>Imagine, for example, that you’re Google with GMail, and you’re feeling rather
smug. But then somebody you’ve never heard of, some bratty Y Combinator startup, maybe,
is gaining ridiculous traction selling NewSDK, </em>
          </p>
          <p>
            <em>…</em>
          </p>
          <p>
            <em>And while you’re not paying attention, everybody starts writing NewSDK apps, and
they’re really good, and suddenly businesses ONLY want NewSDK apps, and all those
old-school Plain Ajax apps look pathetic and won’t cut and paste and mash and sync
and play drums nicely with one another. And Gmail becomes a legacy. The WordPerfect
of Email. And you’ll tell your children how excited you were to get 2GB to store email,
and they’ll laugh at you. Their nail polish has more than 2GB.</em>
          </p>
          <p>
            <em>Crazy story? Substitute “Google Gmail” with “Lotus 1-2-3”. The NewSDK will be
the second coming of Microsoft Windows; this is exactly how Lotus lost control of
the spreadsheet market. And it’s going to happen again on the web because all
the same dynamics and forces are in place. The only thing we don’t know yet are the
particulars, but it’ll happen</em>
          </p>
        </blockquote>
        <p>
A lot of stuff Joel asserts seems pretty clueless on the face of it. Doesn’t he realize
that there are umpteen billion AJAX toolkits (e.g. Dojo, Google Web Toolkit, Yahoo!
User Interface Library, Script.aculo.us, etc)  and rich internet application
platforms (e.g. Flash, Silverlight, XUL, etc)? Doesn’t he realize that there isn’t
a snowball’s chance in hell of the entire Web conforming to standard user interface
guidelines let alone everyone agreeing on using the same programming language and
SDK to build Web apps? 
</p>
        <p>
But wait… 
</p>
        <p>
What happens if you re-read the above excerpt and substitute NewSDK with <a href="http://developer.facebook.com/">Facebook
platform</a>? 
</p>
        <p>
I didn’t <a href="http://www.25hoursaday.com/weblog/2007/08/30/TheDifferenceBetweenASocialNetworkSiteASocialGraphApplicationAndASocialOS.aspx">classify
Facebook as a Social Operating System</a> for no reason. GMail and other email
services have become less interesting to me because I primarily communicate with
friends and family on the Web via <a href="http://www.facebook.com/">Facebook</a><a href="http://www.facebook.com/"></a>and
it’s various platform applications. I’ve stopped playing casual games at <a href="http://games.yahoo.com/">Yahoo!
Games</a> and now use <a href="http://apps.facebook.com/scrabulous/">Scrabulous</a> and <a href="http://apps.facebook.com/texas_holdem/">Texas
Hold ‘Em</a> when I want to idle some time away on the weekend. All of these
applications are part of a consistent user interface, are all accessible from my sidebar and
each of them has access to my data within <a href="http://www.facebook.com/">Facebook</a> including
my social graph. Kinda like how Windows or Mac OS X desktop applications on my machine
have a consistent user interface, are all accessible from my applications menu
and can all access the data on my hard drive. 
</p>
        <p>
Hmmm…
</p>
        <p>
I suspect that Joel is right about NewSDK, he’s just wrong about which form it will
take. “Social operating system” does have a nice ring to it, doesn’t it? 
</p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Kanye West">Kanye
West</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Two Words (feat. Mos Def, Freeway &amp; The Harlem Boys Choir)&amp;artistTerm=Kanye West">Two
Words (feat. Mos Def, Freeway &amp; The Harlem Boys Choir)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=7b21c343-50de-44f1-b514-53d48ba39b33" />
      </body>
      <title>Joel Spolsky on Why the Facebook Platform is the Future of the Web</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,7b21c343-50de-44f1-b514-53d48ba39b33.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/10/04/JoelSpolskyOnWhyTheFacebookPlatformIsTheFutureOfTheWeb.aspx</link>
      <pubDate>Thu, 04 Oct 2007 03:00:23 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
This is another post I was planning to write a few weeks ago which got interrupted
by my wedding and honeymoon. &lt;img src="file:///C:/Program%20Files/BlogJet/Data/Smiles/smile3.gif"&gt;
&lt;/p&gt;
&lt;p&gt;
A few weeks ago, Joel Spolsky wrote a post entitled &lt;a href="http://www.joelonsoftware.com/items/2007/09/18.html"&gt;Strategy
Letter VI&lt;/a&gt; which I initially dismissed as the ravings of a desktop developer who
is trying to create an analogy when one doesn’t exist. The Web isn’t the desktop,
or didn’t he&amp;nbsp;read &lt;a href="http://jeremy.zawodny.com/blog/archives/009417.html"&gt;There
is no Web Operating System (or WebOS)&lt;/a&gt;?&amp;nbsp;By the second time I read it, I realized
that if you ignore some of the desktop-centric thinking in Joel’s article, then not
only is Joel’s article quite insightful but some of what he wrote is already coming
to pass. 
&lt;/p&gt;
&lt;p&gt;
The relevant excerpt from Joel’s article is 
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;Somebody is going to write a compelling SDK that you can use to make powerful
Ajax applications with common user interface elements that work together. And whichever
SDK wins the most developer mindshare will have the same kind of competitive stronghold
as &lt;/em&gt;&lt;a href="http://www.joelonsoftware.com/articles/APIWar.html"&gt;&lt;em&gt;Microsoft
had with their Windows API&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;If you’re a web app developer, and you don’t want to support the SDK everybody
else is supporting, you’ll increasingly find that people won’t use your web app, because
it doesn’t, you know, cut and paste and support address book synchronization and whatever
weird new interop features we’ll want in 2010.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Imagine, for example, that you’re Google with GMail, and you’re feeling rather
smug. But then somebody you’ve never heard of, some bratty Y Combinator startup, maybe,
is gaining ridiculous traction selling NewSDK, &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;…&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;And while you’re not paying attention, everybody starts writing NewSDK apps, and
they’re really good, and suddenly businesses ONLY want NewSDK apps, and all those
old-school Plain Ajax apps look pathetic and won’t cut and paste and mash and sync
and play drums nicely with one another. And Gmail becomes a legacy. The WordPerfect
of Email. And you’ll tell your children how excited you were to get 2GB to store email,
and they’ll laugh at you. Their nail polish has more than 2GB.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Crazy story? Substitute “Google Gmail” with “Lotus 1-2-3”. The NewSDK will be
the second coming of Microsoft Windows; this is exactly how Lotus lost control of
the spreadsheet market.&amp;nbsp;And it’s going to happen again on the web because all
the same dynamics and forces are in place. The only thing we don’t know yet are the
particulars, but it’ll happen&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
A lot of stuff Joel asserts seems pretty clueless on the face of it. Doesn’t he realize
that there are umpteen billion AJAX toolkits (e.g. Dojo, Google Web Toolkit, Yahoo!
User Interface Library, Script.aculo.us, etc) &amp;nbsp;and rich internet application
platforms (e.g. Flash, Silverlight, XUL, etc)? Doesn’t he realize that there isn’t
a snowball’s chance in hell of the&amp;nbsp;entire Web conforming to standard user interface
guidelines let alone everyone agreeing on using the same programming language and
SDK to build Web apps? 
&lt;/p&gt;
&lt;p&gt;
But wait… 
&lt;/p&gt;
&lt;p&gt;
What happens if you re-read the above excerpt and substitute NewSDK with &lt;a href="http://developer.facebook.com/"&gt;Facebook
platform&lt;/a&gt;? 
&lt;/p&gt;
&lt;p&gt;
I didn’t &lt;a href="http://www.25hoursaday.com/weblog/2007/08/30/TheDifferenceBetweenASocialNetworkSiteASocialGraphApplicationAndASocialOS.aspx"&gt;classify
Facebook as a Social Operating System&lt;/a&gt; for no reason.&amp;nbsp;GMail and other email
services have become less interesting to me&amp;nbsp;because I primarily communicate with
friends and family on the Web via &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;&lt;a href="http://www.facebook.com/"&gt; &lt;/a&gt;and
it’s&amp;nbsp;various platform applications. I’ve stopped playing casual games at &lt;a href="http://games.yahoo.com/"&gt;Yahoo!
Games&lt;/a&gt; and now use &lt;a href="http://apps.facebook.com/scrabulous/"&gt;Scrabulous&lt;/a&gt; and &lt;a href="http://apps.facebook.com/texas_holdem/"&gt;Texas
Hold ‘Em&lt;/a&gt;&amp;nbsp;when I want to idle some time away on the weekend. All of these
applications are part of a consistent user interface, are all accessible from my sidebar&amp;nbsp;and
each of them has&amp;nbsp;access to my&amp;nbsp;data within &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; including
my social graph. Kinda like how Windows or Mac OS X desktop applications on my machine
have a consistent user interface, are all accessible from my applications&amp;nbsp;menu
and can all access the data on my hard drive. 
&lt;/p&gt;
&lt;p&gt;
Hmmm…
&lt;/p&gt;
&lt;p&gt;
I suspect that Joel is right about NewSDK, he’s just wrong about which form it will
take. “Social operating system” does have a nice ring to it, doesn’t it? 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Kanye West"&gt;Kanye
West&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Two Words (feat. Mos Def, Freeway &amp;amp; The Harlem Boys Choir)&amp;amp;artistTerm=Kanye West"&gt;Two
Words (feat. Mos Def, Freeway &amp;amp; The Harlem Boys Choir)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=7b21c343-50de-44f1-b514-53d48ba39b33" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,7b21c343-50de-44f1-b514-53d48ba39b33.aspx</comments>
      <category>Platforms</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=42850ecd-a260-4dae-8f75-dc57e8edb6cd</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,42850ecd-a260-4dae-8f75-dc57e8edb6cd.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,42850ecd-a260-4dae-8f75-dc57e8edb6cd.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=42850ecd-a260-4dae-8f75-dc57e8edb6cd</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Recently I took a look at <a href="http://couchdb.org/">CouchDB</a> because I saw
it favorably mentioned by <a href="http://intertwingly.net/blog/2007/09/04/Building-CouchDB">Sam
Ruby</a> and when Sam says some technology is interesting, he’s always right. You
get the gist of CouchDB by reading the <a href="http://www.couchdbwiki.com/index.php?title=CouchDb_Quick_Overview">CouchDB
Quick Overview</a> and the <a href="http://www.couchdbwiki.com/index.php?title=Technical_Overview">CouchDB
technical overview</a>.  
</p>
        <p>
CouchDB is a distributed document-oriented database which means it is designed
to be a massively scalable way to store, query and manage documents. Two things that
are interesting right off the bat are that the primary interface to CouchDB is a <a href="http://www.couchdbwiki.com/index.php?title=HTTP_REST_API">RESTful
JSON API</a> and that queries are performed by <a href="http://www.couchdbwiki.com/index.php?title=HTTP_View_API#Defining">creating
the equivalent of stored procedures in Javascript</a> which are then applied
on each document in parallel. One thing that not so interesting is that
editing documents is lockless and utilizes <a href="http://en.wikipedia.org/wiki/Optimistic_concurrency_control">optimistic
concurrency</a> which means more work for clients. 
</p>
        <p>
As someone who <a href="http://xmldb-org.sourceforge.net/sixdml/sixdml-api.html">designed
and implemented an XML Database query language</a> back in the day, this all seems
strangely familiar. 
</p>
        <p>
So far, I like what I’ve seen but there seems to already be a bunch of incorrect hype
about the project which may damage it’s chances of success if it isn’t checked. Specifically
I’m talking about Assaf Arkin’s post <a href="http://blog.labnotes.org/2007/09/02/couchdb-thinking-beyond-the-rdbms/">CouchDB:
Thinking beyond the RDBMS</a> which seems chock full of incorrect assertions
and misleading information. 
</p>
        <p>
Assaf writes 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>This day, it happens to be </em>
            <a href="http://couchdb.org/">
              <em>CouchDB</em>
            </a>
            <em>.
And CouchDB on first look seems like the future of database without the weight that
is SQL and write consistency.</em>
          </p>
        </blockquote>
        <p>
          <a href="http://couchdb.org/">CouchDB</a> is a document oriented database which is <a href="http://www.rpbourret.com/xml/XMLAndDatabases.htm#storingretrievingdocs">nothing
new</a> [although focusing on JSON instead of XML makes it buzzword compliant] and
is definitely not a replacement/evolution of relational databases. In fact, the <a href="http://www.couchdbwiki.com/index.php?title=CouchDb_Quick_Overview#What_it_is_not">CouchDB
folks assert as much</a> in their overview document. 
</p>
        <p>
Document oriented database work well for semi-structured data where each item is mostly
independent and is often processed or retrieved in isolation. This describes a large
category of Web applications which are primarily about documents which may link to
each other but aren’t processed or requested often based on those links (e.g. blog
posts, email inboxes, RSS feeds, etc). However there are also lots of Web applications
that are about managing heavily structured, highly interrelated data (e.g. sites that
heavily utilize tagging or social networking) where the document-centric model doesn’t
quite fit. 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>Here’s where it gets interesting. <font color="#ff0000">There are no indexes</font>.
So your first option is knowing the name of the document you want to retrieve. The
second is referencing it from another document. And remember, it’s JSON in/JSON out,
with REST access all around, so relative URLs and you’re fine.</em>
          </p>
          <p>
            <em>But that still doesn’t explain the lack of indexes. CouchDB has something better.
It calls them views, but in fact those are computed tables. Computed using JavaScript.
So you feed (reminder: JSON over REST) it a set of functions, and you get a set of
queries for computed results coming out of these functions.</em>
          </p>
        </blockquote>
        <p>
Again, this is a claim that is <a href="http://www.couchdbwiki.com/index.php?title=Technical_Overview#View_Indexes">refuted
by the actual CouchDB documentation</a>. There are indexes, otherwise the system
would be ridiculously slow since you would have to run the function and
evaluate every single document in the database each time you ran one of these
views (i.e. the equivalent of a full table scan). Assaf probably meant to say that
there aren’t any relational database style indexes but…it isn’t a relational database
so that isn’t a useful distinction to make. 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <em>I’m personally convinced that write consistency is the reason RDBMS are imploding
under their own weight. Features like referential integrity, constraints and atomic
updates are really important in the client-server world, but irrelevant in a world
of services.</em>
          </p>
          <p>
            <em>You can do all of that in the service. And you can do better if you replace write
consistency with read consistency, making allowances for asynchronous updates, and
using functional programming in your code instead of delegating to SQL.</em>
          </p>
        </blockquote>
        <p>
I read these two paragraph five or six times and they still seem like gibberish to
me. Specifically, it seems silly to say that maintaining data consistency is important
in the client-server world but irrelevant in the world of services. Secondly, “<a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/intro.htm#i61063">Read
consistency</a>” and “<a href="http://tkyte.blogspot.com/2005/08/something-different-part-i-of-iii.html">write
consistency</a>” are not an either-or choice. They are both techniques used by database
management systems, like Oracle, to present a deterministic and consistent experience
when modifying, retrieving and manipulating large amounts of data. 
</p>
        <p>
In the world of online services, people are very aware of the <a href="http://citeseer.ist.psu.edu/544596.html">CAP
conjecture</a> and often <strong>choose availability over data consistency</strong> but
it is a conscious decision. For example, it is more important for Amazon that their
system is always available to users than it is that they <u>never</u> get an order
wrong every once in a while. See Pat Helland’s (ex-Amazon architect) example of a
how a business-centric approach to data consistency may shape one’s views from his
post <a href="http://blogs.msdn.com/pathelland/archive/2007/05/15/memories-guesses-and-apologies.aspx">Memories,
Guesses, and Apologies</a> where he writes
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
#1 - The application has only a single replica and makes a "decision" to ship the
widget on Wednesday.  This "decision" is sent to the user.
</p>
          <p>
#2 - The forklift pummels the widget to smithereens. 
</p>
          <p>
#3 - The application has no recourse but to apologize, informing the customer they
can have another widget in one month (after the incoming shipment arrives).
</p>
          <p>
#4 - Consider an alternate example with two replicas working independently. 
Replica-1 "decides" to ship the widget and sends that "decision" to User-1.
</p>
          <p>
#5 - Independently, Replica-2 makes a "decision" to ship the last remaining widget
to User-2.
</p>
          <p>
#6 - Replica-2 informs Replica-1 of its "decision" to ship the last remaining widget
to User-2.
</p>
          <p>
#7 - Replica-1 realizes that they are in trouble...  Bummer.
</p>
          <p>
#8 - Replica-1 tells User-1 that he guessed wrong.
</p>
          <p>
#9 - Note that the behavior experienced by the user in the first example is indistinguishable
from the experience of user-1 in the second example.
</p>
          <p>
            <strong>
              <u>Eventual Consistency and Crappy Computers</u>
            </strong>
          </p>
          <p>
Business realities force apologies.  To cope with these difficult realities,
we need code and, frequently, we need human beings to apologize.  It is essential
that businesses have both code and people to manage these apologies.
</p>
          <p>
…
</p>
          <p>
We try too hard as an industry.  Frequently, we build big and expensive datacenters
and deploy big and expensive computers.    
</p>
          <p>
In many cases, comparable behavior can be achieved with a lot of crappy machines which
cost less than the big expensive one.
</p>
        </blockquote>
        <p dir="ltr" style="MARGIN-RIGHT: 0px">
The problem described by Pat isn’t a failure of relational databases vs. document
oriented ones as Assaf’s implication would have us believe. It is the business reality
that <strong>availability is more important than data consistency for certain classes
of applications</strong>. A lot of the culture and technologies of the relational
database world are about preserving data consistency [which is a good thing because
I don’t want money going missing from my bank account because someone thought the
importance of write consistency is overstated] while the culture around Web applications
is about reaching scale cheaply while maintaining high availability in situations
where the occurence of data loss is unfortunate but not catastrophic (e.g. lost blog
comments, mistagged photos, undelivered friend requests, etc). 
</p>
        <p dir="ltr" style="MARGIN-RIGHT: 0px">
Even then most large scale Web applications that don’t utilize the relational database
features that are meant to enforce data consistency (triggers, foreign keys, transactions,
etc) still end up rolling their own app-specific solutions to handle data
consistency problems. However since these are tailored to their application they
are more performant than generic features which may exist in a relational database.  
</p>
        <p dir="ltr" style="MARGIN-RIGHT: 0px">
For further reading, see <a href="http://highscalability.com/flickr-architecture">an
Overview of the Flickr Architecture</a>.<a href="http://highscalability.com/flickr-architecture"></a></p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Raekwon">Raekwon</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Guillotine (Swordz) (feat. Ghostface Killah, Inspectah Deck &amp; GZA/Genius)&amp;artistTerm=Raekwon">Guillotine
(Swordz) (feat. Ghostface Killah, Inspectah Deck &amp; GZA/Genius)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=42850ecd-a260-4dae-8f75-dc57e8edb6cd" />
      </body>
      <title>Some Thoughts on CouchDB and Relational Databases</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,42850ecd-a260-4dae-8f75-dc57e8edb6cd.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/09/12/SomeThoughtsOnCouchDBAndRelationalDatabases.aspx</link>
      <pubDate>Wed, 12 Sep 2007 03:00:15 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Recently I took a look at &lt;a href="http://couchdb.org/"&gt;CouchDB&lt;/a&gt; because I saw
it favorably mentioned by &lt;a href="http://intertwingly.net/blog/2007/09/04/Building-CouchDB"&gt;Sam
Ruby&lt;/a&gt; and when Sam says some technology is interesting, he’s always right. You
get the gist of CouchDB by reading the &lt;a href="http://www.couchdbwiki.com/index.php?title=CouchDb_Quick_Overview"&gt;CouchDB
Quick Overview&lt;/a&gt;&amp;nbsp;and the &lt;a href="http://www.couchdbwiki.com/index.php?title=Technical_Overview"&gt;CouchDB
technical overview&lt;/a&gt;. &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
CouchDB is a distributed document-oriented database&amp;nbsp;which means it is designed
to be a massively scalable way to store, query and manage documents. Two things that
are interesting right off the bat are that the primary interface to CouchDB is a &lt;a href="http://www.couchdbwiki.com/index.php?title=HTTP_REST_API"&gt;RESTful
JSON API&lt;/a&gt; and that queries are performed by &lt;a href="http://www.couchdbwiki.com/index.php?title=HTTP_View_API#Defining"&gt;creating
the equivalent of stored procedures in Javascript&lt;/a&gt;&amp;nbsp;which are then applied
on each document in parallel. One thing that&amp;nbsp;not so&amp;nbsp;interesting is that
editing documents is lockless and utilizes &lt;a href="http://en.wikipedia.org/wiki/Optimistic_concurrency_control"&gt;optimistic
concurrency&lt;/a&gt; which means more work for clients. 
&lt;/p&gt;
&lt;p&gt;
As someone who &lt;a href="http://xmldb-org.sourceforge.net/sixdml/sixdml-api.html"&gt;designed
and implemented an XML Database query language&lt;/a&gt; back in the day, this all seems
strangely familiar. 
&lt;/p&gt;
&lt;p&gt;
So far, I like what I’ve seen but there seems to already be a bunch of incorrect hype
about the project which may damage it’s chances of success if it isn’t checked.&amp;nbsp;Specifically
I’m talking about Assaf Arkin’s post &lt;a href="http://blog.labnotes.org/2007/09/02/couchdb-thinking-beyond-the-rdbms/"&gt;CouchDB:
Thinking beyond the RDBMS&lt;/a&gt;&amp;nbsp;which seems chock full of incorrect assertions
and misleading information. 
&lt;/p&gt;
&lt;p&gt;
Assaf writes 
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;This day, it happens to be &lt;/em&gt;&lt;a href="http://couchdb.org/"&gt;&lt;em&gt;CouchDB&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.
And CouchDB on first look seems like the future of database without the weight that
is SQL and write consistency.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;a href="http://couchdb.org/"&gt;CouchDB&lt;/a&gt; is a document oriented database which is &lt;a href="http://www.rpbourret.com/xml/XMLAndDatabases.htm#storingretrievingdocs"&gt;nothing
new&lt;/a&gt; [although focusing on JSON instead of XML makes it buzzword compliant] and
is definitely not a replacement/evolution of relational databases. In fact, the &lt;a href="http://www.couchdbwiki.com/index.php?title=CouchDb_Quick_Overview#What_it_is_not"&gt;CouchDB
folks assert as much&lt;/a&gt; in their overview document. 
&lt;/p&gt;
&lt;p&gt;
Document oriented database work well for semi-structured data where each item is mostly
independent and is often processed or retrieved in isolation. This describes a large
category of Web applications which are primarily about documents which may link to
each other but aren’t processed or requested often based on those links (e.g. blog
posts, email inboxes, RSS feeds, etc). However there are also lots of Web applications
that are about managing heavily structured, highly interrelated data (e.g. sites that
heavily utilize tagging or social networking) where the document-centric model doesn’t
quite fit. 
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;Here’s where it gets interesting. &lt;font color=#ff0000&gt;There are no indexes&lt;/font&gt;.
So your first option is knowing the name of the document you want to retrieve. The
second is referencing it from another document. And remember, it’s JSON in/JSON out,
with REST access all around, so relative URLs and you’re fine.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;But that still doesn’t explain the lack of indexes. CouchDB has something better.
It calls them views, but in fact those are computed tables. Computed using JavaScript.
So you feed (reminder: JSON over REST) it a set of functions, and you get a set of
queries for computed results coming out of these functions.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Again, this is a claim that is &lt;a href="http://www.couchdbwiki.com/index.php?title=Technical_Overview#View_Indexes"&gt;refuted
by the actual CouchDB documentation&lt;/a&gt;. There are indexes, otherwise&amp;nbsp;the system
would be ridiculously slow&amp;nbsp;since you would have to run&amp;nbsp;the&amp;nbsp;function&amp;nbsp;and
evaluate every&amp;nbsp;single document in the database each time you ran one of these
views (i.e. the equivalent of a full table scan). Assaf probably meant to say that
there aren’t any relational database style indexes but…it isn’t a relational database
so that isn’t a useful distinction to make. 
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;em&gt;I’m personally convinced that write consistency is the reason RDBMS are imploding
under their own weight. Features like referential integrity, constraints and atomic
updates are really important in the client-server world, but irrelevant in a world
of services.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;You can do all of that in the service. And you can do better if you replace write
consistency with read consistency, making allowances for asynchronous updates, and
using functional programming in your code instead of delegating to SQL.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I read these two paragraph five or six times and they still seem like gibberish to
me. Specifically, it seems silly to say that maintaining data consistency is important
in the client-server world but irrelevant in the world of services. Secondly, “&lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/intro.htm#i61063"&gt;Read
consistency&lt;/a&gt;” and “&lt;a href="http://tkyte.blogspot.com/2005/08/something-different-part-i-of-iii.html"&gt;write
consistency&lt;/a&gt;” are not an either-or choice. They are both techniques used by database
management systems, like Oracle, to present a deterministic and consistent experience
when modifying, retrieving and manipulating large amounts of data. 
&lt;/p&gt;
&lt;p&gt;
In the world of online services, people are very aware of the &lt;a href="http://citeseer.ist.psu.edu/544596.html"&gt;CAP
conjecture&lt;/a&gt; and often &lt;strong&gt;choose availability over data consistency&lt;/strong&gt; but
it is a conscious decision. For example, it is more important for Amazon that their
system is always available to users than it is that they &lt;u&gt;never&lt;/u&gt; get an order
wrong every once in a while. See Pat Helland’s (ex-Amazon architect) example of a
how a business-centric approach to data consistency may shape one’s views from his
post &lt;a href="http://blogs.msdn.com/pathelland/archive/2007/05/15/memories-guesses-and-apologies.aspx"&gt;Memories,
Guesses, and Apologies&lt;/a&gt;&amp;nbsp;where he writes
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
#1 - The application has only a single replica and makes a "decision" to ship the
widget on Wednesday.&amp;nbsp; This "decision" is sent to the user.
&lt;/p&gt;
&lt;p&gt;
#2 - The forklift pummels the widget to smithereens. 
&lt;/p&gt;
&lt;p&gt;
#3 - The application has no recourse but to apologize, informing the customer they
can have another widget in one month (after the incoming shipment arrives).
&lt;/p&gt;
&lt;p&gt;
#4 - Consider an alternate example with two replicas working independently.&amp;nbsp;
Replica-1 "decides" to ship the widget and sends that "decision" to User-1.
&lt;/p&gt;
&lt;p&gt;
#5 - Independently, Replica-2 makes a "decision" to ship the last remaining widget
to User-2.
&lt;/p&gt;
&lt;p&gt;
#6 - Replica-2 informs Replica-1 of its "decision" to ship the last remaining widget
to User-2.
&lt;/p&gt;
&lt;p&gt;
#7 - Replica-1 realizes that they are in trouble...&amp;nbsp; Bummer.
&lt;/p&gt;
&lt;p&gt;
#8 - Replica-1 tells User-1 that he guessed wrong.
&lt;/p&gt;
&lt;p&gt;
#9 - Note that the behavior experienced by the user in the first example is indistinguishable
from the experience of user-1 in the second example.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Eventual Consistency and Crappy Computers&lt;/u&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Business realities force apologies.&amp;nbsp; To cope with these difficult realities,
we need code and, frequently, we need human beings to apologize.&amp;nbsp; It is essential
that businesses have both code and people to manage these apologies.
&lt;/p&gt;
&lt;p&gt;
…
&lt;/p&gt;
&lt;p&gt;
We try too hard as an industry.&amp;nbsp; Frequently, we build big and expensive datacenters
and deploy big and expensive computers.&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In many cases, comparable behavior can be achieved with a lot of crappy machines which
cost less than the big expensive one.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p dir=ltr style="MARGIN-RIGHT: 0px"&gt;
The problem described by Pat isn’t a failure of relational databases vs. document
oriented ones as Assaf’s implication would have us believe. It is the business reality
that &lt;strong&gt;availability is more important than data consistency for certain classes
of applications&lt;/strong&gt;. A lot of the culture and technologies of the relational
database world are about preserving data consistency [which is a good thing because
I don’t want money going missing from my bank account because someone thought the
importance of write consistency is overstated] while the culture around Web applications
is about reaching scale&amp;nbsp;cheaply while maintaining high availability in situations
where the occurence of data loss is unfortunate but not catastrophic (e.g. lost blog
comments, mistagged photos, undelivered friend requests, etc). 
&lt;/p&gt;
&lt;p dir=ltr style="MARGIN-RIGHT: 0px"&gt;
Even then most large scale Web applications that don’t utilize the relational database
features that are meant to enforce data consistency (triggers, foreign keys, transactions,
etc)&amp;nbsp;still end up rolling their own app-specific&amp;nbsp;solutions to handle data
consistency problems. However&amp;nbsp;since these are tailored to their application they
are more performant than generic features which may exist in a relational database.&amp;nbsp; 
&lt;/p&gt;
&lt;p dir=ltr style="MARGIN-RIGHT: 0px"&gt;
For further reading, see &lt;a href="http://highscalability.com/flickr-architecture"&gt;an
Overview of the Flickr Architecture&lt;/a&gt;.&lt;a href="http://highscalability.com/flickr-architecture"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Raekwon"&gt;Raekwon&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Guillotine (Swordz) (feat. Ghostface Killah, Inspectah Deck &amp;amp; GZA/Genius)&amp;amp;artistTerm=Raekwon"&gt;Guillotine
(Swordz) (feat. Ghostface Killah, Inspectah Deck &amp;amp; GZA/Genius)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=42850ecd-a260-4dae-8f75-dc57e8edb6cd" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,42850ecd-a260-4dae-8f75-dc57e8edb6cd.aspx</comments>
      <category>Platforms</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=54d8ce02-eaff-4db4-81c2-4cfdf371cbb9</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,54d8ce02-eaff-4db4-81c2-4cfdf371cbb9.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,54d8ce02-eaff-4db4-81c2-4cfdf371cbb9.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=54d8ce02-eaff-4db4-81c2-4cfdf371cbb9</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yesterday the Wall Street Journal had an article entitled <a href="http://online.wsj.com/article/SB118886348147516379.html">Why
So Many Want to Create Facebook Applications</a> which gives an overview of the
burst of activity surrounding the three month old <a href="http://developers.facebook.com/">Facebook
platform</a>. If a gold rush, complete with <a href="http://www.techcrunch.com/2007/07/09/bay-partners-launches-facebook-apps-only-fund/">dedicated
VC funds targetting widget developers</a>, around building embedded applications in
a social networking site sounds weirdly familar to you, that’s because it is. This
time last year people were saying the same thing about building <a href="http://www.myspace.com/">MySpace</a> widgets.
The conventional wisdom at the time was that sites like <a href="http://www.youtube.com/">YouTube</a> (acquired
for $1.65 billion) and <a href="http://www.photobucket.com/">PhotoBucket </a>(acquired
for $250 million) rose in popularity due to their MySpace widget strategy. 
</p>
        <p>
So, why would developers who’ve witnessed the success of companies developing <a href="http://www.myspace.com/">MySpace</a> widgets
rush to target a competing social networking site that has less users and requires
more code to integrate with the site? The answer is that <a href="http://www.myspace.com/">MySpace</a> made
the <strong>mistake of thinking that they were a distribution channel instead of a
platform</strong>. If you are a distribution channel, you hold all the cards. Without
you, they have no customers. On the other hand, if you are a platform vendor you realize
that it is a symbiotic relationship and you have to make people building on your platform
successful <em>because of</em> [not in spite of] your efforts. 
</p>
        <p>
Here are the three <em>classic</em> mistakes the folks at MySpace made which made
it possible for Facebook to steal their thunder and their widget developers. 
</p>
        <ol type="a">
          <li>
            <p>
              <strong>Actively Resent the Success of Developers on Your Platform:</strong> If you
are a platform vendor, you want developers building on your platform to be successful.
In contrast, <a href="http://www.techcrunch.com/2006/09/12/myspace-we-dont-need-web-20/">MySpace’s
executives publicly griped about the success of sites like YouTube and PhotoBucket</a> that
were “driven off the back of MySpace” and bragged about building competing services
which would become as popular as them since “60%-70% of their traffice came from MySpace”.
In a sign that things may have gotten out of hand is when <a href="http://news.com.com/8301-10784_3-6175179-7.html">MySpace
blocked PhotoBucket widgets</a> only to <a href="http://mashable.com/2007/05/07/photobucket-myspace-3/">acquire
the site a month later</a>, indicating that this was an aggresive negotiation tactic
intended to scare off potential buyers.  
</p>
          </li>
          <li>
            <p>
              <strong>Limit the Revenue Opportunities of Developers on Your Platform:</strong> MySpace
created all sorts of restrictions to make it difficult for widget developers to actually
make money directly from the site. For one, they <a href="http://www.techcrunch.com/2007/02/26/myspace-why-we-block-widgets/">blocked
any widget that contained advertising</a> even though advertising is the primary way
to make money on the Web. Secondly, <a href="http://www.techcrunch.com/2006/07/20/myspace-security-measure-disables-viral-spread-of-widgets/">they
restricted the options widgets had in linking back to the widget developers website</a> thus
driving users to where they could actually show them ads. Instead of trying to create
a win&lt;-&gt;win situation for widget developers (MySpace gets free features thus
more engagement from their users, widget developers get ad revenue and traffic) the
company tipped the balance excessively in their favor with little upside for
widget developers.  
</p>
          </li>
          <li>
            <p>
              <strong>Do Not Invest in Your Platform:</strong> For a company that depends so
much on developers building tiny applications that integrate into their site, it’s
quite amazing that <a href="http://www.myspace.com/">MySpace</a> does not provide any
APIs at all. Nor do they provide a structured way for their users to find, locate
and install widgets. It turns out that Fox Interactive Media (MySpace’s parent company)
did build a widget platform and gallery but <a href="http://avc.blogs.com/a_vc/2007/03/spring_widgets.html">due
to internal politics these services are not integrated</a>. In fact, one could say
that <a href="http://www.myspace.com/">MySpace</a> has done as little as possible
to making developing widgets for their platform a pleasant experience for developers
or their users.  
</p>
          </li>
        </ol>
        <p>
This is pretty much the story of all successful technology platforms that fall
out of favor. If you do not invest in your platform, it will become obsolete. If people
are always scared that you will cut off their air supply out of jealousy, they’ll
bolt the first chance they get. And if people can’t make money building on your platform,
then there is no reason for them to be there in the first place. Don’t make the same
mistakes. 
</p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=50%20Cent">50
Cent</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Many%20Men%20%28Wish%20Death%29&amp;artistTerm=50%20Cent">Many
Men (Wish Death)</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=54d8ce02-eaff-4db4-81c2-4cfdf371cbb9" />
      </body>
      <title>MySpace: How To Devalue a Platform in Three Easy Steps</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,54d8ce02-eaff-4db4-81c2-4cfdf371cbb9.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/09/05/MySpaceHowToDevalueAPlatformInThreeEasySteps.aspx</link>
      <pubDate>Wed, 05 Sep 2007 15:07:37 GMT</pubDate>
      <description>&lt;p&gt;
Yesterday the Wall Street Journal had an article entitled &lt;a href="http://online.wsj.com/article/SB118886348147516379.html"&gt;Why
So Many Want to Create Facebook Applications&lt;/a&gt;&amp;nbsp;which gives an overview of the
burst of activity surrounding the three month old &lt;a href="http://developers.facebook.com/"&gt;Facebook
platform&lt;/a&gt;. If a gold rush, complete with &lt;a href="http://www.techcrunch.com/2007/07/09/bay-partners-launches-facebook-apps-only-fund/"&gt;dedicated
VC funds targetting widget developers&lt;/a&gt;, around building embedded applications in
a social networking site sounds weirdly familar to you, that’s because it is. This
time last year people were saying the same thing about building &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;&amp;nbsp;widgets.
The conventional wisdom at the time was that sites like &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt; (acquired
for $1.65 billion) and &lt;a href="http://www.photobucket.com/"&gt;PhotoBucket &lt;/a&gt;(acquired
for $250 million) rose in popularity due to their MySpace widget strategy. 
&lt;/p&gt;
&lt;p&gt;
So, why would developers who’ve witnessed the success of companies developing &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;&amp;nbsp;widgets
rush to target a competing social networking site that has less users and requires
more code to integrate with the site? The answer is that &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;&amp;nbsp;made
the &lt;strong&gt;mistake of thinking that they were a distribution channel instead of a
platform&lt;/strong&gt;. If you are a distribution channel, you hold all the cards. Without
you, they have no customers. On the other hand, if you are a platform vendor you realize
that it is a symbiotic relationship and you have to make people building on your platform
successful &lt;em&gt;because of&lt;/em&gt; [not in spite of] your efforts. 
&lt;/p&gt;
&lt;p&gt;
Here are the three &lt;em&gt;classic&lt;/em&gt; mistakes the folks at MySpace made which made
it possible for Facebook to steal their thunder and their widget developers. 
&lt;/p&gt;
&lt;ol type="a"&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;Actively Resent the Success of Developers on Your Platform:&lt;/strong&gt; If you
are a platform vendor, you want developers building on your platform to be successful.
In contrast, &lt;a href="http://www.techcrunch.com/2006/09/12/myspace-we-dont-need-web-20/"&gt;MySpace’s
executives publicly griped about the success of sites like YouTube and PhotoBucket&lt;/a&gt; that
were “driven off the back of MySpace” and bragged about building competing services
which would become as popular as them since “60%-70% of their traffice came from MySpace”.
In a sign that things may have gotten out of hand is when &lt;a href="http://news.com.com/8301-10784_3-6175179-7.html"&gt;MySpace
blocked PhotoBucket widgets&lt;/a&gt;&amp;nbsp;only to &lt;a href="http://mashable.com/2007/05/07/photobucket-myspace-3/"&gt;acquire
the site a month later&lt;/a&gt;, indicating that this was an aggresive negotiation tactic
intended to scare off potential buyers. &amp;nbsp;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;Limit the Revenue Opportunities of Developers on Your Platform:&lt;/strong&gt; MySpace
created all sorts of restrictions to make it difficult for widget developers to actually
make money directly from the site. For one, they &lt;a href="http://www.techcrunch.com/2007/02/26/myspace-why-we-block-widgets/"&gt;blocked
any widget that contained advertising&lt;/a&gt; even though advertising is the primary way
to make money on the Web. Secondly, &lt;a href="http://www.techcrunch.com/2006/07/20/myspace-security-measure-disables-viral-spread-of-widgets/"&gt;they
restricted the options widgets had in linking back to the widget developers&amp;nbsp;website&lt;/a&gt; thus
driving users to where they could actually show them ads. Instead of trying to create
a win&amp;lt;-&amp;gt;win situation for widget developers (MySpace gets free features thus
more engagement from their users, widget developers get ad revenue and traffic)&amp;nbsp;the
company tipped the balance excessively in their favor&amp;nbsp;with little upside for
widget developers. &amp;nbsp;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;Do Not Invest in Your Platform:&lt;/strong&gt; For a&amp;nbsp;company that depends so
much on developers building tiny applications that integrate into their site, it’s
quite amazing that &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;&amp;nbsp;does not provide&amp;nbsp;any
APIs at all. Nor do they provide a structured way for their users to find, locate
and install widgets. It turns out that Fox Interactive Media (MySpace’s parent company)
did build a widget platform and gallery but &lt;a href="http://avc.blogs.com/a_vc/2007/03/spring_widgets.html"&gt;due
to internal politics these services are not integrated&lt;/a&gt;. In fact, one could say
that &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;&amp;nbsp;has done as little as possible
to making developing widgets for their platform&amp;nbsp;a pleasant experience for developers
or their users.&amp;nbsp; 
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
This is pretty much the story of all successful&amp;nbsp;technology platforms that fall
out of favor. If you do not invest in your platform, it will become obsolete. If people
are always scared that you will cut off their air supply out of jealousy, they’ll
bolt the first chance they get. And if people can’t make money building on your platform,
then there is no reason for them to be there in the first place. Don’t make the same
mistakes. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=50%20Cent"&gt;50
Cent&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Many%20Men%20%28Wish%20Death%29&amp;amp;artistTerm=50%20Cent"&gt;Many
Men (Wish Death)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=54d8ce02-eaff-4db4-81c2-4cfdf371cbb9" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,54d8ce02-eaff-4db4-81c2-4cfdf371cbb9.aspx</comments>
      <category>Competitors/Web Companies</category>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=ebce53a4-7eb3-4ab6-b25a-26cd7d9bd732</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,ebce53a4-7eb3-4ab6-b25a-26cd7d9bd732.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,ebce53a4-7eb3-4ab6-b25a-26cd7d9bd732.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=ebce53a4-7eb3-4ab6-b25a-26cd7d9bd732</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My job at Microsoft is working on the contacts platform that is utilized by a number
of Windows Live services. The contacts platform is a unified graph of the relationships
our users have created across Windows Live. It includes a user's <a href="http://mail.live.com">Windows
Live Hotmail</a> contacts, their <a href="http://spaces.live.com">Windows Live Spaces</a> friends,
their <a href="http://messenger.live.com">Windows Live Messenger</a> buddies and anyone
they've added to an access control list (e.g. people who can access their shared folders
in <a href="http://folders.live.com">Windows Live Skydrive</a> or the events in their <a href="http://en.wikipedia.org/wiki/Windows_Live_Calendar">calendar</a>).
Basically, a while ago <a href="http://www.microsoft.com/presspass/exec/irving/">one
of our execs</a> thought it didn't make sense to build a bunch of social software
applications each acting as a silo of user relationships and that instead we should
have a unified graph of the user to user relationships within Windows Live. Fast forward
a couple of years and we now have a clearer idea of the pros and cons of building
a unified social graph. 
</p>
        <p>
Given the above, it should be no surprise that I read Brad Fitzpatrick's <a href="http://bradfitz.com/social-graph-problem/">Thoughts
on the Social Graph</a> with keen interest since it overlaps significantly with my
day job. I was particularly interested in the outlined goals for the developers API
which are included below
</p>
        <blockquote>
          <p>
            <i>
              <a name="goals-devs">
                <b>For developers</b> who don't want to do their own graph
analysis from the raw data, the following high-level APIs should be provided: </a>
            </i>
          </p>
          <ol type="a">
            <li>
              <i>
                <b>Node Equivalence</b>, given a single node, say "brad on LiveJournal", return
all equivalent nodes: "brad" on LiveJournal, "bradfitz" on Vox, and 4caa1d6f6203d21705a00a7aca86203e82a9cf7a
(my FOAF mbox_sha1sum). See <a href="http://bradfitz.com/social-graph-problem/social-graph.pdf">the
slides</a> for more info.</i>
            </li>
            <li>
              <i>
                <b>Edges out and in, by node</b>. Find all outgoing edges (where edges are equivalence
claims, equivalence truths, friends, recommendations, etc). Also find all incoming
edges.</i>
            </li>
            <li>
              <i>
                <b>Find all of a node's aggregate friends from all equivalent nodes, expand all
those friends' equivalent nodes, and then filter on destination node type.</b> This
combines steps 1 and 2 and 1 in one call. For instance, <q>Given 'brad' on LJ, return
me all of Brad's friends, from all of his equivalent nodes, if those [friend] nodes
are either 'mbox_sha1sum' or 'Twitter' nodes.</q></i>
            </li>
            <li>
              <i>
                <b>Find missing friends of a node.</b> Given a node, expand all equivalent nodes,
find aggregate friends, expand them, and then report any missing edges. This is the
"let the user sync their social networking sites" API. It lets them know if they were
friends with somebody on Friendster and they didn't know they were both friends on
MySpace, they might want to be.</i>
            </li>
          </ol>
        </blockquote>
        <p>
        </p>
here are the top three problems Brad and the rest of the Google folks working on this
project will have to factor in as they chase the utopia that is a unified social graph. 
<br /><ol><li><p><b>Some Parts of the Graph are Private: </b>Although social networking sites with
publicly articulated social networks are quite popular (e.g. <a href="http://www.myspace.com">MySpace</a>)
there are a larger number of private or semi-private social networks that either can
only be viewed by the owner of the list (e.g. IM buddy lists) or some subset of the
graph (e.g. private profiles on social networking sites <a href="http://www.myspace.com">MySpace</a>, <a href="http://www.facebook.com">Facebook</a>, <a href="http://spaces.live.com">Windows
Live Spaces</a>, etc). The latter is especially tricky to deal with. In addition,
people often have more non-public articulated social networks (i.e. friends lists)
than public ones despite the popularity of social networking sites with public profiles. 
</p></li><li><p><b>Inadvertent Information Disclosure caused by Linking Nodes Across Social Networks:</b> The
"find missing friends of a node" feature in Brad's list sounds nice in theory but
it includes a number of issues that users often consider to be privacy violations
or just plain creepy. Let's say, I have <a href="http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&amp;friendID=36999739">Batman</a> on
my friend's list in <a href="http://www.myspace.com/">MySpace</a> because I think
the caped crusader is cool. Then I join <a href="http://www.livejournal.com">LiveJournal</a> and
it calls the find_missing_friends() API to identify which of my friends from other
sites are using <a href="http://www.livejournal.com">LiveJournal</a> and it find's <a href="http://mynameisbruce.livejournal.com/">Bruce
Wayne's LiveJournal</a>? Oops, an API call just revealed Batman's secret identity.
A less theoretical version of this problem occurred when we first integrated Windows
Live Spaces with Windows Live Messenger, and some of our Japanese beta users were
stunned to find that their supposedly anonymous blog postings were now a click away
for their IM buddies to see. I described this situation briefly in <a href="http://research.microsoft.com/workshops/SCS2005/speakers/Obasanjo.aspx">my
submission to the 2005 Social Computing Symposium</a>.
</p></li><li><p><b>All "Friends" aren't Created Equal:</b> Another problem is that most users don't
want all their "friends" available in all their applications. One capability we were
quite proud off at one time is that if you had <a href="http://www.microsoft.com/windowsmobile/microsoftprograms/pocketmsn.mspx">Pocket
MSN Messenger</a> then we merged the contacts on your cell phone with your IM and
email contacts. A lot of people were <a href="http://forum.xda-developers.com/archive/index.php/t-300339.html">less
than impressed by this behavior</a>. Someone you have on your IM buddy list isn't
necessarily someone you want in your cell phone address book. Over the years, I've
seen more examples of this than I can count. Being "friends" in one application does
not automatically mean that two users want to be "friends" in a completely different
context. 
<br /></p></li></ol><p>
These are the kinds of problems we've had to deal with on my team while also trying
to make this scale to being accessed by services utilized by hundreds of millions
of users. I've seen what it takes to build a system like this first hand and Brad
&amp; company have their work cut out for them. This is without considering the fact
that they may have to deal with ticked of users or ticked off social networking sites
depending on how exactly they plan to build this giant database of user friend lists. 
</p><p><b>PS:</b> In case any of this sounds interesting to you, <a href="http://www.25hoursaday.com/weblog/2006/01/27/WannaChangeTheWorldOfSocialSoftwareWereHiring.aspx">we're
always hiring</a>. :) 
</p><p></p><img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=ebce53a4-7eb3-4ab6-b25a-26cd7d9bd732" /></body>
      <title>The Problems Faced by a Unified Social Graph</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,ebce53a4-7eb3-4ab6-b25a-26cd7d9bd732.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/08/19/TheProblemsFacedByAUnifiedSocialGraph.aspx</link>
      <pubDate>Sun, 19 Aug 2007 01:56:39 GMT</pubDate>
      <description>&lt;p&gt;
My job at Microsoft is working on the contacts platform that is utilized by a number
of Windows Live services. The contacts platform is a unified graph of the relationships
our users have created across Windows Live. It includes a user's &lt;a href="http://mail.live.com"&gt;Windows
Live Hotmail&lt;/a&gt; contacts, their &lt;a href="http://spaces.live.com"&gt;Windows Live Spaces&lt;/a&gt; friends,
their &lt;a href="http://messenger.live.com"&gt;Windows Live Messenger&lt;/a&gt; buddies and anyone
they've added to an access control list (e.g. people who can access their shared folders
in &lt;a href="http://folders.live.com"&gt;Windows Live Skydrive&lt;/a&gt; or the events in their &lt;a href="http://en.wikipedia.org/wiki/Windows_Live_Calendar"&gt;calendar&lt;/a&gt;).
Basically, a while ago &lt;a href="http://www.microsoft.com/presspass/exec/irving/"&gt;one
of our execs&lt;/a&gt; thought it didn't make sense to build a bunch of social software
applications each acting as a silo of user relationships and that instead we should
have a unified graph of the user to user relationships within Windows Live. Fast forward
a couple of years and we now have a clearer idea of the pros and cons of building
a unified social graph. 
&lt;/p&gt;
&lt;p&gt;
Given the above, it should be no surprise that I read Brad Fitzpatrick's &lt;a href="http://bradfitz.com/social-graph-problem/"&gt;Thoughts
on the Social Graph&lt;/a&gt; with keen interest since it overlaps significantly with my
day job. I was particularly interested in the outlined goals for the developers API
which are included below
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
&lt;i&gt;&lt;a name="goals-devs"&gt;&lt;b&gt;For developers&lt;/b&gt; who don't want to do their own graph
analysis from the raw data, the following high-level APIs should be provided:&amp;nbsp;&lt;/a&gt;&lt;/i&gt; 
&lt;/p&gt;
&lt;ol type="a"&gt;
&lt;li&gt;
&lt;i&gt;&lt;b&gt;Node Equivalence&lt;/b&gt;, given a single node, say "brad on LiveJournal", return
all equivalent nodes: "brad" on LiveJournal, "bradfitz" on Vox, and 4caa1d6f6203d21705a00a7aca86203e82a9cf7a
(my FOAF mbox_sha1sum). See &lt;a href="http://bradfitz.com/social-graph-problem/social-graph.pdf"&gt;the
slides&lt;/a&gt; for more info.&lt;/i&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;i&gt;&lt;b&gt;Edges out and in, by node&lt;/b&gt;. Find all outgoing edges (where edges are equivalence
claims, equivalence truths, friends, recommendations, etc). Also find all incoming
edges.&lt;/i&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;i&gt;&lt;b&gt;Find all of a node's aggregate friends from all equivalent nodes, expand all
those friends' equivalent nodes, and then filter on destination node type.&lt;/b&gt; This
combines steps 1 and 2 and 1 in one call. For instance, &lt;q&gt;Given 'brad' on LJ, return
me all of Brad's friends, from all of his equivalent nodes, if those [friend] nodes
are either 'mbox_sha1sum' or 'Twitter' nodes.&lt;/q&gt;&lt;/i&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;i&gt;&lt;b&gt;Find missing friends of a node.&lt;/b&gt; Given a node, expand all equivalent nodes,
find aggregate friends, expand them, and then report any missing edges. This is the
"let the user sync their social networking sites" API. It lets them know if they were
friends with somebody on Friendster and they didn't know they were both friends on
MySpace, they might want to be.&lt;/i&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&lt;/p&gt;
here are the top three problems Brad and the rest of the Google folks working on this
project will have to factor in as they chase the utopia that is a unified social graph. 
&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
&lt;b&gt;Some Parts of the Graph are Private: &lt;/b&gt;Although social networking sites with
publicly articulated social networks are quite popular (e.g. &lt;a href="http://www.myspace.com"&gt;MySpace&lt;/a&gt;)
there are a larger number of private or semi-private social networks that either can
only be viewed by the owner of the list (e.g. IM buddy lists) or some subset of the
graph (e.g. private profiles on social networking sites &lt;a href="http://www.myspace.com"&gt;MySpace&lt;/a&gt;, &lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt;, &lt;a href="http://spaces.live.com"&gt;Windows
Live Spaces&lt;/a&gt;, etc). The latter is especially tricky to deal with. In addition,
people often have more non-public articulated social networks (i.e. friends lists)
than public ones despite the popularity of social networking sites with public profiles. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;b&gt;Inadvertent Information Disclosure caused by Linking Nodes Across Social Networks:&lt;/b&gt; The
"find missing friends of a node" feature in Brad's list sounds nice in theory but
it includes a number of issues that users often consider to be privacy violations
or just plain creepy. Let's say, I have &lt;a href="http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&amp;amp;friendID=36999739"&gt;Batman&lt;/a&gt; on
my friend's list in &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt; because I think
the caped crusader is cool. Then I join &lt;a href="http://www.livejournal.com"&gt;LiveJournal&lt;/a&gt; and
it calls the find_missing_friends() API to identify which of my friends from other
sites are using &lt;a href="http://www.livejournal.com"&gt;LiveJournal&lt;/a&gt; and it find's &lt;a href="http://mynameisbruce.livejournal.com/"&gt;Bruce
Wayne's LiveJournal&lt;/a&gt;? Oops, an API call just revealed Batman's secret identity.
A less theoretical version of this problem occurred when we first integrated Windows
Live Spaces with Windows Live Messenger, and some of our Japanese beta users were
stunned to find that their supposedly anonymous blog postings were now a click away
for their IM buddies to see. I described this situation briefly in &lt;a href="http://research.microsoft.com/workshops/SCS2005/speakers/Obasanjo.aspx"&gt;my
submission to the 2005 Social Computing Symposium&lt;/a&gt;.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;b&gt;All "Friends" aren't Created Equal:&lt;/b&gt; Another problem is that most users don't
want all their "friends" available in all their applications. One capability we were
quite proud off at one time is that if you had &lt;a href="http://www.microsoft.com/windowsmobile/microsoftprograms/pocketmsn.mspx"&gt;Pocket
MSN Messenger&lt;/a&gt; then we merged the contacts on your cell phone with your IM and
email contacts. A lot of people were &lt;a href="http://forum.xda-developers.com/archive/index.php/t-300339.html"&gt;less
than impressed by this behavior&lt;/a&gt;. Someone you have on your IM buddy list isn't
necessarily someone you want in your cell phone address book. Over the years, I've
seen more examples of this than I can count. Being "friends" in one application does
not automatically mean that two users want to be "friends" in a completely different
context. 
&lt;br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
These are the kinds of problems we've had to deal with on my team while also trying
to make this scale to being accessed by services utilized by hundreds of millions
of users. I've seen what it takes to build a system like this first hand and Brad
&amp;amp; company have their work cut out for them. This is without considering the fact
that they may have to deal with ticked of users or ticked off social networking sites
depending on how exactly they plan to build this giant database of user friend lists. 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;PS:&lt;/b&gt; In case any of this sounds interesting to you, &lt;a href="http://www.25hoursaday.com/weblog/2006/01/27/WannaChangeTheWorldOfSocialSoftwareWereHiring.aspx"&gt;we're
always hiring&lt;/a&gt;. :) 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=ebce53a4-7eb3-4ab6-b25a-26cd7d9bd732" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,ebce53a4-7eb3-4ab6-b25a-26cd7d9bd732.aspx</comments>
      <category>Platforms</category>
      <category>Social Software</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=087e1f77-886d-4fcc-80c2-74e2c5e5d2f5</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,087e1f77-886d-4fcc-80c2-74e2c5e5d2f5.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,087e1f77-886d-4fcc-80c2-74e2c5e5d2f5.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=087e1f77-886d-4fcc-80c2-74e2c5e5d2f5</wfw:commentRss>
      <title>Thoughts on the Facebook Data Store API</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,087e1f77-886d-4fcc-80c2-74e2c5e5d2f5.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/08/17/ThoughtsOnTheFacebookDataStoreAPI.aspx</link>
      <pubDate>Fri, 17 Aug 2007 02:11:50 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
I learned about the &lt;a href="http://wiki.developers.facebook.com/index.php/Data_Store_API_documentation"&gt;Facebook
Data Store API&lt;/a&gt; yesterday from a &lt;a href="http://blog.broadbandmechanics.com/2007/08/first-blog-links-since-back-in-the-us-of-a"&gt;post
by Marc Canter&lt;/a&gt;. The API is intended to meet the storage needs of developers building &lt;strike&gt;widgets&lt;/strike&gt; applications
on the &lt;a href="http://developer.facebook.com/"&gt;Facebook &lt;strike&gt;widget&lt;/strike&gt; platform&lt;/a&gt;.
Before we decide if the API meets the needs of developers, we need to list what these
needs are in the first place. A developer building a widget or application for a social
network&amp;rsquo;s widget platform such as a &lt;a href="http://gallery.live.com/default.aspx?pl=5"&gt;gadget&lt;/a&gt;&amp;nbsp;for &lt;a href="http://spaces.live.com/"&gt;Windows
Live Spaces&lt;/a&gt; or an application for the Facebook platform needs to store 
&lt;/p&gt;
&lt;ol type="i"&gt;
&lt;li&gt;
Static resources that will be consumed or executed on the client such as images, stylesheets
and script files. Microsoft provides this kind of hosting for gadget developers&amp;nbsp;via &lt;a href="http://gallery.live.com/"&gt;Windows
Live Gallery&lt;/a&gt;. This is all the storage needed for a gadget such as &lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=8af7eb96-971f-4d14-90bc-2fed6ce92a45&amp;amp;bt=7&amp;amp;pl=5"&gt;GMT
clock&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;
User preferences and settings related to the gadget. In many cases, a gadget may provide&amp;nbsp;a
personalized view of data (e.g. my &lt;a href="http://www.netflix.com/"&gt;Netflix&lt;/a&gt; queue
or the local weather) or may simply have configuration options specific to the user
which need to be saved. Microsoft provides &lt;a href="http://microsoftgadgets.com/livesdk/docs/faq.htm#Code.5"&gt;APIs
for getting, setting and deleting preferences&lt;/a&gt; as part of it&amp;rsquo;s Web gadgets
framework.&amp;nbsp;My &lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=2b6b67c2-db7a-452d-90f3-7509f473cf46"&gt;Flickr
badge gadget&lt;/a&gt; is an example of the kind of gadget that requires this level of storage. 
&lt;/li&gt;
&lt;li&gt;
The application&amp;rsquo;s server-side code and application specific databases.&amp;nbsp;This
is&amp;nbsp;the equivalent of the&amp;nbsp;&lt;abbr title="Linux Apache MySQL PHP/Python/Perl"&gt;
LAMP
&lt;/abbr&gt;
or 
&lt;abbr title="Windows IIS SQL Server C#"&gt;
WISC
&lt;/abbr&gt;
hosting you get from a typical Web hosting provider. No social networking site provides
this for widget/gadget developers today. The &lt;a href="http://www.techcrunch.com/2007/05/25/facebook-users-really-like-music-ilike-is-most-popular-application/"&gt;iLike
Facebook application&lt;/a&gt; is an example of the kind of application that requires this
level of &amp;ldquo;storage&amp;rdquo; or at this&amp;nbsp;level it should probably be called
app hosting. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;now href="http://wiki.developers.facebook.com/index.php/Data_Store_API_documentation" &lt;a the how see let&amp;rsquo;s developer, widget a for needs storage typical of list have we that&gt;
Now that we have an idea of the data storage needs of Web widget/gadget developers,
we can&amp;nbsp;now&amp;nbsp;discuss how the&amp;nbsp;&lt;a href="http://wiki.developers.facebook.com/index.php/Data_Store_API_documentation"&gt;Facebook
Data Store API&lt;/a&gt;&amp;nbsp;measures up. The API consists of three broad classes of methods;
User Preferences, Persistent Objects and Associations. All methods can return results
as XML, JSON or &lt;a href="http://ajaxian.com/archives/jsonp-json-with-padding"&gt;JSONP&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
It is currently unclear if the&amp;nbsp;API is intended to be RESTful or not since there
is scant documentation of the wire format of requests or responses.&amp;nbsp; 
&lt;/p&gt;
&lt;h4&gt;User Preferences 
&lt;/h4&gt;
&lt;p&gt;
&lt;table border="1"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
Object Definition methods&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.setUserPreference" href="http://wiki.developers.facebook.com/index.php/Data.setUserPreference"&gt;data.setUserPreference&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
update one preference 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.setUserPreferences" href="http://wiki.developers.facebook.com/index.php/Data.setUserPreferences"&gt;data.setUserPreferences&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
update multiple preferences in batch 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getUserPreference" href="http://wiki.developers.facebook.com/index.php/Data.getUserPreference"&gt;data.getUserPreference&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get one preference of a user 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getUserPreferences" href="http://wiki.developers.facebook.com/index.php/Data.getUserPreferences"&gt;data.getUserPreferences&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get all preferences of a user&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
These methods are used to store key value pairs which may represent user preferences
or settings for an application. There is a limit of 201 key&amp;lt;-&amp;gt;value pairs which
can be stored per user. The&amp;nbsp;keys are numeric values from 0 &amp;ndash; 200 and the
maximum length of a preference value is 128 characters.&amp;nbsp; 
&lt;/p&gt;
&lt;h4&gt;Persistent Objects
&lt;/h4&gt;
&lt;p&gt;
&lt;table border="1"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
Object Definition methods&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.createObjectType" href="http://wiki.developers.facebook.com/index.php/Data.createObjectType"&gt;data.createObjectType&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
create a new object type 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.dropObjectType" href="http://wiki.developers.facebook.com/index.php/Data.dropObjectType"&gt;data.dropObjectType&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
delete an object type and all objects of this type 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.renameObjectType" href="http://wiki.developers.facebook.com/index.php/Data.renameObjectType"&gt;data.renameObjectType&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
rename an object type 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.defineObjectProperty" href="http://wiki.developers.facebook.com/index.php/Data.defineObjectProperty"&gt;data.defineObjectProperty&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
add a new property 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.undefineObjectProperty" href="http://wiki.developers.facebook.com/index.php/Data.undefineObjectProperty"&gt;data.undefineObjectProperty&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
remove a previously defined property 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.renameObjectProperty" href="http://wiki.developers.facebook.com/index.php/Data.renameObjectProperty"&gt;data.renameObjectProperty&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
rename a previously defined property 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getObjectTypes" href="http://wiki.developers.facebook.com/index.php/Data.getObjectTypes"&gt;data.getObjectTypes&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get a list of all defined object types 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getObjectType" href="http://wiki.developers.facebook.com/index.php/Data.getObjectType"&gt;data.getObjectType&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get detailed definition of an object type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Developers can create new types which are analogous to SQL tables especially when
you consider terminology like &amp;ldquo;drop&amp;rdquo; object, the ability to add new properties/columns
to the type&amp;nbsp;and&amp;nbsp;being able to retrieve the&amp;nbsp;schema &amp;nbsp;of the type
which are all more common in relational database world than in object oriented programming. 
&lt;table border="1"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
Object Manipulation methods&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;p&gt;
&amp;nbsp; 
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.createObject" href="http://wiki.developers.facebook.com/index.php/Data.createObject"&gt;data.createObject&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
create a new object 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.updateObject" href="http://wiki.developers.facebook.com/index.php/Data.updateObject"&gt;data.updateObject&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
update an object's properties 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.deleteObject" href="http://wiki.developers.facebook.com/index.php/Data.deleteObject"&gt;data.deleteObject&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
delete an object by its id 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.deleteObjects" href="http://wiki.developers.facebook.com/index.php/Data.deleteObjects"&gt;data.deleteObjects&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
delete multiple objects by ids 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getObject" href="http://wiki.developers.facebook.com/index.php/Data.getObject"&gt;data.getObject&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get an object's properties by its id 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getObjects" href="http://wiki.developers.facebook.com/index.php/Data.getObjects"&gt;data.getObjects&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get properties of a list of objects by ids 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getObjectProperty" href="http://wiki.developers.facebook.com/index.php/Data.getObjectProperty"&gt;data.getObjectProperty&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get an object's one property 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.setObjectProperty" href="http://wiki.developers.facebook.com/index.php/Data.setObjectProperty"&gt;data.setObjectProperty&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
set an object's one property 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getHashValue" href="http://wiki.developers.facebook.com/index.php/Data.getHashValue"&gt;data.getHashValue&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get a property value by a hash key 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.setHashValue" href="http://wiki.developers.facebook.com/index.php/Data.setHashValue"&gt;data.setHashValue&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
set a property value by a hash key 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.incHashValue" href="http://wiki.developers.facebook.com/index.php/Data.incHashValue"&gt;data.incHashValue&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
increment/decrement a property valye by a hash key 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.removeHashKey" href="http://wiki.developers.facebook.com/index.php/Data.removeHashKey"&gt;data.removeHashKey&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
delete an object by its hash key 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.removeHashKeys" href="http://wiki.developers.facebook.com/index.php/Data.removeHashKeys"&gt;data.removeHashKeys&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
delete multiple objects by their hash keys&lt;/td&gt;
&lt;/tr&gt;
&lt;/p&gt;
&gt;&gt;
&lt;p&gt;
This aspect of the API is almost self explanatory, you create an object type (e.g.
a &lt;code&gt;movie&lt;/code&gt;) then manipulate instances of this object using the above APIs.
Each object can be accessed via a numeric ID or a string hash value. The object&amp;rsquo;s
numeric ID is obtained when you first create the object although it isn&amp;rsquo;t clear
how you obtain an object&amp;rsquo;s hash key. It also seems like there is no generic
query mechanism so you need to store the numeric IDs or hash keys of the objects you
are interested in somewhere so you don&amp;rsquo;t have to enumerate all objects looking
for them later. Perhaps with the preferences API? 
&lt;p&gt;
&gt;
&lt;/p&gt;
&lt;h4&gt;Associations
&lt;/h4&gt;
&lt;table border="1"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
Association Definition methods&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;p&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.defineAssociation" href="http://wiki.developers.facebook.com/index.php/Data.defineAssociation"&gt;data.defineAssociation&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
create a new object association 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.undefineAssociation" href="http://wiki.developers.facebook.com/index.php/Data.undefineAssociation"&gt;data.undefineAssociation&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
remove a previously defined association and all its data 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.renameAssociation" href="http://wiki.developers.facebook.com/index.php/Data.renameAssociation"&gt;data.renameAssociation&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
rename a previously defined association 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getAssociationDefinition" href="http://wiki.developers.facebook.com/index.php/Data.getAssociationDefinition"&gt;data.getAssociationDefinition&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get definition of a previously defined association 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getAssociationDefinitions" href="http://wiki.developers.facebook.com/index.php/Data.getAssociationDefinitions"&gt;data.getAssociationDefinitions&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get definitions of all previously defined associations&lt;/td&gt;
&lt;/tr&gt;
&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
An association is a named relationship between two objects. For example, "works_with"
could be an association between two &lt;code&gt;user&lt;/code&gt; objects. Associations don't
have to be between the same types (e.g. a "works_at" could be an association between
a &lt;code&gt;user&lt;/code&gt; object and a &lt;code&gt;company&lt;/code&gt; object). Associations take me
back to &lt;a href="http://blogs.msdn.com/winfs/archive/2006/06/23/644706.aspx"&gt;WinFS &lt;/a&gt;and &lt;strike&gt;son
of WinFS&lt;/strike&gt; &lt;a href="http://msdn2.microsoft.com/en-us/library/Aa697428(VS.80).aspx"&gt;Entity
Data Model&lt;/a&gt;&amp;nbsp;which has a notion of a &lt;a href="http://msdn2.microsoft.com/en-us/library/Aa697428(VS.80).aspx#adonet_edm_topic2"&gt;RelationshipType&lt;/a&gt; that
is very similar to the above notion of an association. It is also similar to the notion
of an &lt;a href="http://www.w3.org/TR/rdf-concepts/#section-triples"&gt;RDF triple&lt;/a&gt; but
not quite. 
&lt;/p&gt;
&lt;p&gt;
&lt;table border="1"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
Association Manipulation methods&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.setAssociation" href="/index.php/Data.setAssociation"&gt;data.setAssociation&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
create an association between two objects 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.setAssociations" href="/index.php/Data.setAssociations"&gt;data.setAssociations&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
create a list of associations between pairs of objects 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.removeAssociation" href="/index.php/Data.removeAssociation"&gt;data.removeAssociation&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
remove an association between two objects 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.removeAssociations" href="/index.php/Data.removeAssociations"&gt;data.removeAssociations&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
remove associations between pairs of objects 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.removeAssociatedObjects" href="/index.php/Data.removeAssociatedObjects"&gt;data.removeAssociatedObjects&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
remove all associations of an object 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getAssociatedObjects" href="/index.php/Data.getAssociatedObjects"&gt;data.getAssociatedObjects&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get ids of an object's associated objects 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getAssociatedObjectCount" href="/index.php/Data.getAssociatedObjectCount"&gt;data.getAssociatedObjectCount&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get count of an object's associated objects 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getAssociatedObjectCounts" href="/index.php/Data.getAssociatedObjectCounts"&gt;data.getAssociatedObjectCounts&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get counts of associated objects of a list of objects. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
* &lt;a title="Data.getAssociations" href="/index.php/Data.getAssociations"&gt;data.getAssociations&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
get all associations between two objects 
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
All of these methods should be self explanatory. Although I think this association
stuff is pretty sweet, I&amp;rsquo;m unclear as to where all of this is expected to fall
in the hierarchy of needs of an Facebook application. The preferences stuff is a no
brainer. The persistent object and association APIs could be treated as a very rich
preferences API by developers but this doesn&amp;rsquo;t seem to be living up to their
potential. On the other hand, without providing something closer to an app hosting
platform like Amazon has done with EC2 + S3, I&amp;rsquo;m not sure there is any other
use for them by Web developers using the Facebook platform. 
&lt;/p&gt;
&lt;p&gt;
Have I missed something here? 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=UGK"&gt;UGK&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=International Players Anthem (feat. Outkast)&amp;amp;artistTerm=UGK"&gt;International
Players Anthem (feat. Outkast)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=087e1f77-886d-4fcc-80c2-74e2c5e5d2f5" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,087e1f77-886d-4fcc-80c2-74e2c5e5d2f5.aspx</comments>
      <category>Platforms</category>
    </item>
    <item>
      <trackback:ping>http://www.25hoursaday.com/weblog/Trackback.aspx?guid=b8df6e9b-b8f1-4159-a9bf-617cdcf5f60e</trackback:ping>
      <pingback:server>http://www.25hoursaday.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.25hoursaday.com/weblog/PermaLink,guid,b8df6e9b-b8f1-4159-a9bf-617cdcf5f60e.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://www.25hoursaday.com/weblog/CommentView,guid,b8df6e9b-b8f1-4159-a9bf-617cdcf5f60e.aspx</wfw:comment>
      <wfw:commentRss>http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b8df6e9b-b8f1-4159-a9bf-617cdcf5f60e</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently I've seen a bunch of people I consider to be really smart sing the praises
of <a href="http://lucene.apache.org/hadoop/">Hadoop</a> such as Sam Ruby in his post <a href="http://intertwingly.net/blog/2007/08/12/Long-Bets">Long
Bets</a>, Tim O’Reilly in his post <a href="http://radar.oreilly.com/archives/2007/08/yahoos_bet_on_h.html">Yahoo!’s
Bet on Hadoop</a>, and Bill de hÓra in his post <a href="http://www.dehora.net/journal/2007/08/phat_data.html">Phat
Data</a>. I haven’t dug too deeply into <a href="http://lucene.apache.org/hadoop/">Hadoop</a> due
to the fact that the legal folks at work will chew out my butt if I did, there a number
of little niggling doubts that make me wonder if this is the savior of the world that
all these geeks claim it will be. Here are some random thoughts that have made me
skeptical 
</p>
        <ol>
          <li>
            <p>
              <strong>
                <u>Code Quality:</u>
              </strong> Hadoop was started by <a href="http://developer.yahoo.net/blog/archives/2007/07/hadoop_creator_yahoo_doug_cutting_oscon.html">Doug
Cutting who created Lucene and Nutch</a>. I don’t know much about Nutch but I am quite
familiar with <a href="http://lucene.apache.org/">Lucene </a>because we adopted it
for use in <a href="http://www.rssbandit.org/">RSS Bandit</a>. This is probably the
worst decision we’ve made in the entire history of <a href="http://www.rssbandit.org/">RSS
Bandit</a>. Not only are the <a href="http://www.25hoursaday.com/weblog/2007/03/05/APIHallOfShameLucenesIndexReaderAndIndexWriter.aspx">APIs
a usability nightmare</a> because they were poorly hacked out then never refactored, the
code is also <a href="http://www.mail-archive.com/lucene-net-user@incubator.apache.org/msg00272.html">notoriously
flaky when it comes to dealing with concurrency</a> so common advice is to never
use multiple threads to do anything with <a href="http://lucene.apache.org/">Lucene</a>. 
</p>
          </li>
        </ol>
        <p>
        </p>
        <li>
          <p>
            <strong>
              <u>Incomplete Specifications:</u>
            </strong>
            <a href="http://wiki.apache.org/lucene-hadoop/HadoopMapReduce">Hadoop’s
MapReduce </a>and <a href="http://lucene.apache.org/hadoop/hdfs_design.html">HDFS</a> are
a re-implementation of Google’s <a href="http://labs.google.com/papers/mapreduce.html">MapReduce </a>and <a href="http://labs.google.com/papers/gfs.html">Google
File System (GFS)</a>  technologies. However it seems unwise to base a project
on research papers that may not reveal all the details needed to implement the service
for competitive reasons. For example, the Hadoop documentation is silent on how it
plans to deal with the election of a primary/master server among peers especially
in the face of machine failure which Google solves using the <a href="http://glinden.blogspot.com/2006/09/chubby-google-distributed-lock-manager.html">Chubby
lock service</a>. It just so happens that there is a research paper that describes <a href="http://labs.google.com/papers/chubby.html">Chubby </a>but
how many other services within Google’s data centers do <a href="http://labs.google.com/papers/mapreduce.html">MapReduce</a> and <a href="http://labs.google.com/papers/gfs.html">Google
File System (GFS)</a>  depend on which are yet to have their own public research
paper? Speaking of which, where are the Google research papers on their message queueing
infrastructure? You know they have to have one, right? How about their caching layer?
Where are the papers on Google’s version of <a href="http://www.danga.com/memcached/">memcached</a>?Secondly,
what is the likelihood that Google will be as forthcoming with these papers now that
they know competitors like Yahoo! are knocking off their internal architecture? 
</p>
        </li>
        <li>
          <p>
            <strong>
              <u>A Search Optimized Architecture isn’t for Everyone:</u>
            </strong> One of
the features of <a href="http://labs.google.com/papers/mapreduce.html">MapReduce</a> is
that one can move the computation close to the data because “Moving Computation is
Cheaper than Moving Data”. This is especially important when you are doing lots of
processing intensive operations such as the kind of data analysis that goes into creating
the Google search index. However what if you’re a site whose main tasks are reading
and writing lots of data (e.g. <a href="http://www.myspace.com/">MySpace</a>) or sending
lots of transient messages back and forth yet ensuring that they always arrive in
the right order (e.g. <a href="http://www.25hoursaday.com/weblog/2007/06/26/GoogleScalabilityConferenceTripReportLessonsInBuildingScalableSystems.aspx">Google
Talk</a>) then these optimizations and capabilities aren’t much use to you and a different
set of tools would serve you better.  
</p>
        </li>
        <p>
I believe there are a lot of lessons that can be learned from how the distributed
systems that power the services behind Google, Amazon and the like. However I think
it is waaaay to early to be crowning some knock off of one particular vendors internal
infrastructure as the future of distributed computing as we know it. 
</p>
        <p>
Seriously.
</p>
        <p>
          <strong>PS:</strong> Yes, I realize that Sam and Bill are primarily pointing
out the increasing importance of parellel programming as it relates to the dual trends
of (i) almost major website that ends up dealing with lots of data
and has lots of traffic eventually eschews relational database features like joins,
normalization, triggers and transactions because they are not cost effective and (ii)
the increased large amounts of data that the we generate and now have to process due
to falling storage costs. Even though their mentions of <a href="http://lucene.apache.org/hadoop/">Hadoop</a> are
incidental it still seems to me that it’s almost become a meme, one which deserves
more scrutiny before we jump on that particular band wagon.  
</p>
        <p>
          <strong>Now playing:</strong>
          <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=N.W.A.">N.W.A.</a> - <a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Appetite%20For%20Destruction&amp;artistTerm=N.W.A.">Appetite
For Destruction</a></p>
        <img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b8df6e9b-b8f1-4159-a9bf-617cdcf5f60e" />
      </body>
      <title>Some Thoughts on Hadoop</title>
      <guid isPermaLink="false">http://www.25hoursaday.com/weblog/PermaLink,guid,b8df6e9b-b8f1-4159-a9bf-617cdcf5f60e.aspx</guid>
      <link>http://www.25hoursaday.com/weblog/2007/08/14/SomeThoughtsOnHadoop.aspx</link>
      <pubDate>Tue, 14 Aug 2007 02:19:31 GMT</pubDate>
      <description>&lt;p&gt;
Recently I've seen a bunch of people I consider to be really smart sing the praises
of &lt;a href="http://lucene.apache.org/hadoop/"&gt;Hadoop&lt;/a&gt; such as Sam Ruby in his post &lt;a href="http://intertwingly.net/blog/2007/08/12/Long-Bets"&gt;Long
Bets&lt;/a&gt;, Tim O’Reilly in his post &lt;a href="http://radar.oreilly.com/archives/2007/08/yahoos_bet_on_h.html"&gt;Yahoo!’s
Bet on Hadoop&lt;/a&gt;, and Bill de hÓra in his post &lt;a href="http://www.dehora.net/journal/2007/08/phat_data.html"&gt;Phat
Data&lt;/a&gt;. I haven’t dug too deeply into &lt;a href="http://lucene.apache.org/hadoop/"&gt;Hadoop&lt;/a&gt;&amp;nbsp;due
to the fact that the legal folks at work will chew out my butt if I did, there a number
of little niggling doubts that make me wonder if this is the savior of the world that
all these geeks claim it will be. Here are some random thoughts that have made me
skeptical 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Code Quality:&lt;/u&gt;&lt;/strong&gt; Hadoop was started by &lt;a href="http://developer.yahoo.net/blog/archives/2007/07/hadoop_creator_yahoo_doug_cutting_oscon.html"&gt;Doug
Cutting who created Lucene and Nutch&lt;/a&gt;. I don’t know much about Nutch but I am quite
familiar with &lt;a href="http://lucene.apache.org/"&gt;Lucene &lt;/a&gt;because we adopted it
for use in &lt;a href="http://www.rssbandit.org/"&gt;RSS Bandit&lt;/a&gt;. This is probably the
worst decision we’ve made in the entire history of &lt;a href="http://www.rssbandit.org/"&gt;RSS
Bandit&lt;/a&gt;. Not only are the &lt;a href="http://www.25hoursaday.com/weblog/2007/03/05/APIHallOfShameLucenesIndexReaderAndIndexWriter.aspx"&gt;APIs
a usability nightmare&lt;/a&gt; because they were poorly hacked out then never refactored,&amp;nbsp;the
code is also&amp;nbsp;&lt;a href="http://www.mail-archive.com/lucene-net-user@incubator.apache.org/msg00272.html"&gt;notoriously
flaky when it comes to dealing with concurrency&lt;/a&gt;&amp;nbsp;so common advice is to never
use multiple threads to do anything with &lt;a href="http://lucene.apache.org/"&gt;Lucene&lt;/a&gt;. 
&lt;/p&gt;
&lt;/li&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Incomplete Specifications:&lt;/u&gt;&lt;/strong&gt; &lt;a href="http://wiki.apache.org/lucene-hadoop/HadoopMapReduce"&gt;Hadoop’s
MapReduce &lt;/a&gt;and &lt;a href="http://lucene.apache.org/hadoop/hdfs_design.html"&gt;HDFS&lt;/a&gt;&amp;nbsp;are
a re-implementation of Google’s &lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;MapReduce &lt;/a&gt;and &lt;a href="http://labs.google.com/papers/gfs.html"&gt;Google
File System (GFS)&lt;/a&gt;&amp;nbsp; technologies. However it seems unwise to base a project
on research papers that may not reveal all the details needed to implement the service
for competitive reasons. For example, the Hadoop documentation is silent on how it
plans to deal with the election of a primary/master server among peers especially
in the face of machine failure which Google solves using the &lt;a href="http://glinden.blogspot.com/2006/09/chubby-google-distributed-lock-manager.html"&gt;Chubby
lock service&lt;/a&gt;. It just so happens that there is a research paper that describes &lt;a href="http://labs.google.com/papers/chubby.html"&gt;Chubby &lt;/a&gt;but
how many other services within Google’s data centers do &lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;MapReduce&lt;/a&gt;&amp;nbsp;and &lt;a href="http://labs.google.com/papers/gfs.html"&gt;Google
File System (GFS)&lt;/a&gt;&amp;nbsp; depend on which are yet to have their own public research
paper? Speaking of which, where are the Google research papers on their message queueing
infrastructure? You know they have to have one, right? How about their caching layer?
Where are the papers on Google’s version of &lt;a href="http://www.danga.com/memcached/"&gt;memcached&lt;/a&gt;?Secondly,
what is the likelihood that Google will be as forthcoming with these papers now that
they know competitors like Yahoo! are knocking off their internal architecture? 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;A Search Optimized Architecture isn’t for Everyone:&lt;/u&gt;&lt;/strong&gt; One of
the&amp;nbsp;features of &lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;MapReduce&lt;/a&gt;&amp;nbsp;is
that one can move the computation close to the data because “Moving Computation is
Cheaper than Moving Data”. This is especially important when you are doing lots of
processing intensive operations such as the kind of data analysis that goes into creating
the Google search index. However what if you’re a site whose main tasks are reading
and writing lots of data (e.g. &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt;) or sending
lots of transient messages back and forth yet ensuring that they always arrive in
the right order (e.g. &lt;a href="http://www.25hoursaday.com/weblog/2007/06/26/GoogleScalabilityConferenceTripReportLessonsInBuildingScalableSystems.aspx"&gt;Google
Talk&lt;/a&gt;) then these optimizations and capabilities aren’t much use to you and a different
set of tools would serve you better.&amp;nbsp; 
&lt;/p&gt;
&lt;/li&gt;&gt;
&lt;p&gt;
I believe there are a lot of lessons that can be learned from how the distributed
systems that power the services behind Google, Amazon and the like. However I think
it is waaaay to early to be crowning some knock off of one particular vendors internal
infrastructure as the future of distributed computing as we know it. 
&lt;/p&gt;
&lt;p&gt;
Seriously.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;PS:&lt;/strong&gt; Yes, I realize that Sam and Bill are&amp;nbsp;primarily pointing
out the increasing importance of parellel programming as it relates to the dual trends
of (i)&amp;nbsp;almost major website&amp;nbsp;that ends&amp;nbsp;up dealing with lots of data
and has lots of traffic eventually eschews relational database features like joins,
normalization, triggers and transactions because they are not cost effective and (ii)
the increased large amounts of data that the we generate and now have to process due
to falling storage costs. Even though their mentions of &lt;a href="http://lucene.apache.org/hadoop/"&gt;Hadoop&lt;/a&gt;&amp;nbsp;are
incidental it still seems to me that it’s almost become a meme, one which deserves
more scrutiny before we jump&amp;nbsp;on that particular band wagon.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=N.W.A."&gt;N.W.A.&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Appetite%20For%20Destruction&amp;amp;artistTerm=N.W.A."&gt;Appetite
For Destruction&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.25hoursaday.com/weblog/aggbug.ashx?id=b8df6e9b-b8f1-4159-a9bf-617cdcf5f60e" /&gt;</description>
      <comments>http://www.25hoursaday.com/weblog/CommentView,guid,b8df6e9b-b8f1-4159-a9bf-617cdcf5f60e.aspx</comments>
      <category>Platforms</category>
    </item>
  </channel>
</rss>