<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us">
  <title>Dare Obasanjo aka Carnage4Life</title>
  <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/" />
  
  <icon>favicon.ico</icon>
  <updated>2009-06-04T08:11:59.6596581-07:00</updated>
  <author>
    <name>Dare Obasanjo</name>
  </author>
  <subtitle>You can buy cars but you can't buy respect in the 'hood - Curtis Jackson</subtitle>
  <id>http://www.25hoursaday.com/weblog/</id>
  <generator uri="http://dasblog.info/" version="2.1.8102.813">DasBlog</generator>
  <logo>http://members.microsoft.com/careers/epdb/image/i_mop_ProfID58_l.jpg</logo><link rel="self" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetRss" type="application/atom+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">Carnage4life</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="2" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b00b3839-d8d6-4669-ba1c-06debd6baf84" />
    <total xmlns="http://purl.org/syndication/thread/1.0">2</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=b00b3839-d8d6-4669-ba1c-06debd6baf84" title="2 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b00b3839-d8d6-4669-ba1c-06debd6baf84</commentRss>
    <title>Developers on Google Wave</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/06/04/DevelopersOnGoogleWave.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=b00b3839-d8d6-4669-ba1c-06debd6baf84</id>
    <published>2009-06-04T08:11:59.6596581-07:00</published>
    <updated>2009-06-04T08:11:59.6596581-07:00</updated>
    <category term="Platforms" label="Platforms" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Platforms" />
    <category term="Web Development" label="Web Development" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Web+Development" />
    <content type="html">&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;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=l5lGjfCnSlc:avz-d0hBglg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=l5lGjfCnSlc:avz-d0hBglg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=l5lGjfCnSlc:avz-d0hBglg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=l5lGjfCnSlc:avz-d0hBglg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=l5lGjfCnSlc:avz-d0hBglg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=l5lGjfCnSlc:avz-d0hBglg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=l5lGjfCnSlc:avz-d0hBglg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=l5lGjfCnSlc:avz-d0hBglg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=l5lGjfCnSlc:avz-d0hBglg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/l5lGjfCnSlc" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="8" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f9e410be-ad67-4c4c-9076-e096c61c293d" />
    <total xmlns="http://purl.org/syndication/thread/1.0">8</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=f9e410be-ad67-4c4c-9076-e096c61c293d" title="8 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f9e410be-ad67-4c4c-9076-e096c61c293d</commentRss>
    <title>A closer look at the upcoming RSS Bandit ribbon</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/31/ACloserLookAtTheUpcomingRSSBanditRibbon.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=f9e410be-ad67-4c4c-9076-e096c61c293d</id>
    <published>2009-05-31T13:32:06.8898383-07:00</published>
    <updated>2009-05-31T13:42:06.3624249-07:00</updated>
    <category term="RSS Bandit" label="RSS Bandit" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=RSS+Bandit" />
    <content type="html">&lt;p&gt;
In between watching the &lt;a href="http://www.youtube.com/watch?v=v_UyVmITiYQ"&gt;Google
Wave video&lt;/a&gt; and &lt;a href="http://www.imdb.com/title/tt1010048/"&gt;Slumdog Millionaire&lt;/a&gt;,
I got around to completing the first set of tabs for the ribbon in &lt;a href="http://www.rssbandit.org"&gt;RSS
Bandit&lt;/a&gt;. Screenshots are below, as usual let me know what you think. 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1piJadPfx1xNrUWi5oeC3lnVpP_LULA7RqVnbA71biJFypmv_T86v9fo8jLlPN2UbG7gXnVmaWmn6FIC_oII7gUw/rssbandit%20home%20tab.PNG" width="604" height="409" /&gt; 
&lt;p&gt;
&lt;u&gt;Fig 1:&lt;/u&gt; The home tab. This is the default tab on launching the application.
I like that formerly hidden features of the application like subscribing to newsgroups
and managing podcasts are now front and center without having to compromise on the
common tasks that people want to perform. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pEhL2HO6OU8HYfrB47mGkF_gbU9HTce7V5D8Pd17RL7zX2cp031w-pAwzbpLti0HzGJWD-5rxXbcDP9V61x5aeA/rssbandit%20feedsource.png" width="599" height="403" /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Fig 2:&lt;/u&gt; The ability to synchronize RSS Bandit with your Google Reader or NewsGator
Online feeds is also now a lot more discoverable instead of being hidden in some obscure
menu with an obscure name (&amp;quot;Synchronize Feeds&amp;quot;).&amp;#160; 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pj8XasflEs4J03mufRLKDu-brk6n47DH9sGJ0uWBSdhJIuud5iLhW0cBZLCyr-npuWnLKPZRc3OPQ-R6IyOw1VQ/rssbandit%20folder%20tab.PNG" width="603" height="407" /&gt; 
&lt;p&gt;
&lt;u&gt;Fig 3:&lt;/u&gt; The folder tab. This is menu is contextual and becomes selected when
you click on a folder in the tree view. There are two features I’d like to call out
in this view; Rules and Filters. 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pSDibyuWf5DHRo8MEMnWlDdsVDbL33O633jmecpYtU08vktwYRjCcGOZBrjq5HnzmpQIS9rUMpFO7nfjsFkjdYg/rssbandit%20rules.png" /&gt; 
&lt;p&gt;
&lt;u&gt;Fig 4:&lt;/u&gt; The rules tool is where we’ll end up placing existing and new options
on behavior the user would like executed on receipt or viewing of new content. 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pbdyOq98w_D9Sfov7BjDHSYHXjbNDTWS_nKb9ltpHuM-YKynmrK_fpy_z0rWOpafWlQut8KLMUe2NsAt_KzJmvQ/rssbandit%20filter.png" /&gt; 
&lt;p&gt;
&lt;u&gt;Fig 5:&lt;/u&gt; The filter tool is used for filtering the items that show up in the
list view. We've had several requests for this feature over the past few years but
couldn’t figure out an elegant way to incorporate it into the user interface. 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1p_hWkwP2z3BQzkjDPfQsJr42bAjfBWMgqY8haxyQNpHi6Y6QO98dGtcVpj6Dq1L4Eapops88M8P1r8G_zpBD2_g/rssbandit%20feed%20tab.PNG" width="589" height="373" /&gt; 
&lt;p&gt;
&lt;u&gt;Fig 6:&lt;/u&gt; The feed tab. This is a contextual tab that is selected when you click
on a feed in the tree view. One feature that I love which is now properly highlighted
is that we support creating new posts in feeds that support this such as newsgroups
(existing feature) or posting a new status update on Facebook if you have hooked it
up as a feed source (new feature). 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1piiGUgBDnoUPWuEyiUrLkUoH_M0VwkawrYjpxHgxsiVTCczVcHOz356EeyRMoVn-v8GsK3JqdF6N--5w9npfVFw/rssbandit%20item%20tab.PNG" /&gt; 
&lt;p&gt;
&lt;u&gt;Fig 7:&lt;/u&gt; The item tab. This is the contextual tab that is highlighted when you
select an item in the list view. There are no new features highlighted here. What
we do think will be interesting is if we make it straightforward for existing and
new &lt;a href="http://haacked.com/archive/2006/06/05/DotNetKicksIBlogExtensionPluginForRSSBanditAndOthers.aspx"&gt;IBlogExtension
plugins&lt;/a&gt; to end up showing up in the item tab. So you should think of this tab
as being extensible and should expect that some of our existing plugins (e.g. &amp;quot;Email
This&amp;quot;, &amp;quot;Post to Twitter&amp;quot;, etc) will also end up in this tab. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=_Uwbb2-FWs8:3DHi_sWbE-g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=_Uwbb2-FWs8:3DHi_sWbE-g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=_Uwbb2-FWs8:3DHi_sWbE-g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=_Uwbb2-FWs8:3DHi_sWbE-g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=_Uwbb2-FWs8:3DHi_sWbE-g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=_Uwbb2-FWs8:3DHi_sWbE-g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=_Uwbb2-FWs8:3DHi_sWbE-g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=_Uwbb2-FWs8:3DHi_sWbE-g:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=_Uwbb2-FWs8:3DHi_sWbE-g:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/_Uwbb2-FWs8" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="6" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=acbccc0c-3f20-480c-9aad-f5e351d6cfb7" />
    <total xmlns="http://purl.org/syndication/thread/1.0">6</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=acbccc0c-3f20-480c-9aad-f5e351d6cfb7" title="6 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=acbccc0c-3f20-480c-9aad-f5e351d6cfb7</commentRss>
    <title>Twitter: We’re all celebrities now</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/27/TwitterWereAllCelebritiesNow.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=acbccc0c-3f20-480c-9aad-f5e351d6cfb7</id>
    <published>2009-05-27T08:36:09.6759642-07:00</published>
    <updated>2009-05-27T08:36:09.6759642-07:00</updated>
    <category term="Social Software" label="Social Software" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Social+Software" />
    <content type="html">&lt;p&gt;
