<?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-11-14T07:03:28.1184728-08: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><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><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=2d873df2-bbc6-410a-bfae-6f8042f933f2" />
    <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=2d873df2-bbc6-410a-bfae-6f8042f933f2" title="2 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2d873df2-bbc6-410a-bfae-6f8042f933f2</commentRss>
    <title>Joe Hewitt on Irony</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/11/14/JoeHewittOnIrony.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=2d873df2-bbc6-410a-bfae-6f8042f933f2</id>
    <published>2009-11-14T07:03:28.1184728-08:00</published>
    <updated>2009-11-14T07:03:28.1184728-08: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;
Joe Hewitt, the developer of the &lt;a href="http://www.facebook.com/apps/application.php?id=6628568379"&gt;Facebook
iPhone application&lt;/a&gt;, has an insightful&amp;#160; blog post on the current trend of
developers favoring native applications over Web applications on mobile platforms
with centrally controlled app stores in his post &lt;a href="http://joehewitt.com/post/on-middle-men/"&gt;On
Middle Men&lt;/a&gt;. He writes
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;The Internet has been incredibly empowering to creators, and just as destructive
to middle men. In the 20th century, every musician needed a record label to get his
or her music heard. Every author needed a publishing house to be read. Every journalist
needed a newspaper. Anyone who wanted to send a message needed the post office. In
the Internet age, the tail no longer wags the dog, and those middle men have become
a luxury, not a necessity. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Meanwhile, the software industry is moving in the opposite direction. With the
web and desktop operating systems, the only thing in between software developers and
users is a mesh of cables and protocols. In the new world of mobile apps, a layer
of bureacrats stand in the middle, forcing each developer to queue up for a series
of patdowns and metal detectors and strip searches before they can reach their customers. 
&lt;br /&gt;
... 
&lt;br /&gt;
We're at a critical juncture in the evolution of software. The web is still here and
it is still strong. Anyone can still put any information or applications on a web
server without asking for permission, and anyone in the world can still access it
just by typing a URL. I don't think I appreciated how important that is until recently.
Nobody designs new systems like that anymore, or at least few of them succeed. What
an incredible stroke of luck the web was, and what a shame it would be to let that
freedom slip away.&lt;/em&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Am I the only one who thinks the above excerpt would be similarly apt if you replaced
the phrase &amp;quot;mobile apps&amp;quot; with &amp;quot;Facebook apps&amp;quot; or &amp;quot;OpenSocial
apps&amp;quot;? 
&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=Lady GaGa&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Lady
GaGa&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Lady GaGa+Bad Romance&amp;amp;x=0&amp;amp;y=0"&gt;Bad
Romance&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=r-5dZftncjM:j1A0nWtjdVM: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=r-5dZftncjM:j1A0nWtjdVM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=r-5dZftncjM:j1A0nWtjdVM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=r-5dZftncjM:j1A0nWtjdVM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=r-5dZftncjM:j1A0nWtjdVM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=r-5dZftncjM:j1A0nWtjdVM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=r-5dZftncjM:j1A0nWtjdVM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=r-5dZftncjM:j1A0nWtjdVM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=r-5dZftncjM:j1A0nWtjdVM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/r-5dZftncjM" 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=397daaaa-f589-451a-a3d1-53b10975572a" />
    <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=397daaaa-f589-451a-a3d1-53b10975572a" title="1 Comment" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=397daaaa-f589-451a-a3d1-53b10975572a</commentRss>
    <title>Does OAuth Have a Dark Side?</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/11/07/DoesOAuthHaveADarkSide.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=397daaaa-f589-451a-a3d1-53b10975572a</id>
    <published>2009-11-07T08:41:08.6693177-08:00</published>
    <updated>2009-11-07T08:41:08.6693177-08: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;
There was an article in the The Register earlier this week titled &lt;a title="&amp;#39;Secure&amp;#39; authentication can be anything but" href="http://www.theregister.co.uk/2009/11/04/oauth_dark_side/"&gt;Twitter
fanatic glimpses dark side of OAuth&lt;/a&gt; which contains the following excerpt 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;A mobile enthusiast and professional internet strategist got a glimpse of OAuth's
dark side recently when he received an urgent advisory from Twitter.&amp;#160; The dispatch,
generated when Terence Eden tried to log in, said his Twitter account may have been
compromised and advised he change his password. After making sure the alert was legitimate,
he complied.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;That should have been the end of it, but it wasn't. It turns out Eden used OAuth
to seamlessly pass content between third-party websites and Twitter, and even after
he had changed his Twitter password, OAuth continued to allow those websites access
to his account. &lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;…&lt;/em&gt; 
&lt;br /&gt;
&lt;em&gt;Eden alternately describes this as a &amp;quot;&lt;/em&gt;&lt;a href="http://shkspr.mobi/blog/?p=994"&gt;&lt;em&gt;gaping
security hole&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;quot; and a &amp;quot;usability issue which has strong security
implications.&amp;quot; Whatever the case, the responsibility seems to lie with Twitter.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;If the service is concerned enough to advise a user to change his password, you'd
think it would take the added trouble of suggesting he also reset his OAuth credentials,
as Google, which on Wednesday said it was &lt;/em&gt;&lt;a href="http://www.theregister.co.uk/2009/11/04/google_web_password_simplification/"&gt;&lt;em&gt;opening
its own services&lt;/em&gt;&lt;/a&gt;&lt;em&gt; to work with OAuth, notes &lt;/em&gt;&lt;a href="http://blog.oauth.net/2008/06/04/oauth-meet-gadgets-gadgets-meet-oauth/"&gt;&lt;em&gt;here&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I don't think the situation is as cut and dried as the article makes it seem. Someone
trying to hack your account by guessing your password and thus triggering a warning
that your account is being hacked is completely different from an application you've
given permission to access your data doing the wrong thing with it. 
&lt;/p&gt;
&lt;p&gt;
Think about it. Below is a list of the applications I've allowed to access my Twitter
stream. Is it really the desired user experience that when I change my password on
Twitter that all of them break and require that I re-authorize each application? 
&lt;/p&gt;
&lt;img title="list of applications that can access my Twitter stream" alt="list of applications that can access my Twitter stream" src="http://farm3.static.flickr.com/2756/4083386912_f4d1e18a13_o.png" /&gt; 
&lt;p&gt;
I suspect Terence Eden is being influenced by the fact that Twitter hasn't always
had a delegated authorization model and the way to give applications access to your
Twitter stream was to handout your user name &amp;amp; password. That's why just a few
months ago it was commonplace to see blog posts like &lt;a href="http://thenextweb.com/2009/03/05/patricks-password-is-always-the-same/"&gt;Why
you should change your Twitter password NOW!&lt;/a&gt; which advocate changing your Twitter
password as a way to prevent your password from being stolen from Twitter apps with
weak security. There have also been a spate of phishing style Twitter applications
such as &lt;a href="http://mashable.com/2009/07/28/twitviewer/"&gt;TwitViewer&lt;/a&gt; and &lt;a href="http://mashable.com/2009/05/26/twittercut-scam/"&gt;TwitterCut&lt;/a&gt; which
masquerade as legitimate applications but are really password stealers in disguise.
Again, the recommendation has been to change your password if you fell victim to such
scams. 
&lt;/p&gt;
&lt;p&gt;
In a world where you use delegated authorization techniques like OAuth, changing your
password isn't necessary to keep out apps like TwitViewer &amp;amp; TwitterCut since you
can simply revoke their permission to access your account. Similarly if someone steals
my password and I choose a new one, it doesn't mean that I now need to lose Twitter
access from &lt;a href="http://www.brizzly.com"&gt;Brizzly&lt;/a&gt; or &lt;a href="http://preview.msn.com/"&gt;the
new MSN home page&lt;/a&gt; until I reauthorize these apps. Those issues are &lt;strike&gt;orthogonal&lt;/strike&gt; unrelated
given the OAuth authorized apps didn't have my password in the first place. 
&lt;/p&gt;
&lt;p&gt;
Thus I question the recommendation at the end of the article that it is a good idea
to even ask users about de-authorizing applications as part of password reset since
it is misleading (i.e. it gives the impression the hack attempt was from one of your
authorized apps instead of someone trying to guess your password) and just causes
a hassle for the user who now has to reauthorize all the applications at a later date
anyway. 
&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=Rascal Flatts&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Rascal
Flatts&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Rascal Flatts+What Hurts The Most&amp;amp;x=0&amp;amp;y=0"&gt;What
Hurts The Most&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=9d1L7gvTDuM:_lsgNoyvukA: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=9d1L7gvTDuM:_lsgNoyvukA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=9d1L7gvTDuM:_lsgNoyvukA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=9d1L7gvTDuM:_lsgNoyvukA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=9d1L7gvTDuM:_lsgNoyvukA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=9d1L7gvTDuM:_lsgNoyvukA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=9d1L7gvTDuM:_lsgNoyvukA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=9d1L7gvTDuM:_lsgNoyvukA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=9d1L7gvTDuM:_lsgNoyvukA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/9d1L7gvTDuM" 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=852153cc-aca5-4ef9-aa1f-a19686be9d26" />
    <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=852153cc-aca5-4ef9-aa1f-a19686be9d26" title="1 Comment" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=852153cc-aca5-4ef9-aa1f-a19686be9d26</commentRss>
    <title>Startup Advice: Find Underserved Markets</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/11/04/StartupAdviceFindUnderservedMarkets.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=852153cc-aca5-4ef9-aa1f-a19686be9d26</id>
    <published>2009-11-04T07:09:35.2398827-08:00</published>
    <updated>2009-11-04T07:09:35.2398827-08:00</updated>
    <category term="Startup Shoutout" label="Startup Shoutout" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Startup+Shoutout" />
    <content type="html">&lt;blockquote&gt; 