A few days ago, Jeff Atwood responded to &lt;a href="http://twitter.com/Carnage4Life/status/1916880191"&gt;one
of my status messages&lt;/a&gt; on Twitter with &lt;a href="http://twitter.com/codinghorror/status/1916918615"&gt;the
following response&lt;/a&gt; of his own 
&lt;/p&gt;
&lt;blockquote&gt;&lt;img title="r @carnage4life you keep saying that, and yet that doesn&amp;#39;t make it true. Twitter is Facebook without all the annoying bullshit on top" alt="r @carnage4life you keep saying that, and yet that doesn&amp;#39;t make it true. Twitter is Facebook without all the annoying bullshit on top" src="http://farm3.static.flickr.com/2441/3570347948_0ce1d6c5a3.jpg" width="428" height="223" /&gt;&amp;#160;&lt;/blockquote&gt; 
&lt;p&gt;
This is a good opportunity to talk about what Twitter brings to the table as a social
software application (as opposed to the &lt;a href="http://search.live.com/results.aspx?q=twitter+google+killer&amp;amp;src=IE-SearchBox&amp;amp;Form=IE8SRC"&gt;Twitter
as Google Killer meme&lt;/a&gt;). Twitter currently positions itself as a microblogging
platform which is implies that it’s like blogging just smaller. A blog is often two
things, first of all it’s about personal publishing platform for one or more people
to share their opinions and knowledge with the world. The second thing is that it
is the community of people who read that blog and the conversations they have about
it on the site. The second is usually embodied by comments on the blog. In fact some,
like Jeff Atwood, have argued that &lt;a href="http://www.codinghorror.com/blog/archives/000538.html"&gt;a
blog without comments isn’t really a blog&lt;/a&gt;. As Jeff writes
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;I firmly maintain that &lt;/em&gt;&lt;a href="http://www.codinghorror.com/blog/archives/000421.html"&gt;&lt;em&gt;a
blog without comments enabled is not a blog&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. It's more like a &lt;b&gt;church
pulpit&lt;/b&gt;. You preach the word, and the audience passively receives your evangelical
message. Straight from God's lips to their ears. When the sermon is over, the audience
shuffles out of the church, inspired for another week. And there's definitely no question
and answer period afterward. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;img alt="the church pulpit" src="http://www.codinghorror.com/blog/images/preacher-pulpit.jpg" width="454" height="349" /&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Of course, I'm exaggerating for comedic effect. Maybe a blog with comments disabled
is more analogous to a newspaper editorial. But even with a newspaper editorial, readers
can make public comments by sending a letter to the editor, which may be published
in a later edition of the pap&lt;/em&gt;er.
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
When you look at a blog such as &lt;a href="http://mashable.com/"&gt;Mashable&lt;/a&gt; and compare
it its &lt;a href="http://twitter.com/mashable"&gt;Twitter counterpart&lt;/a&gt; or even &lt;a href="http://www.codinghorror.com/blog/"&gt;Jeff
Atwood’s blog&lt;/a&gt; versus &lt;a href="http://twitter.com/codinghorror"&gt;his Twitter account&lt;/a&gt;,
it seems clear which is more of church pulpit where the audience passively receives
your evangelical message versus a forum for two way communication between the audience
and the author. 
&lt;/p&gt;
&lt;p&gt;
An interesting dynamic that Twitter has added to personal publishing that doesn’t
have a good analog in blogging is the notion of a public list of subscribers to the
publisher’s content with links to every one of them and a fairly pejorative name for
them&amp;#160; “followers”.&amp;#160; This feature has led to both micro and macro celebrities
engaging in games to see who can amass the most fans with the most notable public
display being &lt;a title="CNN: Ashton Kutcher challenges CNN to Twitter popularity contest" href="http://www.cnn.com/2009/TECH/04/15/ashton.cnn.twitter.battle/"&gt;the
race between Ashton Kutcher and CNN to a million followers&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Twitter takes blogging to the next level as a platform for building and encouraging
celebrity. The other side of this is poignantly captured in James Governor’s post &lt;a href="http://www.redmonk.com/jgovernor/2009/03/16/a-truth-behind-asymmetric-follow-on-sadness-fans-and-fantasy/"&gt;A
truth of Asymmetric Follow: On sadness, fans and fantasy&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Well last week I had a chance to walk in the fan’s shoes, and of course I learned
a lot, while trying to build buzz for our charitable efforts for &lt;/em&gt;&lt;a href="http://www.redmonk.com/jgovernor/2009/03/12/building-a-wall-out-of-red-noses-one-tweet-at-a-time/"&gt;&lt;em&gt;Red
Nose Day&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. I have to admit I hated it. I *really* wanted to get the attention
of @wossy or @stephenfry. Could I? Of course not. These guys have day jobs…&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;But it was only on spending a lot of time surfing around user profiles to check
for spambots that I discovered how profoundly depressing the celebrities on Twitter
phenomenon can be. It was coming across profiles of Twitter users following ten or
so celebrities on Twitter (and nobody else), wondering why their questions weren’t
being answered. Why are they ignoring me, I keep asking them questions? After I saw
a few of these profiles I felt a little depressed. &lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
From this perspective it is unsurprising that tech celebrities like Jeff Atwood &amp;amp;
Robert Scoble and real-world celebrities like Ashton Kutcher &amp;amp; John Mayer love
the Twitter dynamic. Similarly, it is also unsurprising that &lt;a title="Nielsen Wire: Twitter Quitters Post Roadblock to Long-Term Growth" href="http://blog.nielsen.com/nielsenwire/online_mobile/twitter-quitters-post-roadblock-to-long-term-growth/"&gt;over
60% of users abandon the service within the first month&lt;/a&gt;. After all, we aren’t
all celebrities. 
&lt;/p&gt;
&lt;p&gt;
In its current form, Twitter is growing primarily as a platform for celebrities, wannabe
celebrities and their fans. The key thing to note is that celebrity here isn’t limited
to the kind of people you read about in &lt;a href="http://www.people.com"&gt;People magazine&lt;/a&gt; and &lt;a href="http://www.usmagazine.com/"&gt;US
Weekly&lt;/a&gt;. For example, I use Twitter to follow web technology celebrities like &lt;a href="http://twitter.com/timoreilly"&gt;Tim
O'Reilly&lt;/a&gt; and &lt;a href="http://twitter.com/shanselman"&gt;Scott Hanselman&lt;/a&gt;. On the
other hand, my wife uses Twitter follows popular mommy bloggers like &lt;a href="http://twitter.com/McMommyblog"&gt;McMommy&lt;/a&gt; and &lt;a href="http://twitter.com/ninasplayground"&gt;Playground
for Parents&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Going back to Jeff Atwood’s twitter message, I don’t consider Twitter to be Facebook
with the annoying bullshit stripped out. For the most part, the Facebook experience
has focused on being away to bring your offline relationships to the web. This is
captured in the current home page design which proclaims that &lt;em&gt;Facebook helps you
connect and share with the people in your life&lt;/em&gt;. 
&lt;/p&gt;
&lt;img src="http://www.atelier-us.com/upload/2008/09/facebook_homepage.PNG" width="643" height="359" /&gt; 
&lt;p&gt;
From my perspective, this goal has more widespread appeal and utility than being a
next generation platform for celebrity on the Web. Your mileage may vary. 
&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=Kid Cudi&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;Kid
Cudi&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Kid Cudi+Day N Nite (remix) (feat. Jim Jones &amp;amp; Trey Songz)&amp;amp;x=0&amp;amp;y=0"&gt;Day
N Nite (remix) (feat. Jim Jones &amp;amp; Trey Songz)&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;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=s4eyB4AmrpY:LBYERVFo6Vo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=s4eyB4AmrpY:LBYERVFo6Vo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=s4eyB4AmrpY:LBYERVFo6Vo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=s4eyB4AmrpY:LBYERVFo6Vo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=s4eyB4AmrpY:LBYERVFo6Vo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=s4eyB4AmrpY:LBYERVFo6Vo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=s4eyB4AmrpY:LBYERVFo6Vo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=s4eyB4AmrpY:LBYERVFo6Vo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=s4eyB4AmrpY:LBYERVFo6Vo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/s4eyB4AmrpY" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="6" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2e70d0d4-fdb4-442a-acd7-aef51641003a" />
    <total xmlns="http://purl.org/syndication/thread/1.0">6</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=2e70d0d4-fdb4-442a-acd7-aef51641003a" title="6 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2e70d0d4-fdb4-442a-acd7-aef51641003a</commentRss>
    <title>Preview of Facebook Comments in RSS Bandit and the Ribbon</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/25/PreviewOfFacebookCommentsInRSSBanditAndTheRibbon.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=2e70d0d4-fdb4-442a-acd7-aef51641003a</id>
    <published>2009-05-24T22:15:54.5241611-07:00</published>
    <updated>2009-05-26T13:40:09.6681728-07:00</updated>
    <category term="RSS Bandit" label="RSS Bandit" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=RSS+Bandit" />
    <content type="html">&lt;p&gt;
I’ve made some more progress in integrating the Facebook news feed into the next version
of &lt;a href="http://www.rssbandit.org"&gt;RSS Bandit&lt;/a&gt; currently codenamed &lt;em&gt;Colossus&lt;/em&gt;.
This weekend I completed the addition of support for viewing and replying to comments
in the news feed. So here are some screenshots of current comment workflow for interacting
with Facebook comments 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pyCET1Iev9_ZSHfHpzsr08gda5lQX9tjwaiurm1E4GLR1fYi6_mmG2NhoYNtov99QuGmoa9lCl_xFRt-hsaw4PA/comment_fb.PNG" width="619" height="455" /&gt; 
&lt;p&gt;
Fig 1: Viewing the comments in response to a &lt;a href="http://twitter.com/anildash/status/1895527891"&gt;funny
status update from Anil Dash&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1ppTzwl8K6o2oEekNJBkidZ22a5Y9UnRb-BnJivJWAwqDDhMD-GlEER2AC4_sqE1Fgf1pUjjt87cXfBfVev5TAYg/post_comment_fb.png" width="615" height="450" /&gt; 
&lt;p&gt;
Fig 2: Responding to the comment by pressing &amp;quot;Ctrl + R&amp;quot; or right-clicking
and selecting Post Reply. 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pzAEcSZSoCObeJywb_N6fbzMYhi_DrlP4oCsOGyjv6we4Qof3uqurKxvqR-tV8v0ETDGdbQih3mWvtKXlCtsmWA/facebook_comment.PNG" /&gt; 
&lt;p&gt;
Fig 3: The news feed on Facebook with the comment posted from RSS Bandit
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
The second major change coming in the &lt;em&gt;Colossus&lt;/em&gt; release is the adoption of
the design elements from the &lt;a href="http://office.microsoft.com/en-us/products/HA101679411033.aspx"&gt;Microsoft
Office fluent user interface&lt;/a&gt; such as the ribbon, contextual tabs, galleries and
live preview. To prepare for this change, we’re first building a prototype of the
redesigned user interface and once we’re happy with it we will start refactoring the
RSS Bandit application to enable swapping out our existing menus and taskbars with
the new interface. 
&lt;/p&gt;
&lt;p&gt;
Here’s where we are in the design prototype for next release. Let me know what you
think in the comments. 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;img src="http://farm4.static.flickr.com/3617/3567283987_fa25f49fc0.jpg?v=0" /&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=4A0Q8GOjgk0:ljVVnu8lz2I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=4A0Q8GOjgk0:ljVVnu8lz2I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=4A0Q8GOjgk0:ljVVnu8lz2I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=4A0Q8GOjgk0:ljVVnu8lz2I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=4A0Q8GOjgk0:ljVVnu8lz2I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=4A0Q8GOjgk0:ljVVnu8lz2I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=4A0Q8GOjgk0:ljVVnu8lz2I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=4A0Q8GOjgk0:ljVVnu8lz2I:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=4A0Q8GOjgk0:ljVVnu8lz2I:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/4A0Q8GOjgk0" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="3" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=488d967b-136e-42e1-b837-0737bbc2fc9b" />
    <total xmlns="http://purl.org/syndication/thread/1.0">3</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=488d967b-136e-42e1-b837-0737bbc2fc9b" title="3 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=488d967b-136e-42e1-b837-0737bbc2fc9b</commentRss>
    <title>OpenID’s Tipping Point</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/22/OpenIDsTippingPoint.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=488d967b-136e-42e1-b837-0737bbc2fc9b</id>
    <published>2009-05-22T06:54:53.0157356-07:00</published>
    <updated>2009-05-22T06:54:53.0157356-07:00</updated>
    <category term="Web Development" label="Web Development" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Web+Development" />
    <content type="html">&lt;p&gt;