&lt;p&gt;
“Every marketer's dream is to find an unidentified or unknown market and develop it”
– &lt;a href="http://www.nybooks.com/articles/22237"&gt;Barry Brand&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Last week I read the various notes on the &lt;a href="http://www.bing.com/search?q=startup+school++2009+site%3Atechcrunch.com"&gt;presentations
by famous startup founders at Startup School 2009&lt;/a&gt; and found a lot of the anecdotes
interesting but wondered if they were truly useful to startup founders. I tried to
think of some of the products I started using in the past five years that I now use
a lot today and couldn’t do without. In looking for the common thread in these products
and the quote above came to mind. 
&lt;/p&gt;
&lt;p&gt;
Finding an underserved market sounds like getting the winning ticket in a lottery,
unlikely. In truth it isn’t hard to find underserved markets if you recognize the
patterns. The hard part in turning it into a successful business is execution.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
There are two patterns I’ve used in looking for underserved markets that were invigorated
by products I now use regularly today. The first pattern is looking for activities
people like doing where the technology has been stagnant for a while. For the past
few decades, we’ve been in world where the technology products you use can be made
smaller, cheaper and faster every few years. There is some notion of waiting for the
stars to align such as hard drive sizes shrinking until you could fit gigabytes of
data in your pocket (e.g. the &lt;a href="http://www.apple.com/ipod"&gt;iPod&lt;/a&gt;) or AJAX
and online banking becoming ubiquitous (e.g. &lt;a href="http://www.mint.com"&gt;Mint&lt;/a&gt;).
However for each product category where some upstart has changed the game by leveraging
modern technologies there are still dozens of markets where decade(s) old tech is
dictating the user experience. 
&lt;/p&gt;
&lt;p&gt;
Another patterns is looking for an activity or task that people hate doing but assume
is a fact of life or a necessary aspect of using a product. I remember when I’d buy
video games like Soul Calibur and lament about how I could only find people to play
with when I went to visit friends from out of town who were also fans of the game.
To me, not being able to play multiplayer games without having friends physically
in the same room was just a fact of live. This is no longer the case in the world
of &lt;a href="http://www.xbox.com/live"&gt;XBox Live&lt;/a&gt;. I also remember almost cancelling
my cable subscription about five or six years ago because I resented having to tailor
my TV watching schedule around prime time hours which to me represented prime hours
to decompress from work and hack on &lt;a href="http://www.rssbandit.org"&gt;RSS Bandit&lt;/a&gt;.
The entire notion of “prime time TV” has been a fact of life for decades. Once I discovered &lt;a href="http://www.tivo.com"&gt;TiVo&lt;/a&gt;,
it stopped being the case for me. Some of these painful facts of life have been with
us for centuries. For example, take this quote from &lt;a href="http://en.wikipedia.org/wiki/John_Wanamaker"&gt;John
Wanamaker&lt;/a&gt;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
“Half the money I spend on advertising is wasted; the trouble is I don't know which
half”
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
with modern advertising solutions like &lt;a href="http://www.google.com/adwords"&gt;Google’s
Adwords&lt;/a&gt; and &lt;a href="http://www.facebook.com/advertising/"&gt;Facebook’s Advertising
platform&lt;/a&gt; this is no longer the case. People can now tell down to minute levels
of detail exactly what their return on investment is on advertising. 
&lt;/p&gt;
&lt;p&gt;
I’d love to see more startups attempting to find and satisfy underserved markets instead
of going with the crowd and doing what everyone else is doing. Less Facebook games
and iPhone fart apps, more original ideas that solve real problems like Mint and Flickr.
If your startup needs a few hints at what some of these markets are in the technology
space, there’s always &lt;a href="http://ycombinator.com/ideas.html"&gt;YCombinator’s list
of Startup Ideas they’d fund&lt;/a&gt;.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="vertical-align: middle" title="Note" alt="Note" src="http://shared.live.com/HjKMzTS-xzcms40%21CabizA/emoticons/music_note.gif" /&gt; Now
Playing: &lt;a href="http://www.amazon.com/gp/search/ref=sr_adv_m_pop/?search-alias=popular&amp;amp;unfiltered=1&amp;amp;field-keywords=&amp;amp;field-artist=Jay-Z Feat. Kanye West&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Jay-Z
Feat. Kanye West&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Jay-Z Feat. Kanye West+Hate&amp;amp;x=0&amp;amp;y=0"&gt;Hate&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=lDa0rU6UvC0:wVlTdN-7PBU: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=lDa0rU6UvC0:wVlTdN-7PBU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=lDa0rU6UvC0:wVlTdN-7PBU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=lDa0rU6UvC0:wVlTdN-7PBU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=lDa0rU6UvC0:wVlTdN-7PBU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=lDa0rU6UvC0:wVlTdN-7PBU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=lDa0rU6UvC0:wVlTdN-7PBU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=lDa0rU6UvC0:wVlTdN-7PBU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=lDa0rU6UvC0:wVlTdN-7PBU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/lDa0rU6UvC0" 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=5a3617fc-7d96-4f2e-a909-7245bbe39e90" />
    <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=5a3617fc-7d96-4f2e-a909-7245bbe39e90" title="2 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5a3617fc-7d96-4f2e-a909-7245bbe39e90</commentRss>
    <title>New MSN Homepage with Activity Streams from Windows Live, Facebook and Twitter</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/11/04/NewMSNHomepageWithActivityStreamsFromWindowsLiveFacebookAndTwitter.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=5a3617fc-7d96-4f2e-a909-7245bbe39e90</id>
    <published>2009-11-04T06:10:55.6315264-08:00</published>
    <updated>2009-11-04T06:10:55.6315264-08:00</updated>
    <category term="MSN" label="MSN" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=MSN" />
    <category term="Windows Live" label="Windows Live" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Windows+Live" />
    <content type="html">&lt;p&gt;
On the MSN blog there's a new blog post entitled &lt;a href="http://msnblog.msn.com/blogpost.aspx?post=1351217"&gt;The
New MSN Homepage Unveiled&lt;/a&gt; which states
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Today is an exciting day for our team at MSN because we unveiled the &lt;/em&gt;&lt;a href="http://preview.msn.com/"&gt;&lt;em&gt;most
significant redesign&lt;/em&gt;&lt;/a&gt;&lt;em&gt; our MSN.com homepage has seen in over a decade.
We spent thousands of hours talking with customers; testing hundreds of ideas; experimenting
around the world and carefully evaluating what our users want, and don’t want - to
deliver a homepage that is designed to be the best homepage on the Web. We hope you’ll
agree.&lt;/em&gt; 
&lt;br /&gt;
… 
&lt;br /&gt;
&lt;em&gt;So, we started from scratch to cut the clutter on our homepage and reduced the
amount of links by 50%. There’s also a simplified navigation across news, entertainment,
sports, money, and lifestyle that lets you drill into information topics that interest
you, without being overwhelming. Local information from your neighborhood is important
to you and so is high quality, in-line video – so we offer both, right on the homepage.
And, you told us you want the latest information not only from your favorite sources,
but also from your friends, and the breadth of the Web – so we now offer convenient
access to Facebook, Twitter, &amp;amp; Windows Live services and the most powerful search
experience on the Web from Bing, empowering you to make more informed, faster decisions.
And this is just the beginning - keep visiting our blog for more MSN news in the coming
weeks.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is a really exciting release for my team on Windows Live since we're responsible
for the underlying platform that powers the display of what activities your friends
have been performing across Windows Live. Working with the MSN home page team was
a good experience and its great to see that the &lt;a href="http://advertising.microsoft.com/msn-home-page?S_INT=ticker_MSNHomePage"&gt;tens
of millions of people who visit the MSN home page regularly&lt;/a&gt; will now get to experience
our work. Kudos to the MSN team on a very nice release. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://4vwitg.bay.livefilestore.com/y1pVpmCTnwDm5C8AjDQ8KtTcOAEXU1LOzPEvXjgfkoOkFqWu9r9vu8X1Zu5OlFoyVsCY8qIJ3wUGWLsl1YF3CRfYQ/MSN%20homepage.PNG" width="629" height="572" /&gt;
&lt;/p&gt;
&lt;p&gt;
You can try out the new home page for yourself at &lt;a href="http://preview.msn.com"&gt;http://preview.msn.com&lt;/a&gt; 
&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=Jay-Z&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Jay-Z&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Jay-Z+Reminder&amp;amp;x=0&amp;amp;y=0"&gt;Reminder&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=wwoWk9ZtL_M:aBSdMWJ_3RQ: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=wwoWk9ZtL_M:aBSdMWJ_3RQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=wwoWk9ZtL_M:aBSdMWJ_3RQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=wwoWk9ZtL_M:aBSdMWJ_3RQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=wwoWk9ZtL_M:aBSdMWJ_3RQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=wwoWk9ZtL_M:aBSdMWJ_3RQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=wwoWk9ZtL_M:aBSdMWJ_3RQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=wwoWk9ZtL_M:aBSdMWJ_3RQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=wwoWk9ZtL_M:aBSdMWJ_3RQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/wwoWk9ZtL_M" 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=53357874-aea4-4c84-bba2-981c05fba933" />
    <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=53357874-aea4-4c84-bba2-981c05fba933" title="2 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=53357874-aea4-4c84-bba2-981c05fba933</commentRss>
    <title>Real-time, Distributed Conversations: Some Thoughts on the Salmon Protocol</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/11/02/RealtimeDistributedConversationsSomeThoughtsOnTheSalmonProtocol.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=53357874-aea4-4c84-bba2-981c05fba933</id>
    <published>2009-11-02T06:50:44.5589111-08:00</published>
    <updated>2009-11-02T06:50:44.5589111-08:00</updated>
    <category term="Social Software" label="Social Software" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Social+Software" />
    <category term="Syndication Technology" label="Syndication Technology" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Syndication+Technology" />
    <content type="html">&lt;p&gt;