In the past week or so, two of the biggest perception problems preventing proliferation
of OpenID as the de facto standard for decentralized identity on the Web have been
addressed. The first perception problem is around the issue of usability. I remember
attending the &lt;a href="http://sgfoocamp08.pbworks.com/"&gt;Social Graph Foo Camp&lt;/a&gt; last
year and chatting with a Yahoo! employee about why they hadn’t become an Open ID relying
party (i.e. enable people to login to Yahoo! account with OpenIDs). The response was
that they had concerns about the usability of OpenID causing reducing the number of
successful log-ins given that it takes the user off the Yahoo! sign-in page to an &lt;a title="Ned Batchelder: OpenID is too hard" href="http://nedbatchelder.com/blog/200809/openid_is_too_hard.html"&gt;often
confusing and poorly designed page&lt;/a&gt; created by a third party. 
&lt;/p&gt;
&lt;p&gt;
Last year’s launch and eventually success of &lt;a href="http://developers.facebook.com/connect.php"&gt;Facebook
Connect&lt;/a&gt; showed developers that it is possible to build a delegated identity workflow
that isn’t as intimidating and counterproductive as the experience typically associated
with delegated identity systems like OpenID. On May 14th, Google announced that a
similar experience has now been successfully designed and implemented for OpenID in
the Google Code blog post titled &lt;a href="http://google-code-updates.blogspot.com/2009/05/google-openid-api-taking-next-steps.html"&gt;Google
OpenID API - taking the next steps&lt;/a&gt; which states 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;We are happy to announce today two new enhancements to our API - introducing a
new popup style UI for our user facing approval page, and extending our Attribute
Exchange support to include first and last name, country and preferred language. &lt;/em&gt; 
&lt;p&gt;
The new popup style UI, which implements the 
&lt;/p&gt;
&lt;a href="http://wiki.openid.net/f/openid_ui_extension_draft01.html"&gt;&lt;em&gt;OpenID User
Interface Extension Specification&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, is designed to streamline the federated
login experience for users. Specifically, it's designed to ensure that the context
of the Relying Party website is always available and visible, even in the extreme
case where a confused user closes the Google approval window. &lt;/em&gt;&lt;a href="http://www.janrain.com"&gt;&lt;em&gt;JanRain&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
a provider of OpenID solutions, is an early adopter of the new API, and already offers
it as part of their &lt;/em&gt;&lt;a href="http://rpxnow.com/"&gt;&lt;em&gt;RPX product&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.
As demonstrated by &lt;/em&gt;&lt;a href="http://uservoice.com/session/new"&gt;&lt;em&gt;UserVoice&lt;/em&gt;&lt;/a&gt;&lt;em&gt; using &lt;/em&gt;&lt;a href="http://rpxnow.com/"&gt;&lt;em&gt;JanRain's
RPX&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, the initial step on the sign-in page of the Relying Party website
is identical to that of the &amp;quot;full page&amp;quot; version, and does not require any
changes in the Relying Party UI. &lt;/em&gt;&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;a href="http://2.bp.blogspot.com/_EuCTzLdp3vE/SguAL9E94NI/AAAAAAAACfk/1hjbP6RH9h0/s1600-h/openID_1.jpg"&gt;&lt;em&gt;&lt;img border="0" alt="" src="http://2.bp.blogspot.com/_EuCTzLdp3vE/SguAL9E94NI/AAAAAAAACfk/1hjbP6RH9h0/s400/openID_1.jpg" /&gt;&lt;/em&gt;&lt;/a&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Once the user selects to sign in using his or her Google Account, the Google approval
page is displayed. However, it does not replace the Relying Party's page in the main
browser window. Instead it is displayed as a popup window on top of it. We have updated
our &lt;/em&gt;&lt;a href="http://code.google.com/p/step2"&gt;&lt;em&gt;Open Source project&lt;/em&gt;&lt;/a&gt;&lt;em&gt; to
include a complete Relying Party example, providing code for both the back-end (in
Java) and front-end (javascript) components. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;a href="http://3.bp.blogspot.com/_EuCTzLdp3vE/SguBAuAfwJI/AAAAAAAACfs/qK_wLdWEpko/s1600-h/openID_2.jpg"&gt;&lt;em&gt;&lt;img border="0" alt="" src="http://3.bp.blogspot.com/_EuCTzLdp3vE/SguBAuAfwJI/AAAAAAAACfs/qK_wLdWEpko/s400/openID_2.jpg" /&gt;&lt;/em&gt;&lt;/a&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Once the user approves the request, the popup page closes, and the user is signed
in to the Relying Party website.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The aforementioned OpenID User Interface Extension allows the relying party to request
that the OpenID provider authenticate the user via a “pop up” instead of through navigating
to their page and then redirecting the user back to the relying party’s site. Thus
claim that OpenID usability harms the login experience is now effectively addressed
and I expect to see more OpenID providers and relying parties adopt this new popup
style experience as part of the authentication process. 
&lt;/p&gt;
&lt;p&gt;
The second biggest perception blocker is the one asked in articles like &lt;a href="http://www.techcrunch.com/2008/03/24/is-openid-being-exploited-by-the-big-internet-companies/"&gt;Is
OpenID Being Exploited By The Big Internet Companies?&lt;/a&gt; which points out that no
large web companies actually support OpenID as a way to login to their primary services.
The implication being that companies are interested in using OpenID as a way to spread
their reach across the web including becoming identity providers for other companies
but don’t want others to do the same to them. 
&lt;/p&gt;
&lt;p&gt;
That was true until earlier this week when Luke Shepard announced &lt;a href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=246"&gt;Facebook
Supports OpenID for Automatic Login&lt;/a&gt;. Specifically, 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Now, users can register for Facebook using their Gmail accounts. This is a quicker,
more streamlined way for new users to register for the site, find their friends, and
start exploring. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;img src="http://wiki.developers.facebook.com/images/8/89/OpenIDex.png" width="400" /&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Existing and new users can now link their Facebook accounts with their Gmail accounts
or with accounts from those OpenID providers that support automatic login. Once a
user links his or her account with a Gmail address or an OpenID URL, logs in to that
account, then goes to Facebook, that user will already be logged in to Facebook.&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;In tests we've run, we've noticed that first-time users who register on the site
with OpenID are more likely to become active Facebook users. They get up and running
after registering even faster than before, find their friends easily, and quickly
engage on the site.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This makes Facebook the first major web company to truly embrace OpenID as a way to
enable users to sign up and login to the site using credentials from a third party
(a competitor even). The fact that they also state that contrary to popular perception
this actually improves the level of engagement of those users is also a big deal. 
&lt;/p&gt;
&lt;p&gt;
Given both of these events, I expect that we’ll see a number of more prominent sites
adopting OpenID as they now clearly have nothing to lose and a lot to gain by doing
so. This will turn out to be a great thing for users of the web and will bring us
closer to the nirvana that is true interoperability across the social networking and
social media sites on the web. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=ndhqa0g7y0w:gQnkxKPdFDE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=ndhqa0g7y0w:gQnkxKPdFDE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=ndhqa0g7y0w:gQnkxKPdFDE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=ndhqa0g7y0w:gQnkxKPdFDE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=ndhqa0g7y0w:gQnkxKPdFDE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=ndhqa0g7y0w:gQnkxKPdFDE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=ndhqa0g7y0w:gQnkxKPdFDE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=ndhqa0g7y0w:gQnkxKPdFDE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=ndhqa0g7y0w:gQnkxKPdFDE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/ndhqa0g7y0w" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="7" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=1a2a732e-c064-4659-af25-2b7a90a4646a" />
    <total xmlns="http://purl.org/syndication/thread/1.0">7</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=1a2a732e-c064-4659-af25-2b7a90a4646a" title="7 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=1a2a732e-c064-4659-af25-2b7a90a4646a</commentRss>
    <title>Wolfram Alpha: The Wikipedia Killer</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/16/WolframAlphaTheWikipediaKiller.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=1a2a732e-c064-4659-af25-2b7a90a4646a</id>
    <published>2009-05-16T09:05:31.6555994-07:00</published>
    <updated>2009-05-16T09:05:31.6555994-07:00</updated>
    <category term="Startup Shoutout" label="Startup Shoutout" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Startup+Shoutout" />
    <content type="html">&lt;p&gt;
After all the hype, I got around to taking &lt;a href="http://www.wolframalpha.com/"&gt;Wolfram
Alpha&lt;/a&gt; for a spin last night due to being unable to sleep after a weird &lt;a href="http://en.wikipedia.org/w/index.php?title=Characters_of_Watchmen&amp;amp;oldid=289350324#Doctor_Manhattan_.28Dr._Jon_Osterman.29"&gt;Doctor
Manhattan&lt;/a&gt; themed nightmare. The experience of using the site is very impressive
and there is a great walkthrough of the power of the site in the &lt;a href="http://www.wolframalpha.com/screencast/introducingwolframalpha.html"&gt;Wolfram
Alpha screencast&lt;/a&gt; which I encourage people to watch if you are interested in learning
about a new breed of search engine. 
&lt;/p&gt;
&lt;p&gt;
There have been a &lt;a href="http://search.live.com/results.aspx?q=wolfram+google+killer&amp;amp;go=&amp;amp;form=QBLH"&gt;ton
of articles calling Wolfram Alpha a &amp;quot;Google Killer&amp;quot;&lt;/a&gt; but after using
the site for a few hours although I find it fascinating, I question how much of a
threat the site is to Google either as a way to satisfy the typical questions people
ask Web search engines or a threat to Google’s search advertising cash cow. You can
get a sense for the kinds of queries that Wolfram Alpha handles amazingly well from
the list below 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.wolframalpha.com/input/?i=life+expectancy+40+year+old+male+uk"&gt;life
expectancy 40 year old male UK&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.wolframalpha.com/input/?i=goog+yhoo"&gt;GOOG YHOO&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.wolframalpha.com/input/?i=nathan+name"&gt;nathan name&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.wolframalpha.com/input/?i=president+of+nigeria+2004"&gt;president
of nigeria 2004&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.wolframalpha.com/input/?i=weather+seattle+christmas+day+2008"&gt;weather
seattle christmas day 2008&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.wolframalpha.com/input/?i=microsoft"&gt;microsoft&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.wolframalpha.com/input/?i=ethnic+groups+nigeria"&gt;ethnic groups
nigeria&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
As you can tell from the above list, Wolfram Alpha is like having a search engine
over the kind of data you’d see in the &lt;a href="https://www.cia.gov/library/publications/the-world-factbook/"&gt;CIA's
World Factbook&lt;/a&gt; or &lt;a href="http://www.amazon.com/Time-Almanac-2009/dp/1603207937"&gt;Time
Almanac&lt;/a&gt;. There really isn’t anything like it on the Web today. However it isn’t
really a competitor to traditional web search engines who for the most part are still
focused on finding web pages despite the various advancements in answering a subset
of queries with direct answers instead of links to web pages such as &lt;a href="http://googlesystem.blogspot.com/2006/07/google-onebox-results.html"&gt;Google's
OneBox results&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/livesearch/archive/2006/01/17/514028.aspx"&gt;Live
Search’s instant answers feature&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
From my perspective, the threat to search engines like Google isn’t Wolfram Alpha
but the trend it represents. That trend is the renaissance of the vertical search
engine. Earlier this year, I was putting together &lt;a href="http://www.25hoursaday.com/weblog/2009/03/22/VideoStandardsForAggregatingActivityFeedsAndSocialAggregationServicesAtMIX09Conference.aspx"&gt;a
panel at the MIX ‘09 conference&lt;/a&gt; and needed to invite the panelists from a pool
of people who I’d either heard about or knew of professionally but had never contacted
directly. How did I find out how to contact these people?&amp;#160; Even though all of
them had blogs, there wasn’t a consistent way to track down contact information. So
I looked them up on &lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt; and sent each of
them a private message. Mission accomplished. Unbeknownst to me, Facebook had become
my “people” search engine”. 
&lt;/p&gt;
&lt;p&gt;
Here’s another story. Last year I worked on the most satisfying software release of
my career, &lt;a href="http://arstechnica.com/microsoft/news/2009/01/ces-2009-windows-live-wave-3-rocks.ars"&gt;Windows
Live (wave 3)&lt;/a&gt;. After the launch I wanted to find out what people were saying about
the product so I did a &lt;a href="http://www.25hoursaday.com/weblog/2008/12/03/WindowsLiveReviewsOnTwitter.aspx"&gt;Twitter
search for Windows Live&lt;/a&gt; and posted the results. While I wasn’t paying attention,
Twitter had become my “what are people saying about &amp;lt;insert brand here&amp;gt;” search
engine. 
&lt;/p&gt;
&lt;p&gt;
This trend of search engines dedicated to specific scenarios and contexts that can’t
be answered well by Web search is the trend that traditional search engines should
watch carefully. 
&lt;/p&gt;
&lt;p&gt;
I can imagine Wolfram Alpha eventually growing to satisfy a lot of the sorts of queries
I go to Wikipedia today to get answers to and doing so in a more authoritative manner.
In that case, it would become my “facts and trivia” search engine. However there are
currently too many gaps in its knowledge of commercial products (e.g. &lt;a href="http://www.wolframalpha.com/input/?i=ipod"&gt;search
for “ipod”&lt;/a&gt; results in a coming soon notice) and people (e.g. the &lt;a href="http://www.wolframalpha.com/input/?i=jim+carrey"&gt;Jim
Carrey entry&lt;/a&gt; is amazingly brief yet still manages to have a factually inaccuracy)
to make it a true replacement for wikipedia. That said, the service shows great promise
and it will be interesting watching as it evolves.&amp;#160; 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=dgwc_n2bpgE:j-X9Xq8uWjk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=dgwc_n2bpgE:j-X9Xq8uWjk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=dgwc_n2bpgE:j-X9Xq8uWjk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=dgwc_n2bpgE:j-X9Xq8uWjk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=dgwc_n2bpgE:j-X9Xq8uWjk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=dgwc_n2bpgE:j-X9Xq8uWjk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=dgwc_n2bpgE:j-X9Xq8uWjk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=dgwc_n2bpgE:j-X9Xq8uWjk:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=dgwc_n2bpgE:j-X9Xq8uWjk:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/dgwc_n2bpgE" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="13" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=01bb5603-1c82-49cd-967b-c04af24824b1" />
    <total xmlns="http://purl.org/syndication/thread/1.0">13</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=01bb5603-1c82-49cd-967b-c04af24824b1" title="13 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=01bb5603-1c82-49cd-967b-c04af24824b1</commentRss>
    <title>Why Twitter's Engineers Hate the @replies feature</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/15/WhyTwittersEngineersHateTheRepliesFeature.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=01bb5603-1c82-49cd-967b-c04af24824b1</id>
    <published>2009-05-15T06:51:42.523742-07:00</published>
    <updated>2009-05-15T11:32:10.9196305-07:00</updated>
    <category term="Web Development" label="Web Development" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Web+Development" />
    <content type="html">&lt;p&gt;
Biz Stone, Twitter’s , recently wrote in a blog post entitled &lt;a href="http://blog.twitter.com/2009/05/replies-kerfuffle.html"&gt;The
Replies Kerfuffle&lt;/a&gt; that
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;We removed a setting that 3% of all accounts had ever touched but for those folks
it was beloved.&lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;…&lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;97% of all accounts were not affected at all by this change—the default setting
is that you only see replies by people you follow to people you follow. For the 3%
who wanted to see replies to people they don't follow, we cannot turn this setting
back on in its original form for technical reasons and we won't rebuild it exactly
the same for product design reasons.&lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;…&lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;Even though only 3% of all Twitter accounts ever changed this setting away from
the default, it was causing a strain and impacting other parts of the system. Every
time someone wrote a reply Twitter had to check and see what each of their followers'
reply setting was and then manifest that tweet accordingly in their timeline—this
was the most expensive work the database was doing and it was causing other features
to degrade which lead to SMS delays, inconsistencies in following, fluctuations in
direct message counts, and more. Ideally, we would redesign and rebuild this feature
but there was no time, hence the sudden deploy.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As someone whose day job is working on a system for distributing a user’s updates
and activities to their social network in real-time across Web and desktop applications,
I’m always interested in reading about the implementation choices of others who have
built similar systems. However when it comes to Twitter I tend to be more confused
than enlightened whenever something is revealed about their architecture. 
&lt;/p&gt;
&lt;p&gt;
So let’s look at what we know. When Ashton Kutcher posts an update on Twitter such
as 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pAV368TQzZVT2XbFF37n7nm6qEnUTmMaQ2AegFvL6dnR42p-unBcwbTpjwk-wSbDZqSUFDWQiPy1BcrE_gJWiBQ/aplusk%20tweet.PNG" width="410" height="246" /&gt; 
&lt;p&gt;
it has to be delivered to all &lt;a href="http://twitter.com/aplusk/followers"&gt;1.75 million&lt;/a&gt; of
his followers. On the other hand, when Ashton Kutcher posts an update directed to
one of his celebrity friends such as 
&lt;/p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pOKmVzo866Dsja13ib3XpJuYQQcgyjTGuVxFPaKmbTp3MdBW7KsfW9_q0mWTI8VhlrGGj10E_Jz6f27mTwgFKKA/aplusk%20reply.PNG" width="426" height="266" /&gt; 
&lt;p&gt;
then Twitter needs to decide how to deliver it based on the Replies settings of users. 
&lt;/p&gt;
&lt;p&gt;
One option would to check each of the 1.75 million followers of aplusk’s setting to
decide whether they need have @replies restricted to only people they are following.
Since this will be true for 97% of his followers (i.e. 1.7 million people) then there
would need to be a 1.7 million checks to see if the intended recipient are also friends
of John Mayer before&amp;#160; delivering the message to each of them. On the other hand,
it would be pretty straightforward to deliver the message to the 3% of users who want
to see all replies. Now this seems to be what Biz Stone is describing as how Twitter
works but in that case the default setting should be &lt;em&gt;more expensive&lt;/em&gt; than
the feature that is only used by a minority of their user base. 
&lt;/p&gt;
&lt;p&gt;
In that case I’d expect Twitter to argue that the feature they want to remove for
engineering reasons is filtering out some of the tweets you see based on whether you
are a follower of the person the message is directed to not the other way around. 
&lt;/p&gt;
&lt;p&gt;
What have I missed here?&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;u&gt;Update&lt;/u&gt;: A &lt;a href="http://news.ycombinator.com/item?id=610955"&gt;comment
on Hacker News&lt;/a&gt; put me on track to what I probably missed in analyzing this problem.
In the above example, if the default case was the only case they had to support then
all they have to do to determine who should receive Ashton Kutcher’s reply to John
Meyer is perform an intersection of both user’s follower lists. Given that both lists
need to be in memory for the system to be anywhere near responsive, performing the
intersection isn’t as expensive as it sounds. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;However with the fact that 3% of users will want to have received the update even
though they aren’t John Mayer’s friends means Twitter needs to do a second pass over
whoever was not found in both follower lists and check what their @reply delivery
settings are. In the above example, even if every follower of John Mayer was a follower
of Ashton Kutcher, it would still require 750,000 settings checks. Given that it sounds
like they keep this setting in their database instead of in some sort of cache, it
is no surprise that this is a feature they’d like to eliminate.&amp;#160; &lt;/em&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sgHdBAClgwg:ukb-jO9NCwg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sgHdBAClgwg:ukb-jO9NCwg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=sgHdBAClgwg:ukb-jO9NCwg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sgHdBAClgwg:ukb-jO9NCwg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=sgHdBAClgwg:ukb-jO9NCwg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sgHdBAClgwg:ukb-jO9NCwg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=sgHdBAClgwg:ukb-jO9NCwg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sgHdBAClgwg:ukb-jO9NCwg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=sgHdBAClgwg:ukb-jO9NCwg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/sgHdBAClgwg" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="0" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=e521eada-9398-411d-9da1-d46914c76f56" />
    <total xmlns="http://purl.org/syndication/thread/1.0">0</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=e521eada-9398-411d-9da1-d46914c76f56" title="0 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=e521eada-9398-411d-9da1-d46914c76f56</commentRss>
    <title>Are you building an application that people use every day or do you just think you are?</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/11/AreYouBuildingAnApplicationThatPeopleUseEveryDayOrDoYouJustThinkYouAre.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=e521eada-9398-411d-9da1-d46914c76f56</id>
    <published>2009-05-11T08:02:57.1921027-07:00</published>
    <updated>2009-05-11T09:58:44.1919449-07:00</updated>
    <category term="Social Software" label="Social Software" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Social+Software" />
    <content type="html">&lt;p&gt;