Last week John Panzer, who works on Blogger at Google, wrote about some of the work
he’s been doing on creating a protocol for syndicating comments associated with activity
streams in his post &lt;a href="http://www.abstractioneer.org/2009/10/salmon-protocol-introducing-salmon.html"&gt;The
Salmon Protocol: Introducing the Salmon Project&lt;/a&gt;. Key parts of his post are excerpted
below 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;A few days ago, at the &lt;/em&gt;&lt;a href="http://www.readwriteweb.com/archives/real_time_web_event.php"&gt;&lt;em&gt;Real
Time Web Summit&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, we had a session about &lt;/em&gt;&lt;a href="http://salmon-protocol.org/"&gt;&lt;em&gt;Salmon&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
a protocol for re-aggregated distributed conversations around web content.&amp;#160; I
was hoping for some feedback and to generate some interest, and I was overwhelmed
by the positive reactions, especially after Louis Gray's post &lt;/em&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fblog.louisgray.com%2F2009%2F10%2Fproposed-salmon-protocol-aims-to-unify.html&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFrqEze-c491wB5WhBBdf1Io_6ryFbeofA"&gt;&lt;em&gt;&amp;quot;Proposed
Salmon Protocol aims to unify Conversations on the Web&amp;quot;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Adina Levin's &lt;/em&gt;&lt;a href="http://www.alevin.com/?p=1806"&gt;&lt;em&gt;&amp;quot;Salmon
- Re-assembling distributed conversations&amp;quot;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; is a good, insightful
review as well. There's clearly a great deal of interest in this, and so I've gone
ahead and expanded Salmon's home at &lt;/em&gt;&lt;a href="http://salmon-protocol.org/"&gt;&lt;em&gt;salmon-protocol.org&lt;/em&gt;&lt;/a&gt;&lt;em&gt; with
an open source project, &lt;/em&gt;&lt;a href="http://salmon-protocol.googlecode.com/"&gt;&lt;em&gt;salmon-protocol.googlecode.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,
and a mailing list, &lt;/em&gt;&lt;a href="http://groups.google.com/group/salmon-protocol"&gt;&lt;em&gt;groups.google.com/group/salmon-protocol&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Louis Gray’s post on the topic includes an embedded presentation which captures the
essence of the protocol
&lt;/p&gt;
&lt;iframe height="451" src="http://docs.google.com/present/embed?id=dfjqf7vg_5cc7c976f&amp;amp;size=m" frameborder="0" width="555"&gt;
&lt;/iframe&gt;
&lt;p&gt;
Before talking about the technical details of the protocol it is a good idea to understand
the end user problem the protocol solves. For me, it solves a problem I have in the
way that &lt;a title="Dare Obasanjo aka Carnage4Life: RSS Bandit + Facebook = RSS Bandit 1.9.0.972" href="http://www.25hoursaday.com/weblog/2009/10/13/RSSBanditFacebookRSSBandit190972.aspx"&gt;RSS
Bandit integrates with Facebook&lt;/a&gt;. The problem is that although there is a way to
get regular updates on changes to the user’s news feed by polling Facebook’s stream
and &lt;a title="Facebook Developer Wiki: Using Activity Streams" href="http://wiki.developers.facebook.com/index.php/Using_Activity_Streams"&gt;getting
data back in the Activity Stream format&lt;/a&gt; there isn’t a mechanism today to get updates
on the comments on items in the feed. What it means in practice today is that once
an item rolls off of the news feed, there is no way to keep the comments up to date
in RSS Bandit. 
&lt;/p&gt;
&lt;p&gt;
The Salmon Protocol aims to address this problem by piggybacking on &lt;a href="http://code.google.com/p/pubsubhubbub/"&gt;PubSubHubBub&lt;/a&gt; as
a way for applications to get real-time updates on comments on items in an activity
stream not just updates on new activities. 
&lt;/p&gt;
&lt;p&gt;
There have also been several mentions of Salmon being a way to aggregate distributed
conversations on an item (e.g. this blog post is syndicated to&amp;#160; FriendFeed and
there are comments there as well as in the comments on my blog) but I am less clear
on those scenarios or whether Salmon is enough to solve the various tough problems
that need to be solved to make that work end to end. 
&lt;/p&gt;
&lt;p&gt;
Any API for posting comments to a site needs to solve two problems; identity and dealing
with comment spam. I decided to take a look at the &lt;a href="http://www.salmon-protocol.org/salmon-protocol-summary"&gt;Salmon
Protocol Summary&lt;/a&gt; to see how it addresses these problems. 
&lt;/p&gt;
&lt;p&gt;
The meat of the Salmon Protocol format is excerpted below 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;A source provides an RSS/Atom feed of content. It includes a Salmon link in its
feed:&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;lt;link rel=&amp;quot;salmon&amp;quot; href=&amp;quot;http://example.org/salmon-endpoint&amp;quot;/&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;An aggregator reads the feed (ideally via a push mechanism such as PubSubHubbub),
and sees from the link that it is Salmon-enabled. It remembers the endpoint URL for
later use.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;When an aggregator's user leaves a comment on a feed item, the aggregator stores
the comment as usual, and then also POSTs a salmon version of it to the source's Salmon
endpoint:&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;POST /salmon-endpoint HTTP/1.1&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;Host: example.org&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;Content-Type: application/atom+xml&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;entry xmlns='http://www.w3.org/2005/Atom'&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;author&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;name&amp;gt;John Doe&amp;lt;/name&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;uri&amp;gt;acct:johndoe@aggregator-example.com&amp;lt;/uri&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/author&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;content&amp;gt;Yes, but what about the llamas?&amp;lt;/content&amp;gt;&amp;#160; &lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;tag:aggregator-example.com,2009:cmt-441071406174557701&amp;lt;/id&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;updated&amp;gt;2009-09-28T18:30:02Z&amp;lt;/updated&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0'&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ref='tag:example.org,1999:id-22717401685551851865'/&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;sal:signature xmlns:sal='http://salmonprotocol.org/ns/1.0'&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e55bee08b4c643bc8aedf122f606f804269b7bc7&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/sal:signature&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;title/&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;em&gt;&amp;lt;/entry&amp;gt;&lt;/em&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The commenter is identified in the published comment using the &lt;a href="http://atompub.org/rfc4287.html#element.uri"&gt;atom:uri
element&lt;/a&gt;. How this author is authenticated in situations outside of public comments
on a blog such as RSS Bandit posting a comment to Facebook on my behalf isn’t really
discussed. I noticed an offhand reference to OAuth headers which&amp;#160; seems to imply
that the publishing application should also be sending authentication headers as well
when publishing the comment. How these authentication headers would flow through the
systems involved is unclear to me especially given the approach Salmon has taken to
deal with spam prevention. 
&lt;/p&gt;
&lt;p&gt;
The workflow for dealing with spam comments is described as follows 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;A major concern with this type of distributed protocol is how to prevent spam
and abuse.&amp;#160; Salmon provides building blocks to allow in-depth defense against
attacks.&amp;#160; Specifically, every salmon has a verifiable author and user agent.&amp;#160;
The basic security flow when salmon swims upstream looks like this:&lt;/em&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;&lt;b&gt;aggregator-example.com&lt;/b&gt;: &amp;quot;Here is a salmon, authored and signed by
'acct:johndoe@aggregator-example.com'; please accept it.&amp;quot; &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;b&gt;Recipient&lt;/b&gt;: &amp;quot;I know that this is really aggregator-example.com due
to its OAuth headers, and it has a good reputatation, but I do not trust it completely;
I will do a double check.&amp;quot; &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;b&gt;Recipient&lt;/b&gt;: Uses Webfinger/XRD to discover salmon validation service for
acct:johndoe@aggregator-example.com, which turns out to be hosted by aggregator-example.com.&lt;/em&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;b&gt;Recipient&lt;/b&gt;: &amp;quot;Given that johndoe has delegated Salmon validation to
aggregator-example, and I know I'm talking to aggregator-example already, I'll skip
the actual check.&amp;quot; (Returns HTTP 200 to aggregator-example.com)&lt;/em&gt; 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;em&gt;The flow can get more complicated, especially if the aggregator is not also providing
identity services for the user.&amp;#160; In the most general case, the recipient needs
to take the salmon, discover a salmon validator service for the author via XRD discovery
on the author's URI, and POST the salmon to the validator service. The validator service
does an integrity / signature check against the salmon and returns 200 if the salmon
checks out, 400 if not.&amp;#160; The signature check means that the given author (johndoe
in this case) signed the salmon with the given id, parent id, and timestamp.&amp;#160;
It does not attempt to do a full, XML-DSig style verification, though such a service
is another reasonable extension.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This flow seems weird and it is unclear to me that it actually solves the problems
involved in distributed commenting. So let’s say I post a comment to Facebook from
RSS Bandit, in step 3 above they are now supposed to use &lt;a href="http://code.google.com/p/webfinger/"&gt;WebFinger&lt;/a&gt; to
lookup my email address provider and determine which service I use for digitally signing
comments. Then they ask it if the comment looks like it was from me. 
&lt;/p&gt;
&lt;p&gt;
Hmm, this looks like a user authentication workflow in disguise as a comment validation
workflow. Shouldn’t the service receiving the comment (i.e. Facebook) in the example
above be responsible for validating my identity not some third party service? Maybe
this protocol wasn’t meant for sites like Facebook? 
&lt;/p&gt;
&lt;p&gt;
Let’s say this protocol is really meant for situations when the comment recipient
doesn’t intend to be the sole identity provider such as commenting on &lt;a href="http://scobleizer.com/"&gt;Robert
Scoble's blog&lt;/a&gt; where he allows comments from anyone with just an email address
and an optional web page URL as identifiers. So each commenter needs to provide an
email address on an email service provider that supports WebFinger &lt;u&gt;and&lt;/u&gt; validates
digital signatures in the specific situation related to the Salmon protocol? Sounds
like boiling the ocean. I wonder why this can’t work with OpenID validation or some
other authentication protocol that has already been validated by developers and is
seeing some adoption? 
&lt;/p&gt;
&lt;p&gt;
At the end of the day, I think the problem Salmon attempts to solve is one that needs
solving as activity streams become a more popular and intrinsic feature across the
Web. However in its current form it’s hard for me to see how it actually solves the
real problems that exist today in a practical way. 
&lt;/p&gt;
&lt;p&gt;
Of course, this may just be my misunderstanding of the protocol documents currently
published and I look forward to being corrected by one of the protocol gurus if that
is the case. 
&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=Chris Brown&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Chris
Brown&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Chris Brown+I Can Transform Ya (feat. Lil Wayne)&amp;amp;x=0&amp;amp;y=0"&gt;I
Can Transform Ya (feat. Lil Wayne)&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=61SoU_Ft_7s:8bsj1sYLjCA: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=61SoU_Ft_7s:8bsj1sYLjCA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=61SoU_Ft_7s:8bsj1sYLjCA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=61SoU_Ft_7s:8bsj1sYLjCA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=61SoU_Ft_7s:8bsj1sYLjCA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=61SoU_Ft_7s:8bsj1sYLjCA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=61SoU_Ft_7s:8bsj1sYLjCA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=61SoU_Ft_7s:8bsj1sYLjCA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=61SoU_Ft_7s:8bsj1sYLjCA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/61SoU_Ft_7s" 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=1936436b-0ccf-4685-bea3-dbb561a753f5" />
    <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=1936436b-0ccf-4685-bea3-dbb561a753f5" title="1 Comment" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=1936436b-0ccf-4685-bea3-dbb561a753f5</commentRss>
    <title>Keeping the Stream Pure: FriendFeed vs. Twitter vs. Facebook</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/11/02/KeepingTheStreamPureFriendFeedVsTwitterVsFacebook.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=1936436b-0ccf-4685-bea3-dbb561a753f5</id>
    <published>2009-11-02T06:00:42.9570785-08:00</published>
    <updated>2009-11-02T06:00:42.9570785-08: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;