Joshua Porter has an excellent post titled &lt;a href="http://bokardo.com/archives/everyday-app/"&gt;Are
you building an everyday app? (the LinkedIn problem)&lt;/a&gt;&amp;#160; where he writes
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;In a &lt;/em&gt;&lt;a href="http://www.inc.com/magazine/20090501/how-i-did-it-reid-hoffman-of-linkedin_Printer_Friendly.html"&gt;&lt;em&gt;recent
interview&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, LinkedIn CEO Reid Hoffman describes moving away from day to
day to a more strategic role in the company he founded: &lt;/em&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;I want to be able to sink my mind around a couple of problems and work through
them. For example, many professionals still don’t understand how LinkedIn can be valuable
on a daily or weekly basis”&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Another way you could phrase this is: “people don’t use LinkedIn everyday…we need
to figure out how to change that”. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The fact is that LinkedIn, in its current incarnation, is not an &lt;strong&gt;everyday
app&lt;/strong&gt;. An everyday app is one that is used every day (or most days) by its
users. 
&lt;br /&gt;
... 
&lt;br /&gt;
In general, most people think they’re building an everyday app, but they’re not. When
the actual use patterns are discovered, most apps will be used every few days or less.
Designers have to ask themselves a very hard question: “How often are people really
going to use our web application?”. The answer is important…it will even help drive
design decisions. Whether or not you have an everyday app affects the entire design
of what you’re building, including the screens, notifications, and frequency of the
service. For example, only everyday apps really need to use real-time technology to
update streams. If you find out that you’re not building an everyday app, you probably
don’t need to invest in making it real-time. But…you might invest in a notifications
system that can alert users to when something very interesting happens.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;You don’t have to be an everyday app to be successful. &lt;/em&gt;&lt;a href="http://netflix.com"&gt;&lt;em&gt;Netflix&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
for example, is not an everyday app. It’s an every-few-days app. Most people go back
every few days to update their queue. There is really no need to go back more often.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Many developers of social software applications on the Web believe they’ve built an
everyday app but they actually haven’t. One thing I’ve learned in almost five years
of working on social software applications at Microsoft is that simply having the
features of an everyday app doesn’t translate to people using the application every
day. The best way to think about this is that no application starts off as an everyday
app. Very rarely does an application show up that is so amazing that people start
using it everyday right off the bat. Instead there is a transition where either users
transition from occasional to frequent users while the application stays static or
the application itself transitions to catering to a more engaged user base relative
to where it was in previous years. 
&lt;/p&gt;
&lt;p&gt;
An example of the former is &lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt;, the site
hasn’t really changed much since I started using it about a year and a half ago. However
it wasn’t until the right set of factors came together such as getting enough people
I was following, adding the Twitter app to Facebook &amp;amp; Windows Live to update my
friends on those services and getting Twitter applications for my desktop &amp;amp; phone
did I transition to becoming an everyday user. Twitter’s main problem is that not
every user eventually hits this sweet spot which is why you read articles like &lt;a href="http://blog.nielsen.com/nielsenwire/online_mobile/twitter-quitters-post-roadblock-to-long-term-growth/"&gt;Twitter
Quitters Post Roadblock to Long-Term Growth&lt;/a&gt; which points out that retention rate
over a one month period hovers between 30% – 40% for new users. This need to make
the application instantly useful to users is what prompts features like the &lt;a href="http://blog.twitter.com/2009/03/suggested-users.html"&gt;Suggested
Users List&lt;/a&gt; whose purpose is to give new users content worth coming back to every
day instead of the “Trying out Twitter for the first time” style posts that they probably
see from most of their friends who are also kicking the tires on the service they
heard about on Oprah. 
&lt;/p&gt;
&lt;p&gt;
Having features that are useful every day like a constantly updating activity stream
doesn’t mean people will use the site every day. For the users that cross the hump,
it does. The challenge is how to get users to cross that hump. 
&lt;/p&gt;
&lt;p&gt;
A site that has done a good job of motivating its users to check it out on a daily
basis and adjusting its features as its user base has become more engaged is Facebook.
One of Facebook’s most annoying features for a long time was the fact that &lt;a href="http://www.techcrunch.com/2007/12/06/facebook-messages-small-change-big-impact/"&gt;notifications
on new messages in the service didn't actually contain the message&lt;/a&gt;. I suspect
the purpose of doing this was to drive users back to the site so that they would then
catch up on all they’d missed such as invitations and content in the news feed after
they were done answering the message. Although this feature is annoying, it was definitively
effective given anecdotal feedback from various people I talked to at the time. After
a certain point, Facebook’s user engagement grew to the point where sending messages
without the content to drive users back to the site wasn’t worth it relative to the
decreased customer satisfaction. 
&lt;/p&gt;
&lt;p&gt;
Another great example from Facebook is the transition from the old news feed to the
new stream. In March of 2009, &lt;a title="Facebook Blog: Welcome to Your New Home Page" href="http://blog.facebook.com/blog.php?post=59195087130"&gt;the
news feed was transformed into a real-time stream&lt;/a&gt; and almost two months later &lt;a title="Facebook Blog: Live Updating the Stream" href="http://blog.facebook.com/blog.php?post=81121322130"&gt;the
real-time stream now updates live without having to refresh the page&lt;/a&gt;. The previous
functionality of the news feed was relegated to an alternate highlights stream as
shown below&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pRHLHVFB0gxXCvkGCIEV739aMFq1sohkrkwJ-L1URr4O2UgzYzvygSzbUymrU7moyoG06IbDcr1ft8F3FZIgbag/new-facebook-homepage-mar09.png" /&gt; 
&lt;/p&gt;
&lt;p&gt;
From reading the blog posts about the changes, the problem the switch from a highlights-centric
news feed to a real-time stream is addressing is the fact that the highlights-based
feed is stale and doesn’t provide enough value for users who’ve not just become every
day users but are now every hour users. Not only do &lt;a href="http://www.facebook.com/press/info.php?statistics"&gt;over
100 million of its users login every day&lt;/a&gt; but with &lt;a href="http://www.insidefacebook.com/2009/04/07/more-march-stats-facebook-1-site-in-us-by-time-spent-connect-reaches-40-million-uniques/"&gt;90
million users generating 90 billion page views in the month of March 2009&lt;/a&gt; that
implies the average page view for a Facebook user is over once per hour. 
&lt;/p&gt;
&lt;p&gt;
And when you think about it, &lt;a title="Facebook Blog: Facebook Gets a Facelift" href="http://blog.facebook.com/blog.php?post=2207967130"&gt;the
introduction of the original news feed in 2006&lt;/a&gt; was a successful attempt to go
from being an occasionally updated rolodex for a large chunk of their users into a
social utility to keep up with what’s going on in the lives of family, friends and
coworkers. The switch to a real-time stream is how Facebook is addressing the fact
that they have slowly become an every hour app instead of just an everyday app for
their users. 
&lt;/p&gt;
&lt;p&gt;
A number of services I use online could learn from how Facebook has evolved their
experience over time increase the engagement of their user base by making sometimes
small and sometimes huge changes to the user experience to encourage people to make
the service a regular part of their lives. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=Tb5fcuyoH7I:f6mk41lBNhs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=Tb5fcuyoH7I:f6mk41lBNhs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=Tb5fcuyoH7I:f6mk41lBNhs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=Tb5fcuyoH7I:f6mk41lBNhs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=Tb5fcuyoH7I:f6mk41lBNhs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=Tb5fcuyoH7I:f6mk41lBNhs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=Tb5fcuyoH7I:f6mk41lBNhs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=Tb5fcuyoH7I:f6mk41lBNhs:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=Tb5fcuyoH7I:f6mk41lBNhs:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/Tb5fcuyoH7I" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="2" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=0756234c-dd36-49e5-a17b-076f2d8f0384" />
    <total xmlns="http://purl.org/syndication/thread/1.0">2</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=0756234c-dd36-49e5-a17b-076f2d8f0384" title="2 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=0756234c-dd36-49e5-a17b-076f2d8f0384</commentRss>
    <title>Some thoughts on using the Facebook Open Stream API</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/11/SomeThoughtsOnUsingTheFacebookOpenStreamAPI.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=0756234c-dd36-49e5-a17b-076f2d8f0384</id>
    <published>2009-05-11T08:02:33.6300551-07:00</published>
    <updated>2009-05-11T08:05:20.142483-07:00</updated>
    <category term="Platforms" label="Platforms" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Platforms" />
    <content type="html">&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;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sBz1JG2sZ7c:Or8VhAD2Sw0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sBz1JG2sZ7c:Or8VhAD2Sw0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=sBz1JG2sZ7c:Or8VhAD2Sw0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sBz1JG2sZ7c:Or8VhAD2Sw0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=sBz1JG2sZ7c:Or8VhAD2Sw0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sBz1JG2sZ7c:Or8VhAD2Sw0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=sBz1JG2sZ7c:Or8VhAD2Sw0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=sBz1JG2sZ7c:Or8VhAD2Sw0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=sBz1JG2sZ7c:Or8VhAD2Sw0:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/sBz1JG2sZ7c" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="1" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=13fca3e9-7737-4041-bffb-4915d2e826b9" />
    <total xmlns="http://purl.org/syndication/thread/1.0">1</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=13fca3e9-7737-4041-bffb-4915d2e826b9" title="1 Comment" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=13fca3e9-7737-4041-bffb-4915d2e826b9</commentRss>
    <title>Progress report on Facebook integration into RSS Bandit (Colossus release)</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/10/ProgressReportOnFacebookIntegrationIntoRSSBanditColossusRelease.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=13fca3e9-7737-4041-bffb-4915d2e826b9</id>
    <published>2009-05-10T09:43:35.0796426-07:00</published>
    <updated>2009-05-10T09:43:35.0796426-07:00</updated>
    <category term="RSS Bandit" label="RSS Bandit" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=RSS+Bandit" />
    <content type="html">&lt;p&gt;