Robert Scoble had an epiphany on one of the key problems with FriendFeed’s design
that he now realizes now that he’s no longer a fanatical user of the service in his
post &lt;a href="http://scobleizer.com/2009/11/02/the-chat-roomforum-problem-an-apology-to-technosailor/"&gt;The
chat room/forum problem (&amp;amp; an apology to @Technosailor)&lt;/a&gt; . Robert writes 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Twitter got lists.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;This let us throw together a list of experts. For instance, I put together &lt;/em&gt;&lt;a href="http://twitter.com/Scobleizer/founders"&gt;&lt;em&gt;a
list of people who have started companies&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Compare that feed to your
average Facebook feed and you’ll see it in stark black and white: your Facebook feed
is “fun” but isn’t teaching you much. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;It becomes even more stark when you do a list like &lt;/em&gt;&lt;a href="http://twitter.com/Scobleizer/tech-news-brands"&gt;&lt;em&gt;my
tech news brands list&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. See, this is NOT a forum! It is NOT a chat room!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;No one can enter this community without being invited. Now compare to FriendFeed.
We could have built a list like this over there, but it would have gotten noiser because
of a feature called “Friend of a Friend.” That drags in people the list owner didn’t
invite. Also, anyone can comment underneath any items on Facebook or FriendFeed. That
brings people into YOUR life that YOU DID NOT INVITE!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Again, at first, this seems very democratic and very nice. After all, it’s great
to throw a party for the whole world and let them drink your wine and have conversations
with your kids. But, be honest here, would you rather have a private dinner with Steve
Jobs, or would you rather have a dinner with Steve Jobs and 5,000 people who you don’t
really know?&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
As someone who works on a platform for real-time streams for a living I always find
it interesting to compare the approaches of various companies. 
&lt;/p&gt;
&lt;p&gt;
I agree with Robert that FriendFeed’s friend of friend feature breaks a fundamental
model of the stream. In an earlier post on &lt;a title="Dare Obasanjo aka Carnage4Life: Some Thoughts on User Interfaces for Activity Streams" href="http://www.25hoursaday.com/weblog/2009/01/17/SomeThoughtsOnUserInterfacesForActivityStreams.aspx"&gt;the
problems with some of FriendFeed's design decisions&lt;/a&gt; I pointed out the following
problem with the feature 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;FriendFeed shows you content from friends of friends: This is major social faux
pas. It may sound like a cool viral feature but showing me content from people I haven't
subscribed to means I don't have control of who shows up in my feed and it takes away
from the intimacy of the site because I'm always seeing content from strangers.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
One of the things I’ve learned about how people interact with activity streams and
news feeds is that it is important to feel like you are in control of the experience.
FriendFeed’s friend of friend feature explicitly takes that away from users. I can
understand why they did it (i.e. to increase the amount of content showing up in the
stream for people with few friends and as a friend discovery mechanism)&amp;#160; but
it doesn’t change the fact that the behavior can seem like a nuisance and even lead
to &lt;a href="http://www.lamebook.com/"&gt;lamebook&lt;/a&gt; style socially awkward situations.&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
However unlike Robert I don’t really agree with his characterization of the differences
between streams on Facebook versus Twitter. On both sites, I as a user choose who
the primary sources that show up in my stream are. Facebook is for people I know,
Twitter is for brands and people I find interesting. I find both sites fun but I agree
that I’m more likely to learn something new related to work from Twitter than from
Facebook. Whether I am “learning” something new or not isn’t what’s important but
whether I feel like I’m getting value out of the experience. As Biz Stone wrote in &lt;a title="Twitter Blog: Twitter&amp;#39;s New Terms of Service" href="http://blog.twitter.com/2009/09/twitters-new-terms-of-service.html"&gt;a
blog post on Twitter's new terms of service&lt;/a&gt;&amp;#160;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;At the start, critics often said, &amp;quot;Twitter is fun, but it's not useful.&amp;quot;
At one point @&lt;/em&gt;&lt;a href="http://twitter.com/ev"&gt;&lt;em&gt;ev&lt;/em&gt;&lt;/a&gt;&lt;em&gt; responded dryly
with, &amp;quot;Neither is ice cream.&amp;quot;&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Although comments in the news feed on Facebook bring people I didn’t explicitly add
into my stream, they are often OK because they are often people who I consider to
be part of my extended social network or at least are on topic. This would never work
on Twitter with retweets being shown inline (for example) since anyone can follow
anyone else or retweet their content which would lead to the same sort of chat room/forum
noise that Robert decries in his post. 
&lt;/p&gt;
&lt;p&gt;
Looking at &lt;a title="Twitter Blog - Project Retweet: Phase One" href="http://blog.twitter.com/2009/08/project-retweet-phase-one.html"&gt;the
sketches from Twitter’s Project Retweet&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://1.bp.blogspot.com/_E8ZD85Wzu9E/SoR0uarxNlI/AAAAAAAAAno/u8VMaBv1bHo/s1600-h/retweet.png"&gt;&lt;img src="http://rncs7g.bay.livefilestore.com/y1piGbOi3kjhamM6o-V3BgLz8Rd6Oe2t5gBwTOgp8psm1NSpRFkSPbTj5PdsT5PlZ1aJmVzbgThADkTITwh6ByDVQ/retweet.png" width="300" height="300" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I don’t think Robert’s concerns about retweets polluting the stream are warranted.
From the above sketch, it just looks like Twitter is fixing the bug in the retweeting
process where I have to use part of my 140 character quota to provide attribution
when retweeting an interesting status update. This leads to interesting behavior such
as &lt;a href="http://twitter.com/diveintomark/status/5275195046"&gt;people keeping their
tweets under 125 characters to enable retweeting&lt;/a&gt;. I have to admit I’ve wondered
more than once if I should make a tweet shorter so that it is easier to retweet. Project
Retweet is fixing in a way that encourages an existing user practice on the site.
That deserves kudos in my book. 
&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=Jay-Z Feat. Alicia Keys&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Jay-Z
Feat. Alicia Keys&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Jay-Z Feat. Alicia Keys+Empire State Of Mind&amp;amp;x=0&amp;amp;y=0"&gt;Empire
State Of Mind&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=AXpuzLmWsr8:F8uHnzs44VM: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=AXpuzLmWsr8:F8uHnzs44VM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=AXpuzLmWsr8:F8uHnzs44VM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=AXpuzLmWsr8:F8uHnzs44VM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=AXpuzLmWsr8:F8uHnzs44VM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=AXpuzLmWsr8:F8uHnzs44VM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=AXpuzLmWsr8:F8uHnzs44VM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=AXpuzLmWsr8:F8uHnzs44VM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=AXpuzLmWsr8:F8uHnzs44VM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/AXpuzLmWsr8" 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=39f94a92-4f4c-4291-b303-a86246496ea3" />
    <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=39f94a92-4f4c-4291-b303-a86246496ea3" title="8 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=39f94a92-4f4c-4291-b303-a86246496ea3</commentRss>
    <title>Facebook Seattle Engineering Road Show: Mike Shroepfer on Engineering at Scale at Facebook</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/10/29/FacebookSeattleEngineeringRoadShowMikeShroepferOnEngineeringAtScaleAtFacebook.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=39f94a92-4f4c-4291-b303-a86246496ea3</id>
    <published>2009-10-29T08:17:12.1494067-07:00</published>
    <updated>2009-10-29T08:17:12.1494067-07:00</updated>
    <category term="Trip Report" label="Trip Report" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Trip+Report" />
    <content type="html">&lt;p&gt;