So I’ve spent the weekend working my way through Facebook’s &lt;a href="http://wiki.developers.facebook.com/index.php/Using_the_Open_Stream_API"&gt;Open
Stream API&lt;/a&gt; and have made a ton of progress in adding the option to read your Facebook
news feed from RSS Bandit. In my &lt;a href="http://rssbandit.org/project-status/rss-bandit-codename-collossus-will-bring-stability-bug-fixes-and-facebook-integration"&gt;previous
post&lt;/a&gt; I should the initial screenshots where you can login to Facebook via RSS
Bandit to begin the authentication process to retrieve your news feed. Below are a
few more screenshots showing how much progress has been made 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://rssbandit.org/files/media/image/WindowsLiveWriter/ProgressreportonFacebookintegrationintoR_83B4/allowaccess_fb%5B1%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Requesting extended permission to read the stream" border="0" alt="Requesting extended permission to read the stream" src="http://rssbandit.org/files/media/image/WindowsLiveWriter/ProgressreportonFacebookintegrationintoR_83B4/allowaccess_fb%5B1%5D.png" width="527" height="395" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Fig 1: This is the screen where you give RSS Bandit permission to access your news
feed. Note that this is different from the screen &lt;a href="http://farm4.static.flickr.com/3336/3497958859_e906d4f658.jpg?v=0"&gt;where
you login to Facebook via RSS Bandit&lt;/a&gt;. You should only see this screen once but
will get the login screen quite often unless you select the option to stay signed
into Facebook via RSS Bandit. 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://rssbandit.org/files/media/image/WindowsLiveWriter/ProgressreportonFacebookintegrationintoR_83B4/newsfeed_fb%5B1%5D_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="The Facebook news feed in RSS Bandit" border="0" alt="The Facebook news feed in RSS Bandit" src="http://rssbandit.org/files/media/image/WindowsLiveWriter/ProgressreportonFacebookintegrationintoR_83B4/newsfeed_fb%5B1%5D_2.png" width="661" height="429" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Fig 2: This is what your Facebook news feed looks like in RSS Bandit with the default
stylesheet for Facebook applied. As you can see from the screen shot I’ve attempted
to replicate the look of the news feed as best as I can in RSS Bandit. This includes
options below each item to comment or see who has liked an item. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://rssbandit.org/files/media/image/WindowsLiveWriter/ProgressreportonFacebookintegrationintoR_83B4/comments_fb%5B1%5D_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Reading news feed comments in RSS Bandit" border="0" alt="Viewing news feed comments in RSS Bandit" src="http://rssbandit.org/files/media/image/WindowsLiveWriter/ProgressreportonFacebookintegrationintoR_83B4/comments_fb%5B1%5D_2.png" width="673" height="474" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Fig 3: There is also support for viewing the comments on a Facebook item inline within
the Feed Details list view. Although this is different from how Facebook does it,
I felt this was needed to make it consistent with the other inline comment viewing
experiences within RSS Bandit. 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
There’s still a bunch of cleanup to do such as fix up the look of comments when you
click on them and provide a way to post comments on your friends’ Facebook items.
This is probably another day or so of work which I’ll do next weekend. After that
it is back to fixing bugs and working with Torsten &lt;a title="RSS Bandit and Windows Vista" href="http://www.25hoursaday.com/weblog/2006/11/18/RSSBanditAndWindowsVista.aspx"&gt;on
our idea from over two years ago&lt;/a&gt; on how to add a Office 2007 style ribbon to the
application. 
&lt;/p&gt;
&lt;p&gt;
Below are pictures of the initial prototypes which Torsten has dusted off and will
start working on again
&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;
&lt;a href="http://flickr.com/photos/55897210@N00/300037252/in/set-72157594381126560/"&gt;&lt;img src="http://static.flickr.com/119/300037252_87b658c6af.jpg?v=0" width="200" height="150" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;
&lt;a href="http://flickr.com/photos/55897210@N00/300037253/in/set-72157594381126560/"&gt;&lt;img src="http://static.flickr.com/120/300037253_5923ef371e.jpg?v=0" width="200" height="150" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;
&lt;a href="http://flickr.com/photos/55897210@N00/300037254/in/set-72157594381126560/"&gt;&lt;img src="http://static.flickr.com/104/300037254_9a98dce563.jpg?v=0" width="200" height="150" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
I’ll follow up this post with some of my thoughts on writing a desktop application
that targets Facebook’s Open Stream API. The process was definitely more painful than
I expected but the results are worth it which says a lot about the functionality provided
by the API. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=B1YGgf7vSjM:L2vWC5GbH8c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=B1YGgf7vSjM:L2vWC5GbH8c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=B1YGgf7vSjM:L2vWC5GbH8c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=B1YGgf7vSjM:L2vWC5GbH8c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=B1YGgf7vSjM:L2vWC5GbH8c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=B1YGgf7vSjM:L2vWC5GbH8c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=B1YGgf7vSjM:L2vWC5GbH8c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=B1YGgf7vSjM:L2vWC5GbH8c:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=B1YGgf7vSjM:L2vWC5GbH8c:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/B1YGgf7vSjM" height="1" width="1"/&gt;</content>
  </entry>
  <entry>
    <link xmlns:thr="http://purl.org/syndication/thread/1.0" thr:count="21" rel="replies" type="application/atom+xml" href="http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d3194710-ed74-45a5-b2b3-a13a86f540e4" />
    <total xmlns="http://purl.org/syndication/thread/1.0">21</total>
    <link rel="replies" type="text/html" href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=d3194710-ed74-45a5-b2b3-a13a86f540e4" title="21 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d3194710-ed74-45a5-b2b3-a13a86f540e4</commentRss>
    <title>RSS readers modeled after email clients are fundamentally broken</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/05/05/RSSReadersModeledAfterEmailClientsAreFundamentallyBroken.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=d3194710-ed74-45a5-b2b3-a13a86f540e4</id>
    <published>2009-05-05T05:17:10.4391887-07:00</published>
    <updated>2009-05-05T05:18:05.9239188-07:00</updated>
    <category term="Syndication Technology" label="Syndication Technology" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Syndication+Technology" />
    <content type="html">&lt;p&gt;
Farhad Manjoo has an article on Slate entitled &lt;a href="http://slate.com/id/2217353"&gt;Kill
your RSS reader&lt;/a&gt; which captures a growing sentiment I’ve had for a while and ranted
about during &lt;a title="Feed Me: Bite Size Info for a Hungry Internet" href="http://sxsw.com/interactive/talks/schedule?action=show&amp;amp;id=IAP0900837"&gt;a
recent panel at SXSW&lt;/a&gt;. Below are a few key excerpts from Farhad’s article that
resonate strongly with me 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;i&gt;In theory, the RSS reader is a great idea. Many years ago, as blogs became an ever-larger
part of my news diet, I got addicted to &lt;a href="http://www.bloglines.com/" target="_blank"&gt;Bloglines&lt;/a&gt;,
one of the first popular RSS programs. I used to read a dozen different news sites
every day, going to each site every so often to check whether something fresh had
been posted. With Bloglines, I just had to list the sites I loved and it would do
the visiting for me. This was fantastic—instead of scouring the Web for interesting
stories, everything came to me! &lt;/i&gt; 
&lt;br /&gt;
... 
&lt;br /&gt;
&lt;i&gt;But RSS started to bring me down. You know that sinking feeling you get when you
open your e-mail and discover hundreds of messages you need to respond to—that realization
that e-mail has become another merciless chore in your day? That's how I began to
feel about my reader. RSS readers encourage you to oversubscribe to news. Every time
you encounter an interesting new blog post, you've got an incentive to sign up to
all the posts from that blog—after all, you don't want to miss anything. Eventually
you find yourself subscribed to hundreds of blogs, many of which, you later notice,
are completely useless. It's like having an inbox stuffed with e-mail from overactive
listservs you no longer care to read.&lt;/i&gt;
&lt;/p&gt;
&lt;i&gt; 
&lt;p&gt;
It's true that many RSS readers have great tools by which to organize your feeds,
and folks more capable than I am have probably hit on ways to categorize their blogs
in a way that makes it easy to get through them. But that was just my problem—I began
to resent that I had to think about 
&lt;/p&gt;
organizing&lt;i&gt; my reader. &lt;/i&gt;&lt;/i&gt;&lt;/blockquote&gt; 
&lt;p&gt;
This mirrors my experience of that of many of my friends who used to be enthusiastic
users of RSS readers. Today I primarily find out what’s going on in blogs using a
combination of &lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt;, &lt;a href="http://www.techmeme.com"&gt;Techmeme&lt;/a&gt; and &lt;a href="http://planet.intertwingly.net/"&gt;Planet
Intertwingly&lt;/a&gt;. The interesting thing is that I’m already subscribed to about half
of the blogs that end up getting linked to in these sources on a regular basis yet
I tend to avoid firing up my RSS reader. 
&lt;/p&gt;
&lt;p&gt;
The problem is that the RSS readers I use regularly, &lt;a href="http://reader.google.com"&gt;Google
Reader&lt;/a&gt; and &lt;a href="http://www.rssbandit.org"&gt;RSS Bandit&lt;/a&gt;, take their inspiration
from email clients which is the wrong model for consuming casual content like blogs.
Whenever I fire up an email application like Outlook or Hotmail it presents me with
a list of tasks I must complete in the form of messages that need responses, work
items, meeting invitations, spam that needs to deleting, notifications related to
commercial/financial transactions that I need to be aware of and so on. Reading email
is a chore where you are constantly taunted by the &lt;u&gt;&lt;b&gt;BOLD&lt;/b&gt;&lt;/u&gt; unread messages
indicator silently nagging you about the stuff you haven’t done yet. 
&lt;/p&gt;
&lt;p&gt;
Given that a significant percentage of the time, the stuff in my email inbox is messages
that were sent directly to me that need some form of response or acknowledgment this
model is somewhat sound although as many have pointed out &lt;a title="Why Email Clients Need to Change" href="http://gigaom.com/2009/04/24/why-email-clients-need-to-change/"&gt;there
is a lot of room for improvement&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
When it comes to blogs and other casual content, this model breaks down. I really
don’t need a constant nagging reminder that I haven’t read the half dozen reposts
of the same tech news stories about Google, Twitter and Facebook after I’ve seen the
first one. Furthermore, if I haven’t fired up my reader in a while then I don’t care
to be nagged about all the stuff I missed since they are just blogs so it is OK if
I never read them. This opinion isn’t new, Dave Winer has been evangelizing &lt;a href="http://www.reallysimplesyndication.com/riverOfNews"&gt;“River
of News” style aggregators for several years&lt;/a&gt; and given the success of this model
for social networking sites like Facebook and microblogging sites like Twitter, it’s
clear that Dave was onto something. 
&lt;/p&gt;
&lt;p&gt;
Looking back at the time I’ve spent working on &lt;a href="http://www.rssbandit.org"&gt;RSS
Bandit&lt;/a&gt;, I realize there are a couple of features I added to attempt to glom the
river of news model on top of an email based model for reading feeds. These features
include
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
the ability to mark all items as read after navigating away from a feed. This allows
you to skim the interesting headlines then not have to deal with the “guilt” of not
reading the rest of the items in the feed.&lt;/li&gt;
&lt;li&gt;
a reading pane inspired by Google Reader where unread items are presented in a single
flow and marked as read as you scroll past each item&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Looking back now, it seems to me that the way we think of RSS readers needs to fundamentally
change. Presenting information as a news feed where the user isn’t pressured to read
every item or feel like a failure is one way to move the needle on the user experience
here. What I wonder is whether it isn’t already too late for this category of applications
as services like Twitter &amp;amp; Facebook take over as how people keep up to date with
what’s going on with the people and content they care about. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=RqeYfdnWiXA:Hl7kq3yJumM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=RqeYfdnWiXA:Hl7kq3yJumM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=RqeYfdnWiXA:Hl7kq3yJumM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=RqeYfdnWiXA:Hl7kq3yJumM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=RqeYfdnWiXA:Hl7kq3yJumM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=RqeYfdnWiXA:Hl7kq3yJumM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=RqeYfdnWiXA:Hl7kq3yJumM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=RqeYfdnWiXA:Hl7kq3yJumM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=RqeYfdnWiXA:Hl7kq3yJumM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/RqeYfdnWiXA" height="1" width="1"/&gt;</content>
  </entry>
</feed>