Earlier today (or should I say yesterday) I attended Facebook’s &lt;a href="http://www.facebook.com/home.php#/event.php?eid=162270929720&amp;amp;index=1"&gt;Seattle
Engineering Road Show&lt;/a&gt; which was a part technical talk and part recruiting event
where Mike Shroepfer and a number of other Facebook engineers gave a fairly deep technical
talk about the technologies used by Facebook. 
&lt;/p&gt;
&lt;p&gt;
Below are my notes on the presentation and ensuing Q&amp;amp;A session. One thing I found
interesting about the talk was how similar their architecture for the platform that
powers the &lt;a href="http://www.facebook.com/help.php?page=408"&gt;Facebook news feed&lt;/a&gt; is
to what my team has built for powering the &lt;a href="http://jamiethomson.spaces.live.com/blog/cns!550F681DAD532637!5914.entry"&gt;Windows
Live What's New feed&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Before the presentation started there were a bunch of slides that carried some interesting
and sometimes impressive stats about Facebook including 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Average number of friends per user is 130 
&lt;/li&gt;
&lt;li&gt;
Total number of Facebook applications is 350,000 
&lt;/li&gt;
&lt;li&gt;
It is the number 1 Photo Site on the Web 
&lt;/li&gt;
&lt;li&gt;
More events are created on the site than on &lt;a href="http://www.evite.com"&gt;Evite&lt;/a&gt; per
day 
&lt;/li&gt;
&lt;li&gt;
People spend &lt;strike&gt;6&lt;/strike&gt; 8 billion minutes per day on Facebook which makes
it the number 1 site on the Web according to many measurement services including Nielsen
and ComScore. 
&lt;/li&gt;
&lt;li&gt;
The fastest growing demographic is users aged 35 and older. 
&lt;/li&gt;
&lt;li&gt;
The page with the most fans is &lt;a href="http://www.facebook.com/barackobama"&gt;Barack
Obama with 6.8 million fans&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
The TV show with the most fans is &lt;a href="http://www.facebook.com/southpark"&gt;South
Park&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;
70% of their users are outside the United States of America 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Mike Shreopfer started his talk with a number of impressive statistics. These stats
include the fact that 2 billion pieces of content are shared per week when you add
up all of the status updates, comments, likes and other sharing gestures that are
performed on the site. There are also 2 billion photos uploaded per month, 15,000
Facebook Connect implementations which in combination with the various platform applications
make over 5 billion API calls per day and about 300 million active users per month. 
&lt;/p&gt;
&lt;p&gt;
Scaling Facebook has proven more challenging than scaling a traditional website. In
a traditional website, you put a user’s data in a database then whenever the user’s
data is requested you have some web or mid-tier layer retrieve the user’s data from
the database. Such applications (e.g. Web-based email services) are easily partitionable
and it is thus straightforward to scale them horizontally by creating different pools
of users and putting various groups of users on particular servers. The original design
for Facebook was similarly trivial to scale. In the early days, each college lived
on it’s own cluster (e.g. &lt;a href="http://harvard.facebook.com"&gt;http://harvard.facebook.com&lt;/a&gt;)
and the service was thus trivial to scale. This model broke down when Facebook made
it possible for users to make friends from different colleges and eventually making
friends across different geographical networks. At this point it became harder to
partition data since all users were interconnected. Rendering a user’s homepage didn’t
just mean looking up that user’s data but also data from all their friends. This change
continues to be Facebook’s core scalability challenge. 
&lt;/p&gt;
&lt;p&gt;
The most famous example of tackling this challenge is the Facebook news feed. When
you hit the news feed they render 45 stories on your homepage. The service has a couple
of milliseconds to query the feeds of up to 5,000 of your closest friends and then
choose which 45 stories are the best ones to show the user. There is a platform named &lt;em&gt;Multifeed&lt;/em&gt; which
is the underlying platform which powers the news feed and allows them to filter down
tens of thousands of stories to forty five stories when rendering the home page. This
process involves fetching metadata for news stories from memcache clusters that perform
over 50 million operations per second. These queries include rich media such as photos
which are served at the rate of 1.2 million photos per second. 
&lt;/p&gt;
&lt;p&gt;
In aggregate they currently store more than 20 billion photos at 4 different resolutions
per photo (i.e. 80 billion image files). Back in 2005, photos were served from &lt;a href="http://en.wikipedia.org/wiki/Network_File_System_%28protocol%29"&gt;NFS&lt;/a&gt; clusters.
They eventually hit some bottlenecks because file systems are not really designed
for serving large numbers of photos. The metadata ended up being too large to fit
in memory and there were numerous I/O bottlenecks. The second implementation of the
photos service contained several implementations such as putting profile photos in
a caching tier and moving a large number of photos to a &lt;a href="http://en.wikipedia.org/wiki/Content_Delivery_Network"&gt;Content
Distribution Network (CDN)&lt;/a&gt;. They also built a file handle cache for their NFS
systems to reduce the amount of disk I/O involved when looking up the location of
the file. The 3rd generation of their photo service is a custom storage solution known
as &lt;a href="http://www.facebook.com/note.php?note_id=76191543919"&gt;Haystack&lt;/a&gt;. Haystack
runs on commodity hardware (i.e. Dell Linux boxes with a terabyte SATA drives) and
is a custom file system which keeps all file indexes in RAM to speed up lookups. Today
Haystack is so optimal that it only takes one I/O operation to load a photo compared
to 3 I/O operations for the previous optimized implementation and 10 I/O operations
for the initial NFS based system. Haystack is so scalable that they once accidentally
disabled their CDNs and Haystack served all photos on the site without breaking a
sweat. The service was built by 3 developers in a couple of months. It will be Open
Sourced in the near future. 
&lt;/p&gt;
&lt;p&gt;
Another example of Facebook’s approach to scaling is the recent addition of &lt;a href="http://blog.facebook.com/blog.php?post=90316352130"&gt;custom
usernames to the site&lt;/a&gt;. When the feature launced they had over 200 million active
users. There was a lot of internal debate on how to fairly allocate usernames to their
users and they even tested auctioning usernames. However this ended up being confusing
to users so they decided to go with the simpler first come, first served model as
the primary way for users to get their preferred user name. Given the expected rush
of users who would sign up for username, the developers expected the load to be the
equivalent of a denial of service attack and planned accordingly. There were a number
of contingency plans to reduce load on the site including disabling the chat feature,
reducing the number of items in the news feed from 45 to 15 and even serving static
HTML on some pages. However none of these contingencies had to be put in place when
the username feature was launched because the service scaled so well. Users signed
up for 200,000 usernames in the first 3 minutes, 500,000 within the first 15 minutes
and had created over&amp;#160; 1 million usernames within the first hour. Since usernames
were created at the root of the Facebook namespace, many users created “fun” usernames
such as &lt;a title="http://www.facebook.com/home.aspx" href="http://www.facebook.com/home.aspx"&gt;http://www.facebook.com/home.aspx&lt;/a&gt; and
they actually had manually reject a user who registered a common typo to one of their
pages.&amp;#160;&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
At the high level you can think of their architecture as being as follows. 
&lt;/p&gt;
&lt;img src="http://rncs7g.bay.livefilestore.com/y1pPR0KcWj2BA1N03CdFQMxDUo0cbZqkpYPeOM97GyZxElNrtRq6G2e6c70oJeQ2-Mry-MXR16HXkLGpJZlU2RWaw/Facebook%20architecture.gif" /&gt; 
&lt;p&gt;
There are PHP web servers which then aggregate data from dedicated web services, in-memory
caches and their relational database. They use PHP on the front-end because it is
easy to learn, easy to develop in and it is very productive. However there are downsides
such as the fact that their benchmarks have shown that it is ten times slower than
if they used more traditional web programming technologies like C# or Java. They have
done a lot of work to optimize PHP and will continue to invest in optimizations instead
of switching the language they use on their front ends. 
&lt;/p&gt;
&lt;p&gt;
Their dedicated web services are built in whatever technology the developer building
the service is most comfortable with. Thus far they have dedicated services in C++,
Erlang (see Eugene Letuchy’s post on &lt;a href="http://www.facebook.com/note.php?note_id=14218138919"&gt;Facebook
Chat’s usage of Erlang&lt;/a&gt;), Python and Java. They have also built a number of tools
that act as building blocks for creating new services so their developers do not reinvent
the wheel. These building blocks include tools like &lt;a href="http://developers.facebook.com/thrift/"&gt;Thrift&lt;/a&gt;;
a cross-language RPC framework that allows you to communicate using serialized objects
in multiple languages C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa,
Smalltalk, and OCaml).There is &lt;a href="http://developers.facebook.com/scribe/"&gt;Scribe&lt;/a&gt; which
is a system for aggregating server logs in real-time and publishing them to a centralized
location. There are also&amp;#160; custom internal tools for centrally managing configuration
of services, as well as monitoring and alerting so that each new service doesn’t have
to figure out how to solve these problems but can instead plug into what they have
already. 
&lt;/p&gt;
&lt;p&gt;
An example of a dedicated internal service at Facebook is MultiFeed. This is the service
which takes the tens of thousands of updates from a user’s friends and whittles them
down to the forty five updates that are shown on the home page when a user logs in.
When a user publishes an update it is both written to MySQL and then published to
a their memcache cluster using Scribe. There is a cache of the fifty most recent items
each user has performed always stored in memory. When a user hits the home page, an
aggregator takes the list of the user’s friends and then queries a bunch of leaf nodes
for activities their friends have performed. Each leaf node does some filtering before
returning data to the aggregator which in turn does some filtering of its own before
returning a list of story IDs to the calling application. The application then looks
up the actual items from memcache given their story IDs and then renders the home
page. 
&lt;/p&gt;
&lt;p&gt;
Multifeed is a custom distributed system which takes the tens of thousands of updates
from friends and picks the 45 that are either most relevant or most recent. Bob updates
status to DB and then Scribe pushes this to a Multifeed server which is acache of
the most recent 50 items the user has performed. This caches data for every user in
the system. When a user shows up, the user hits an aggregator which takes the list
of friends and then each leaf node does some filtering then gets back to the aggregator
which then does some filtering and returns story IDs. Then the aggregator fills out
the data from memcache given the story ID. 
&lt;/p&gt;
&lt;p&gt;
Facebook heavily uses &lt;a href="http://www.danga.com/memcached/"&gt;memcached&lt;/a&gt; which
is an Open Source distributed, in-memory hash table they use to keep load off of their
MySQL databases. They have a love/hate relationship with memcache. On the on hand
it is reliable, has low latency and can handle an extremely high service rate. On
the other hand data is easy to corrupt, the data model is limited and it is an inefficient
way to store small items. They have made several customizations to memcache such as
porting it to 64-bit, moving from TCP to UDP, optimizing the network stack and adding
multithreading support. Their changes have improved the throughput of memcache by
a factor of five compared to when they first started using it. 
&lt;/p&gt;
&lt;p&gt;
Once they got memcached throughput that high, they hit another scaling bottleneck
in that they started flooding their network switches due to putting too much data
on the network. This problem was addressed by using a throttling approach where web
servers request data piecemeal from the caches instead of in one huge request. They
performed a number of experiments comparing batch request size to memcached cluster
size and came away with the conclusion that requesting items in batches of 50 was
the most optimal solution for their system. This throttling also applies at the user
facing application layer. For example, instead of requesting all forty five items
at once when rendering the homepage, a subset of the data is requested and then only
when the users scrolls down below the fold is the rest of the data fetched [&lt;em&gt;Ed.
Note – hey, I’ve noticed that when using Facebook&lt;/em&gt;]. They try to keep the memcache
clusters small so that web servers don’t have to hit lots of cache servers to satisfy
a request. To ensure this locality, data is partitioned vertically by object type
to ensure that all instances of a particular type of object reside on a small set
of cache servers. Since this creates single points of failure, objects in the cache
are sometimes replicated. The term replicated is used loosely to describe the process
of the application layer storing objects on multiple cache servers to simulate database
style replication. When asked how they deal with data inconsistency issues, the response
was that for the most part they limit the object types they “replicate” in this manner
then live with the data inconsistency issues. 
&lt;/p&gt;
&lt;p&gt;
MySQL was initially chosen as their database of choice because it is &lt;u&gt;free&lt;/u&gt;,
simple, fast and reliable.&amp;#160; All told, they have about 6000 server years of runtime
experience without data loss or corruption due to software. However like most megascale
services they often end up using MySQL as a glorified key&amp;lt;-&amp;gt;value store as opposed
to taking advantage of the relational features of the database. When asked why bother
using a relational database, the response is that the database management features
such as data replication and administration are still valuable even if you aren’t
using foreign keys and other relational features. One interesting challenge is that
they often use “data driven schemas” to enable programmers to add new types to the
database without requiring schema changes. This approach sounds similar to what Bret
Taylor described in his post &lt;a href="http://bret.appspot.com/entry/how-friendfeed-uses-mysql"&gt;How
FriendFeed uses MySQL to store schema-less data&lt;/a&gt;. The challenge with this approach
is that you end up with key&amp;lt;-&amp;gt;value pairs stuffed in some column in the database
where you can’t even efficiently query because you can’t index the fields you care
about. 
&lt;/p&gt;
&lt;p&gt;
One of their biggest unsolved problems is coming up with a good story for being a
geographically distributed service. Right now they have a situation where they have
West Coast and East Cost data centers where they use the West Coast DCs for read &amp;amp;
write operations while the East Coast data centers are read-only. This means a user
in New York hits the East Coast DC when reading their news feed but hits a DC in California
when publishing a status update. To keep the data in sync across data centers they
use MySQL replication and have hacked the replication streams to also propagate memcached
cache invalidation commands as well. This &lt;strike&gt;clever solution&lt;/strike&gt; hack has
been previously described in the Facebook engineering blog post by Jason Sobel entitled &lt;a href="http://blog.facebook.com/blog.php?post=7899307130"&gt;Keeping
Up&lt;/a&gt;. There are some tricky problems they have to solve such as users often wanting
the behavior to seem instantaneous despite the replication lag (e.g. I often change
my status then want to check to see what it looks like on my profile/feed). There
is also the open question on whether this solution is workable at a global scale (i.e.
if Facebook ever adds data centers outside of the United States). 
&lt;/p&gt;
&lt;p&gt;
The company has &lt;a href="http://developers.facebook.com/opensource.php"&gt;released or
contributes to a ton of Open Source software&lt;/a&gt;. Besides aforementioned technologies
like Thrift, Scribe and contributions to memcached there are also a number of other
interesting Facebook originated projects like &lt;a href="http://incubator.apache.org/cassandra/"&gt;Cassandra&lt;/a&gt; and &lt;a href="http://www.tornadoweb.org/"&gt;Tornado&lt;/a&gt;.
They also contribute quite heavily to &lt;a href="http://hadoop.apache.org/hive/"&gt;Hive&lt;/a&gt; which
is a data warehousing solution built on top of &lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
There are three key mantras that describe Facebook’s engineering culture
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
Move Fast and Break Things – The company encourages people to take risks and innovate
even at the risk of jeopardizing the stability of the site. It is important to them
to not become risk averse because this is often the downfall of companies as they
grow. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Huge Impact with Small Teams – Most features and underlying systems on the site are
built by teams of one to three people. They have a metric of users per developers
that they are particularly proud. They claim that at Facebook they have 1 developer
for every 1.2 million users which is better than most industry leaders including Google
(1 developer per 190,000 users), Amazon (1 developer per 96,000 users) and Microsoft
(1 developer per 75,000). [&lt;em&gt;Ed. Note – not to be defensive but this metric seems
weird to me and it wasn’t clear how it is calculated.&lt;/em&gt;&amp;#160; ] 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Be Bold and Innovative – self explanatory
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
There were a number of interesting Q &amp;amp; A questions asked and answered but I ran
out of juice in my laptop so didn’t capture them. The answers I do remember are sprinkled
in the notes above. 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
I found it very interesting to learn about the architecture behind MultiFeed as well
as the various scaling challenges and unsolved problems that Facebook still faces.
I'd say there is something like 80% overlap in the way we've approached solving problems
and where we differ our approaches seem more philosophical than architectural. For
example, when our service hit similar issues around network switch saturation due
to high throughput from our in-memory caches we solved the problem in a simpler way
than Facebook's throttled back-off approach although I have to admit their solution
is clever. Our approach was to look for ways to reduce the amount of data we put out
on the network instead Facebook’s approach of staggering requests to reduce the peak
load on the system. 
&lt;/p&gt;
&lt;p&gt;
If you’re interested in working on or building systems similar to the ones described
above for the 500 million users who utilize Windows Live services. Send me a resume,
we’re always looking for good developers. 
&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=Yo Gotti&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Yo
Gotti&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Yo Gotti+5 Star (Remix) [feat. Gucci Mane, Trina &amp;amp; Nickie Minaj]&amp;amp;x=0&amp;amp;y=0"&gt;5
Star (Remix) [feat. Gucci Mane, Trina &amp;amp; Nickie Minaj]&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=1uRgGBDM3xU:2uhg2TUqR2c: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=1uRgGBDM3xU:2uhg2TUqR2c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=1uRgGBDM3xU:2uhg2TUqR2c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=1uRgGBDM3xU:2uhg2TUqR2c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=1uRgGBDM3xU:2uhg2TUqR2c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=1uRgGBDM3xU:2uhg2TUqR2c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=1uRgGBDM3xU:2uhg2TUqR2c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=1uRgGBDM3xU:2uhg2TUqR2c:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=1uRgGBDM3xU:2uhg2TUqR2c:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/1uRgGBDM3xU" 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=318d4231-5799-4ec4-874f-7d7eeb6130b0" />
    <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=318d4231-5799-4ec4-874f-7d7eeb6130b0" title="2 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=318d4231-5799-4ec4-874f-7d7eeb6130b0</commentRss>
    <title>RSS Bandit + Facebook = RSS Bandit 1.9.0.972</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/10/13/RSSBanditFacebookRSSBandit190972.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=318d4231-5799-4ec4-874f-7d7eeb6130b0</id>
    <published>2009-10-13T09:01:45.0366548-07:00</published>
    <updated>2009-10-13T09:01:45.0366548-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;
Over the weekend, Torsten and I shipped a new release of RSS Bandit. Besides bug fixes
there is one key new feature in the release, the ability to view and comment on your
Facebook news feed. The flow for adding Facebook to the application is as follows.
Go to the File-&amp;gt;Synchronize Feeds menu option then select &amp;quot;Facebook&amp;quot; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://4vwitg.bay.livefilestore.com/y1pAzxCBWY5dK5mlxpNZLapbrCV9MmcgrOEuF57obU9XG3UA2j90LouxdECwIJJkjADm8G8sy7UJPLDsNkikVUXYg/synchronize_fb.PNG"&gt;&lt;img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="synchronize_fb[1]" border="0" alt="synchronize_fb[1]" src="http://4vwitg.bay.livefilestore.com/y1pAzxCBWY5dK5mlxpNZLapbrCV9MmcgrOEuF57obU9XG3UA2j90LouxdECwIJJkjADm8G8sy7UJPLDsNkikVUXYg/synchronize_fb.PNG" width="466" height="333" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
then go through the Facebook Connect authorization flow including optionally signing
in and granting the application permission to view your news feed
&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; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="allowaccess_fb%5B1%5D[1]" border="0" alt="allowaccess_fb%5B1%5D[1]" src="http://rssbandit.org/files/media/image/WindowsLiveWriter/ProgressreportonFacebookintegrationintoR_83B4/allowaccess_fb%5B1%5D.png" width="475" height="356" /&gt;&lt;/a&gt; 
&lt;p&gt;
This creates a new feed source containing your Facebook news feed complete with inline
comments as shown below 
&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; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="comments_fb%5B1%5D_2[1]" border="0" alt="comments_fb%5B1%5D_2[1]" src="http://rssbandit.org/files/media/image/WindowsLiveWriter/ProgressreportonFacebookintegrationintoR_83B4/comments_fb%5B1%5D_2.png" width="474" height="334" /&gt;&lt;/a&gt; 
&lt;p&gt;
You can download the new release from &lt;a href="https://sourceforge.net/projects/rssbandit/files/rssbandit/v1.9.0.972/RssBandit1.9.0.972installer-refreshed.zip/download"&gt;here.&lt;/a&gt; More
details about the bug fixes in the release are in the &lt;a title="RSS Bandit Blog: RSS Bandit v1.9.0.972 Release (with updated installer)" href="http://rssbandit.org/project-status/release-notes/rss-bandit-v1-9-0-972-release/"&gt;official
RSS Bandit blog post on the release&lt;/a&gt;.
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
The primary purpose of this release (codenamed Colossus) was to bring stability to
the code base before we made radical changes. With this release out of the way, we
will start working on the &lt;em&gt;Gambit&lt;/em&gt; release right away. The purpose of the next
release is primarily to make RSS Bandit a more modern application that looks like
it belongs on Windows 7 and Windows Vista instead of harkening back to the Office
2003 look of yesteryear. 
&lt;/p&gt;
&lt;p&gt;
You can see our plans for updating the RSS Bandit user interface in my &lt;a title="Dare Obasanjo aka Carnage4Life: A Closer Look at the Upcoming RSS Bandit Ribbon" href="http://www.25hoursaday.com/weblog/2009/05/31/ACloserLookAtTheUpcomingRSSBanditRibbon.aspx"&gt;blog
post and prototype screenshots of the RSS Bandit ribbon&lt;/a&gt;. We will also support
new features of Windows 7 such as &lt;a href="http://windows.microsoft.com/en-us/windows7/products/features/jump-lists"&gt;jump
lists&lt;/a&gt;. As usual, comments and feedback are welcome. 
&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=Dashboard Confessional&amp;amp;field-title=Stolen&amp;amp;field-label=&amp;amp;field-binding=&amp;amp;sort=relevancerank&amp;amp;Adv-Srch-Music-Album-Submit.x=19&amp;amp;Adv-Srch-Music-Album-Submit.y=6"&gt;Dashboard
Confessional&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Dashboard Confessional+Stolen&amp;amp;x=0&amp;amp;y=0"&gt;Stolen&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=b2KcNwfipcg:FO74uCIrnhA: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=b2KcNwfipcg:FO74uCIrnhA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=b2KcNwfipcg:FO74uCIrnhA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=b2KcNwfipcg:FO74uCIrnhA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=b2KcNwfipcg:FO74uCIrnhA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=b2KcNwfipcg:FO74uCIrnhA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=b2KcNwfipcg:FO74uCIrnhA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=b2KcNwfipcg:FO74uCIrnhA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=b2KcNwfipcg:FO74uCIrnhA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/b2KcNwfipcg" 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=7e1deda7-c260-44b6-bf34-470d7ff7cc94" />
    <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=7e1deda7-c260-44b6-bf34-470d7ff7cc94" title="6 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=7e1deda7-c260-44b6-bf34-470d7ff7cc94</commentRss>
    <title>Duct Tape Programmers and the Culture of Complexity in Software Projects</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/09/27/DuctTapeProgrammersAndTheCultureOfComplexityInSoftwareProjects.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=7e1deda7-c260-44b6-bf34-470d7ff7cc94</id>
    <published>2009-09-27T09:00:30.767396-07:00</published>
    <updated>2009-09-27T09:00:30.7830209-07:00</updated>
    <category term="Programming" label="Programming" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Programming" />
    <category term="Ramblings" label="Ramblings" scheme="http://www.25hoursaday.com/weblog/CategoryView.aspx?category=Ramblings" />
    <content type="html">&lt;p&gt;
Last week Joel Spolsky wrote a blog post entitled &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;The
Duct Tape Programmer&lt;/a&gt; where he praises developers who favor simple programming
practices to complex ones. This blog post strongly resonated with me and made me recall
some related thoughts on complexity and solving problems in software projects. Some
key excerpts from his which I'll use as a jumping off point are below
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Jamie Zawinski is what I would call a duct-tape programmer. And I say that with
a great deal of respect. He is the kind of programmer who is hard at work building
the future, and making useful things so that people can do stuff. 
&lt;br /&gt;
... 
&lt;br /&gt;
Duct tape programmers are pragmatic. Zawinski popularized Richard Gabriel’s precept
of &lt;/em&gt;&lt;a href="http://www.jwz.org/doc/worse-is-better.html"&gt;&lt;em&gt;Worse is Better&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.
A 50%-good solution that people actually have solves more problems and survives longer
than a 99% solution that nobody has because it’s in your lab where you’re endlessly
polishing the damn thing. Shipping is a feature. A really important feature. Your
product must have it.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;One principle duct tape programmers understand well is that any kind of coding
technique that’s even slightly complicated is going to doom your project. Duct tape
programmers tend to avoid C++, templates, multiple inheritance, multithreading, COM,
CORBA, and a host of other technologies that are all totally reasonable, when you
think long and hard about them, but are, honestly, just a little bit too hard for
the human brain. 
&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The urge the reduce the complexity of the tools used to solve software problems is
one that every software developer should share. However even more important is reducing
the complexity of the actual solutions that are delivered to your customers at the
end of the day. End users can't tell if you used complicated C++ techniques like &lt;a href="http://en.wikipedia.org/wiki/Template_metaprogramming"&gt;template
metaprogramming&lt;/a&gt; and &lt;a href="http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s07.html#What-is-mixin"&gt;mixins&lt;/a&gt; to
build the application. They can tell when your application fails to solve their actual
problems in a straightforward way or is so late to ship due to project delays that
they lose interest in waiting for you to solve their problems. 
&lt;/p&gt;
&lt;p&gt;
There are many famous and everyday examples of this culture of complexity in software
projects which are eventually trumped by solutions that solve 80% of the problem in
a simple way. My favorite example is contrasting the &lt;a href="http://en.wikipedia.org/wiki/World_Wide_Web"&gt;World
Wide Web&lt;/a&gt; invented by Tim Berners-Lee with &lt;a href="http://en.wikipedia.org/wiki/Project_Xanadu"&gt;Project
Xanadu&lt;/a&gt; as envisioned by Ted Nelson.&amp;#160; Today the WWW is used by over a billion
people to enrich their lives in myriad ways on a daily basis and has created hundreds
of billions dollars in value by minting an entire new industry. Project Xanadu is
a sad footnote spoken about in hushed tones by fans of hypertext who bewail the success
of the Web and how it has forced us to settle for less (i.e. Worse Is Better). 
&lt;/p&gt;
&lt;p&gt;
If you aren't familiar with Project Xanadu you can think of it as a networked system
of hyperlinked documents and media just like the WWW which had to satisfy the following &lt;a href="http://xanadu.com.au/general/faq.html#2"&gt;seventeen
rules&lt;/a&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;ol&gt;
&lt;li&gt;
Every Xanadu server is uniquely and securely identified. 
&lt;/li&gt;
&lt;li&gt;
Every Xanadu server can be operated independently or in a network. 
&lt;/li&gt;
&lt;li&gt;
Every user is uniquely and securely identified. 
&lt;/li&gt;
&lt;li&gt;
Every user can search, retrieve, create and store documents. 
&lt;/li&gt;
&lt;li&gt;
Every document can consist of any number of parts each of which may be of any data
type. 
&lt;/li&gt;
&lt;li&gt;
Every document can contain links of any type including virtual copies (&amp;quot;transclusions&amp;quot;)
to any other document in the system accessible to its owner. 
&lt;/li&gt;
&lt;li&gt;
Links are visible and can be followed from all endpoints. 
&lt;/li&gt;
&lt;li&gt;
Permission to link to a document is explicitly granted by the act of publication. 
&lt;/li&gt;
&lt;li&gt;
Every document can contain a royalty mechanism at any desired degree of granularity
to ensure payment on any portion accessed, including virtual copies (&lt;a href="http://en.wikipedia.org/wiki/Transclusion"&gt;&amp;quot;transclusions&amp;quot;&lt;/a&gt;)
of all or part of the document. 
&lt;/li&gt;
&lt;li&gt;
Every document is uniquely and securely identified. 
&lt;/li&gt;
&lt;li&gt;
Every document can have secure access controls. 
&lt;/li&gt;
&lt;li&gt;
Every document can be rapidly searched, stored and retrieved without user knowledge
of where it is physically stored. 
&lt;/li&gt;
&lt;li&gt;
Every document is automatically moved to physical storage appropriate to its frequency
of access from any given location. 
&lt;/li&gt;
&lt;li&gt;
Every document is automatically stored redundantly to maintain availability even in
case of a disaster. 
&lt;/li&gt;
&lt;li&gt;
Every Xanadu service provider can charge their users at any rate they choose for the
storage, retrieval and publishing of documents. 
&lt;/li&gt;
&lt;li&gt;
Every transaction is secure and auditable only by the parties to that transaction. 
&lt;/li&gt;
&lt;li&gt;
The Xanadu client-server communication protocol is an openly published standard. Third-party
software development and integration is encouraged.&lt;sup&gt;&lt;/sup&gt;
&lt;/li&gt;
&lt;/ol&gt;
&gt;
&lt;p&gt;
Reading this list is like going through a list of places where World Wide Web fails.
Rule #14 which implies every document on the network is redundantly backed up in disparate
locations so they can always be is something the WWW doesn't do today which is why
we have broken links and 404s all the time. Rule #9 implies that not only is copyright
respected and tracked throughout the system but there is even a micropayment platform
built in. All the discussions on &lt;a href="http://www.bing.com/search?q=newspapers+micropayments&amp;amp;form=OSDSRC"&gt;micropayments
saving newspapers&lt;/a&gt; would be moot if Project Xanadu ruled the world since it would
have existed from day one. Rule #16 on transactions being secure and auditable sounds
like Nirvana in today's world of botnets, malware and phishing scams which plague
the Web. 
&lt;/p&gt;
&lt;p&gt;
Yet despite the fact that the forty year old Project Xanadu is a more compelling vision
than were we are today it failed and Tim Berners-Lee's World Wide Web succeeded. In
practical terms, Project Xanadu was trying to solve too many complex problems in a
v1 product. In contrast, Tim Berners-Lee focused on the most valuable problems to
solve for end users which was sharing documents and media with anyone on the Internet
and punted on a bunch of the hard problems that would require a more controlled and
tightly coupled network as well as a ton of more code. Tim Berners-Lee solved less
than half the problems Project Xanadu set out to solve but has changed the world immeasurably
for billions of people by providing simple solutions to complex problems and running
away from trying to create complex solutions to complex problems. 
&lt;/p&gt;
&lt;p&gt;
The bottom line is that a lot of the time it's OK to create a solution that solves
80% of the problem. Always remember that shipping is a feature. 
&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=Drake, Kanye West, Lil Wayne &amp;amp; Eminem&amp;amp;field-title=Forever&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;Drake,
Kanye West, Lil Wayne &amp;amp; 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=Drake, Kanye West, Lil Wayne &amp;amp; Eminem+Forever&amp;amp;x=0&amp;amp;y=0"&gt;Forever&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=0aVEUrGKZTE:qa6i4_31hpc: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=0aVEUrGKZTE:qa6i4_31hpc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=0aVEUrGKZTE:qa6i4_31hpc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=0aVEUrGKZTE:qa6i4_31hpc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=0aVEUrGKZTE:qa6i4_31hpc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=0aVEUrGKZTE:qa6i4_31hpc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=0aVEUrGKZTE:qa6i4_31hpc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=0aVEUrGKZTE:qa6i4_31hpc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=0aVEUrGKZTE:qa6i4_31hpc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/0aVEUrGKZTE" 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=6a6da147-6434-4677-a57c-118b9d928767" />
    <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=6a6da147-6434-4677-a57c-118b9d928767" title="2 Comments" />
    <commentRss xmlns="http://wellformedweb.org/CommentAPI/">http://www.25hoursaday.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6a6da147-6434-4677-a57c-118b9d928767</commentRss>
    <title>The Brilliance of Twitter's Suggested User List</title>
    <link rel="alternate" type="text/html" href="http://www.25hoursaday.com/weblog/2009/09/27/TheBrillianceOfTwittersSuggestedUserList.aspx" />
    <id>http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=6a6da147-6434-4677-a57c-118b9d928767</id>
    <published>2009-09-27T08:12:24.6608672-07:00</published>
    <updated>2009-09-27T08:12:24.6608672-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;
Every week there seems to be some new A-list blogger criticizing Twitter's &lt;a href="http://blog.twitter.com/2009/03/suggested-users.html"&gt;Suggested
User's List&lt;/a&gt; which is a selection of celebrities and brands that are suggested
to new Twitter users as people the user might like to follow. This week it's Robert
Scoble with &lt;a href="http://scobleizer.com/2009/09/26/youre-not-on-twitters-suggested-user-list-but-you-are-in-good-company/"&gt;You’re
not on Twitter’s suggested user list but you are in good company&lt;/a&gt; that points out
a number of interesting celebrities and brands that aren't on the list. Last week
Dave Winer asked &lt;a href="http://www.scripting.com/stories/2009/09/22/theSulAsAToolToControlNews.html"&gt;The
SUL as a tool to control news?&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I've had my issues with the SUL mainly from the perspective of how it ends up presenting
Twitter to new users. When my wife joined Twitter I'd have loved it if the service
had used integration with Facebook, Windows Live, MySpace, etc to suggest people who
she already knew who were on Twitter. Instead the service prioritized pitching that
she follow &lt;a href="http://twitter.com/THE_REAL_SHAQ"&gt;Shaquille O'Neal&lt;/a&gt;, &lt;a href="http://twitter.com/DellOutlet"&gt;Dell
Outlet stores&lt;/a&gt;, &lt;a href="http://twitter.com/todayshow"&gt;NBC's Today Show&lt;/a&gt; and &lt;a href="http://twitter.com/ashsimpsonwentz"&gt;Jessica
Simpson's kid sister&lt;/a&gt;. To find me on Twitter, my wife had to ask me for my Twitter
handle in person. I felt like we were back in the dark ages of social networking.
&lt;/p&gt;
&lt;p&gt;
In retrospect, not doing what I preferred them to do shows a lot of insight. It prevents
the site from being viewed as yet another service where you have a duplicated social
graph and thus has to compete head to head with the Facebooks and MySpaces of the
world. Instead it pitches Twitter as a sort of user friendly RSS reader where you
connect with your favorite celebrities and brands instead of another place where you
get status updates from people who you're already getting status updates from in Facebook. 
&lt;/p&gt;
&lt;p&gt;
Brilliant.
&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=Jay Sean&amp;amp;field-title=Down (feat. Lil Wayne)&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;Jay
Sean&lt;/a&gt; - &lt;a href="http://www.amazon.com/s/ref=nb_ss_dmusic?url=search-alias%3Ddigital-music&amp;amp;field-keywords=Jay Sean+Down (feat. Lil Wayne)&amp;amp;x=0&amp;amp;y=0"&gt;Down
(feat. Lil Wayne)&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=Ee6gdnpmolw:F17CYeJCeF4: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=Ee6gdnpmolw:F17CYeJCeF4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=Ee6gdnpmolw:F17CYeJCeF4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=Ee6gdnpmolw:F17CYeJCeF4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=Ee6gdnpmolw:F17CYeJCeF4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=Ee6gdnpmolw:F17CYeJCeF4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=Ee6gdnpmolw:F17CYeJCeF4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Carnage4life?a=Ee6gdnpmolw:F17CYeJCeF4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Carnage4life?i=Ee6gdnpmolw:F17CYeJCeF4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Carnage4life/~4/Ee6gdnpmolw" height="1" width="1"/&gt;</content>
  </entry>
</feed>
