<?xml version="1.0" encoding="UTF-8"?>
<!-- New Digg check : 91e798b4288645588f593f30fc09aaea -->
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Superfeedr Blog : Real-time cloudy thoughts from a super-hero</title>
    <link href="http://blog.superfeedr.com/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="http://blog.superfeedr.com/" rel="alternate" type="text/html"/>
    <link rel="hub" href="http://superfeedr.com/hubbub" />
    <updated>2012-05-15T09:15:14-07:00</updated>
    <id>http://blog.superfeedr.com/</id>
    
    
    <entry>
        <title>Protocols over APIs</title>
        
        <link href="http://blog.superfeedr.com/protocols-over-api"/>
        <published>2012-05-15T00:00:00-07:00</published>
        <updated>2012-05-15T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/protocols-over-api</id>
        <content type="html">&lt;p&gt;There is not a week where I don&amp;#8217;t see developers discovering that a given &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; has been deprecated. Today&amp;#8217;s disappointment (at least in my twitter stream) comes from the &lt;a href=&quot;https://developers.google.com/chart/&quot;&gt;Google Chart Tool &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t get me wrong. &lt;strong&gt;I feel for these developers&lt;/strong&gt; and I would be upset should the same problem happen to me. Now, being upset is great. Learning how to prevent that is better, and I believe there are many ways to avoid that. The most obvious one is to re-invent the wheel as suggested by &lt;a href=&quot;https://twitter.com/#!/Adactio&quot;&gt;Adactio&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet tw-align-center&quot;&gt;&lt;p&gt;Next time someone asks why I&amp;#8217;m reinventing the wheel, I&amp;#8217;m telling them it&amp;#8217;s because the wheel &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is being deprecated. &lt;a href=&quot;https://t.co/fVozGTfZ&quot; title=&quot;https://developers.google.com/chart/terms&quot;&gt;developers.google.com/chart/terms&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;mdash; Jeremy Keith (@adactio) &lt;a href=&quot;https://twitter.com/adactio/status/202420431284740096&quot; data-datetime=&quot;2012-05-15T15:29:26+00:00&quot;&gt;May 15, 2012&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;script src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;That is obviously not always possible&amp;#8230; and is probably not the right solution either because &lt;em&gt;re-inventing the wheel can be a real rabbit-hole&lt;/em&gt; which may take you to building a power grid!&lt;/p&gt;
&lt;p&gt;Another solution is to favor protocols over APIs. To over-simplify things, an &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is just a combination of uni-laterally decided upon protocol and an endpoint&lt;/strong&gt;. &lt;em&gt;The Twitter &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is the twitter protocol used against twitter.com&lt;/em&gt;. Got it? This is what Status.net understood when they decided to write a compatible &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&amp;#8230; for which you would just have to change the endpoint from twitter.com to status.net. That worked until Twitter changed its &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Now, if developers relied more on protocols, that means that when a providers disappears or deprecates a service, developers could just change the endpoint, without changing anything in their code to make sure everything keeps working. Re-using code is the most satisfying feeling for many developers.&lt;/p&gt;
&lt;p&gt;Want an example? Last week, I got tired of &lt;a href=&quot;http://myopenid.com/&quot;&gt;myopenid.net&lt;/a&gt; inability to stay up. I used them as a provider for &lt;a href=&quot;http://ouvre-boite.com/&quot;&gt;my personal openid endpoint&lt;/a&gt;. Changing the provider was as simple as changing the &lt;code&gt;openid2.provider&lt;/code&gt; href in the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; and I was done.&lt;/p&gt;
&lt;p&gt;When you decide to work with a given&amp;#8217;s service &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;, please tell them &lt;strong&gt;you want their &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; to become a protocol&lt;/strong&gt;, something for which &lt;em&gt;you are a stake holder&lt;/em&gt;, that you can help improve. Also, if there is &lt;strong&gt;any open protocol or any schema&lt;/strong&gt; that does what this &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; aims at doing, please convince them that it&amp;#8217;s way to go, that this will make the web better and that will make your code more useful to more people :)&lt;/p&gt;
&lt;p&gt;At Superfeedr, we&amp;#8217;re obviously big promoters of protocols (&lt;a href=&quot;http://superfeedr.com/documentation/#xmpp_pubsub&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;http://superfeedr.com/documentation/#pubsubhubbub&quot;&gt;PubSubHubbub&lt;/a&gt;, &lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt;, ActivityStreams) over APIs, and we obviously kept the same philosophy for &lt;a href=&quot;http://msgboy.com/&quot;&gt;Msgboy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Addendum: what makes me even sadder about this story is that &lt;a href=&quot;http://bradfitz.com/&quot;&gt;Brad Fitz&lt;/a&gt;, who wrote the &lt;a href=&quot;https://developers.google.com/social-graph/&quot;&gt;Social Graph &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt; is the one who told me first about protocols being better than &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;..; and guess what? The Social Graph &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; has been deprecated as well. :(&lt;/em&gt;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Superfeedr Heroku</title>
        
        <link href="http://blog.superfeedr.com/superfeedr-heroku"/>
        <published>2012-04-12T00:00:00-07:00</published>
        <updated>2012-04-12T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/superfeedr-heroku</id>
        <content type="html">&lt;p&gt;For the past few months, one of our projects involved working on an Heroku addon. Today it reached public beta. In a nutshell, it allows for anyone using Heroku to &lt;strong&gt;integrate&lt;/strong&gt; with all of Superfeedr&amp;#8217;s features with minimal effort: all the provisioning, integration and even billing is managed thru Heroku.&lt;/p&gt;
&lt;h2&gt;Integrating&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/heroku.png&quot; style=&quot;float: right; margin: 5px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The first step is to &lt;em&gt;add&lt;/em&gt; the Superfeedr addon to your existing application. Like for most Heroku addon, type this in your application&amp;#8217;s repository:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;heroku addons:add superfeedr&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The next step is the most important step: picking up the right &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; to use:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;The &lt;a href=&quot;http://superfeedr.com/documentation#xmpp_pubsub&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; PubSub&lt;/a&gt; may require you to run an extra Dyno (process), and &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; may not have good libraries for your language of choice.&lt;/li&gt;
	&lt;li&gt;The &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;PubSubHubbub&lt;/a&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; uses webhooks, which means that your development machine will need to be &amp;#8216;accessible&amp;#8217; from outside the firewall.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, you can start implementing! When making calls to Superfeedr, make sure you use &lt;code&gt;SUPERFEEDR_LOGIN&lt;/code&gt; and &lt;code&gt;SUPERFEEDR_PASSWORD&lt;/code&gt; as your credentials. (you can also set these environment variables to your local development machine)&lt;/p&gt;
&lt;h2&gt;Billing&lt;/h2&gt;
&lt;p&gt;For now, using the &lt;a href=&quot;https://addons.heroku.com/superfeedr&quot;&gt;Superfeedr heroku addon&lt;/a&gt; is free, but we will soon introduce plans. These plans will obviously include a &lt;strong&gt;free version&lt;/strong&gt;, but they will be based on the number of feeds (we exclude track feeds though), rather than the number of entries. This has been a rather frequent request for superfeedr and we may use Heroku as a sandbox for a new superfeedr pricing model.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re looking at sample applications, check this &lt;a href=&quot;https://github.com/superfeedr/superfeedr-node-sample&quot;&gt;node.js example&lt;/a&gt; &lt;em&gt;which uses XMPP_, &lt;a href=&quot;https://github.com/superfeedr/superpipes&quot;&gt;Superpipes&lt;/a&gt;, or this &lt;a href=&quot;https://github.com/superfeedr/rack-superfeedr/blob/master/examples/sinatra&quot;&gt;Sinatra application&lt;/a&gt;&lt;/em&gt;app.rb, which uses PubSubHubbub.&lt;/p&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Weekend Projects: Superpipes</title>
        
        <link href="http://blog.superfeedr.com/superpipes"/>
        <published>2012-04-08T00:00:00-07:00</published>
        <updated>2012-04-08T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/superpipes</id>
        <content type="html">&lt;p&gt;Google has their &lt;a href=&quot;http://www.google.com/jobs/lifeatgoogle/englife/index.html&quot;&gt;20% free time&lt;/a&gt;. At Superfeedr, we use weekends, or flights.&lt;br /&gt;
This weekend has been pretty productive, we two open sourced projects.&lt;/p&gt;
&lt;h3&gt;Superpipes&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s a rather frequent question from new users: &lt;em&gt;what&amp;#8217;s the difference between Superfeedr and &lt;a href=&quot;http://pipes.yahoo.com/pipes/&quot;&gt;Yahoo Pipes&lt;/a&gt;&lt;/em&gt;? It&amp;#8217;s not that easy to explain, but (at least for the feeds part), Superfeedr can be used to build something like Yahoo Pipes, and that&amp;#8217;s what we did.&lt;/p&gt;
&lt;p&gt;The little app we built, called &lt;a href=&quot;https://github.com/superfeedr/superpipes&quot;&gt;Superpipes&lt;/a&gt; aggregates feeds in &lt;strong&gt;realtime&lt;/strong&gt;, but also transforms them. It&amp;#8217;s really &lt;strong&gt;simple to configure, deploy, but also hack on&lt;/strong&gt;. It&amp;#8217;s using &lt;a href=&quot;http://nodejs.org/&quot;&gt;node.js&lt;/a&gt;, &lt;a href=&quot;http://expressjs.com/&quot;&gt;express&lt;/a&gt;, &lt;a href=&quot;http://redis.io/&quot;&gt;redis&lt;/a&gt;, &lt;a href=&quot;http://www.heroku.com/&quot;&gt;heroku&lt;/a&gt;, and of course, &lt;a href=&quot;http://superfeedr.com/&quot;&gt;Superfeedr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/superfeedr/superpipes/blob/master/README.markdown&quot;&gt;Follow the instructions&lt;/a&gt; if you&amp;#8217;d like to deploy your own instance and start aggregating!&lt;/p&gt;
&lt;h3&gt;Feediscovery with node.&lt;/h3&gt;
&lt;p&gt;We sincerely love what we call &lt;em&gt;community webservices&lt;/em&gt;. They are webservices that provide a simple feature that every developer could just implement themselves, but which are also so much more efficient if everybody shares them. Providing the &lt;a href=&quot;http://getfavicon.appspot.com/&quot;&gt;favicon for any url&lt;/a&gt; is an example. We built &lt;a href=&quot;http://feediscovery.appspot.com/&quot;&gt;feediscovery&lt;/a&gt; to extract urls from a url (and we&amp;#8217;re working on that to support webfinger too!).&lt;/p&gt;
&lt;p&gt;Now, web services are not always easy to integrate in actual apps: you have to use and &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; library, &lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt; parsers&amp;#8230; etc. Sometimes I wish I could just type &lt;code&gt;google('keyord', function(err, results) { ... });&lt;/code&gt; and get the results yielded, so we built &lt;a href=&quot;https://github.com/superfeedr/node-feediscovery&quot;&gt;node-feediscovery&lt;/a&gt;, and you can use it exactly like that: &lt;code&gt;feediscovery('url', function(err, links) { .. });&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s your latest weekend project?&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>PubSubHubbub v0.4</title>
        
        <link href="http://blog.superfeedr.com/pubsubhubbub-0-4"/>
        <published>2012-04-03T00:00:00-07:00</published>
        <updated>2012-04-03T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/pubsubhubbub-0-4</id>
        <content type="html">&lt;p&gt;The PubSubHubbub adoption is growing strong. There is not a week where a major publisher or a major subscriber eventually implements it. Yesterday, that was &lt;a href=&quot;http://blog.newsblur.com/post/20371256202/building-real-time-feed-updates-for-newsblur&quot;&gt;NewsBlur&amp;#8217;s&lt;/a&gt; turn.&lt;/p&gt;
&lt;p&gt;At the same time, the current PubSubHubbub spec (0.3) is a bit rusty and presents a few issues that prevented more platforms to use it. The 2 most significant issues are the following: arbitrary content support, opening the door for private feeds.&lt;/p&gt;
&lt;p&gt;We recently worked on the version 0.4 of the spec, which, solves these problems.&lt;/p&gt;
&lt;h3&gt;Arbitrary Content Support&lt;/h3&gt;
&lt;p&gt;The current spec is coupled with the Atom and &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; specs very deeply. However, in theory, PubSubHubbub shouldn&amp;#8217;t really care about what is being transported for as long as it&amp;#8217;s available via &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;.&lt;/p&gt;
&lt;h4&gt;Discovery&lt;/h4&gt;
&lt;p&gt;The current spec states that discovery is performed by adding a &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; element in the &amp;#8220;head&amp;#8221; part of the feed (the one which contains all the meta data about the feed). Luckily, &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; also has a &amp;#8220;head&amp;#8221; part: the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; headers. &lt;br /&gt;
We proposed that doing discovery for arbitrary content resources is done thru the use of &lt;a href=&quot;http://tools.ietf.org/html/rfc5988&quot;&gt;Link Headers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They look like this:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Date: Tue, 03 Apr 2012 08:02:19 GMT
Content-Type: text/html
Content-Length: 11261
Link: &amp;lt;http://pubsubhubbub.superfeedr.com&amp;gt;; rel=&quot;hub&quot;  
Link: &amp;lt;http://blog.superfeedr.com/my-resource&amp;gt;; rel=&quot;self&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Please note, that similar to the 0.3 spec, we need both a &lt;em&gt;self&lt;/em&gt; link and a &lt;em&gt;hub&lt;/em&gt; link.&lt;br /&gt;
A consequence of using &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; headers is that, instead of doing a full &lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; request, subscribers may just use the verb &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt; to perform the discovery of a resource.&lt;/p&gt;
&lt;h4&gt;Diffing&lt;/h4&gt;
&lt;p&gt;Feeds have a built-in diff mechanism. As they are collections of items, it is quite easy to identify what items have been added to the collection between to &lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; requests.&lt;/p&gt;
&lt;p&gt;Now, using arbitrary formats means &lt;em&gt;that it is not always easy or obvious to diff the resource in a meaningful way&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The 0.4 spec proposes to leave diffing up to the publisher an subscriber to identify what is the right behavior, between propagating the full document (when it was updated), or just propagating the diff, using the mechanism of their choice (text based diff, or content based diff).&lt;/p&gt;
&lt;h4&gt;Notification&lt;/h4&gt;
&lt;p&gt;When using feeds, the whole content is included in the feeds, including, as we&amp;#8217;ve seen the discovery elements. Since most &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; document do not have this feature, it means that &lt;strong&gt;the notification must include some of the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; headers served with the content, including, well, the Link headers&lt;/strong&gt;. &lt;br /&gt;
This is an important difference with the 0.3 spec, and most not be overlooked, as some resources have meaningful information in the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; headers.&lt;/p&gt;
&lt;h4&gt;Signature&lt;/h4&gt;
&lt;p&gt;The only way to perform a secure notification and avoid &amp;#8220;man-in-the-middle&amp;#8221; attacks, it is important that the notification from the hub to the subscriber is signed, using an &lt;span class=&quot;caps&quot;&gt;HMAC&lt;/span&gt; signature with a shared secret. This behavior is the behavior &lt;a href=&quot;http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html#authednotify&quot;&gt;used in the version 0.3 of the spec&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the version 0.4, we use the same mechanism, but please note that this will only sign the content, and not the headers. As such, &lt;em&gt;if a subscriber wants to trust the complete notification, the only option is to use an HTTP*S* callback url&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There is another way, which is to provide a specific header which lists the signed headers, but we believe it&amp;#8217;s overly complex. Please let us know if you disagree.&lt;/p&gt;
&lt;h3&gt;Private Resources&lt;/h3&gt;
&lt;p&gt;This is the other key aspect of this revised spec. Currently, the publisher doesn&amp;#8217;t have any visibility on &amp;#8216;who&amp;#8217; the subscribers are (and if there are any actually).&lt;/p&gt;
&lt;p&gt;This is a very strong problem in the context of social networks where someone may want to distribute its content only to a restricted set of people: their friends, or family.&lt;/p&gt;
&lt;p&gt;Typically, they want to approve or deny subscriptions, but also may want to later reject a previous approved subscription. They may also want to limit the subscription to a subset of the actual published feed.&lt;/p&gt;
&lt;h4&gt;Subscription&lt;/h4&gt;
&lt;p&gt;The current spec only uses the verification of intent to determine if a subscription should be accepted. We now need to use the publisher&amp;#8217;s input to accept or deny subscriptions. It is also very likely that the publisher will wait for the actual user&amp;#8217;s input before accepting or denying, which means that the subscription process now becomes &lt;strong&gt;asynchronous&lt;/strong&gt; by default.&lt;/p&gt;
&lt;h3&gt;Publisher Verification&lt;/h3&gt;
&lt;p&gt;This is a brand new step, but it remains optional and subscribers should completely ignore this part. Using an agreed upon mechanism, the hub will ask the publisher whether the subscription should be accepted, by echo-ing the subscription request. The publisher can then decide to accept or deny the subscription, as well as include a reason for that.&lt;/p&gt;
&lt;p&gt;This mechanism can, for example be combined with the use of a &lt;code&gt;From&lt;/code&gt; &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; header in the subscription. Then, using a webfinger discovery mechanism, the publisher can identify the actual user behind the subscription. Other mechanisms could also very well be used, but are beyond the scope of this spec.&lt;/p&gt;
&lt;h3&gt;Subscription Validation&lt;/h3&gt;
&lt;p&gt;Once the subscriber&amp;#8217;s intent has been confirmed &lt;span class=&quot;caps&quot;&gt;AND&lt;/span&gt; if the publisher agrees to the verification, then, the subscription should be validated and the hub will send a request to the subscriber to validate that subscription.&lt;/p&gt;
&lt;p&gt;If not, the hub should also send a request to indicate denial, with, if applicable, the reason used by the publisher. The subscriber may then either retry (using additional parameters) or just abandon its subscription.&lt;/p&gt;
&lt;p&gt;The subscription validation process can also happen later to deny an existing subscription.&lt;/p&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;The draft 0.4 clearly still has a points that needs to be clarified and improved, but we believe it solves the 2 current major issues that the current PubSubHubbub protocol has.&lt;/p&gt;
&lt;p&gt;It is obvious that if a hub doesn&amp;#8217;t respond to the 0.4 spec &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; calls, a subscriber should fallback to 0.3 for as long as the 0.4 spec hasn&amp;#8217;t been widely adopted.&lt;/p&gt;
&lt;p&gt;Please, &lt;a href=&quot;https://groups.google.com/d/msg/pubsubhubbub/sW6nVt_a7VQ/1d91SbceG-8J&quot;&gt;send your feedback&lt;/a&gt;.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Flattr PubSubHubbub-ed</title>
        
        <link href="http://blog.superfeedr.com/flattr-pubsubhubbub"/>
        <published>2012-03-09T00:00:00-08:00</published>
        <updated>2012-03-09T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/flattr-pubsubhubbub</id>
        <content type="html">&lt;p&gt;I have to confess I am not the best at writing consistently and often on that blog. There are so many topics that I want to write about: writing a &lt;a href=&quot;http://msgboy.com/&quot;&gt;Chrome application&lt;/a&gt;, the future of &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt;, not using &lt;a href=&quot;http://jquery.com/&quot;&gt;JQuery&lt;/a&gt; when it&amp;#8217;s not necessary, our &lt;a href=&quot;https://addons.heroku.com/superfeedr&quot;&gt;Heroku Addon&lt;/a&gt;&amp;#8230; etc. But today, I want to share with you an awesome new hub that we host at Superfeedr.&lt;/p&gt;
&lt;h3&gt;Flattr&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://flattr.com/&quot;&gt;Flattr&lt;/a&gt; is a very innovative service that brings a very cool monetization solution to anyone &lt;strong&gt;creating&lt;/strong&gt; web content. Each user decides on how much money they want to give to the &lt;em&gt;internetz&lt;/em&gt;. During the month, they can then flattr various &lt;a href=&quot;http://flattr.com/catalog&quot;&gt;things&lt;/a&gt;, including music, video, games, software, or even people! When the end of the month comes, the user&amp;#8217;s money is shared between all the thing he previously flattred.&lt;/p&gt;
&lt;h3&gt;PubSubHubbub&lt;/h3&gt;
&lt;p&gt;Flattr provides a lot of different feeds, and they&amp;#8217;re now all &lt;a href=&quot;http://flattr.superfeedr.com/&quot;&gt;PubSubHubbub&lt;/a&gt;! It becomes really easy to resyndicate the things you&amp;#8217;ve flattred using a &lt;a href=&quot;https://api.flattr.com/rest/v2/users/voxpelli/activities.atom&quot;&gt;user activity feed&lt;/a&gt;. A thing owner could also subscribe to the feed of people flattring it&amp;#8230; and then send a realtime thank you tweet :p&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re extremely proud to see services like &lt;strong&gt;flattr use PubSubHubbub&lt;/strong&gt;, as we know their community is clearly among the trend setters. Who&amp;#8217;s next?&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Grove.io and Superfeedr</title>
        
        <link href="http://blog.superfeedr.com/groveio-rss-hook"/>
        <published>2012-02-19T00:00:00-08:00</published>
        <updated>2012-02-19T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/groveio-rss-hook</id>
        <content type="html">&lt;p&gt;Do you know &lt;a href=&quot;https://grove.io/&quot;&gt;Grove.io&lt;/a&gt;? It is a great hosted &lt;span class=&quot;caps&quot;&gt;IRC&lt;/span&gt; service with a bunch of really awesome features to make your rooms much much smarter and useful. One of the great things they did is allow their users to plug other applications to the room using webhooks.&lt;/p&gt;
&lt;p&gt;The obvious use case for a team of developers is to show commit messages, but we wanted to be able to post the content of an &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed to a room very easily as well. A team can just use that to plug the comment feed of the team&amp;#8217;s blog, or the feed from their error collecting application (&lt;a href=&quot;http://airbrake.io&quot;&gt;airbreak.io&lt;/a&gt; has &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feeds for each project)&amp;#8230; etc.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href=&quot;http://supergrover.herokuapp.com/&quot;&gt;Supergrover&lt;/a&gt;. It is a simple node.js application (less than 200 lines of code!), which allows you to enter the url of any &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed, as well as the url of your grove.io room&amp;#8217;s callback, so that when the feed updates, a message is posted to your room. &lt;br /&gt;
It doesn&amp;#8217;t even need to store data, as it uses callback urls to store the state of the subscription (feed and channel).&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a great use case for our &lt;a href=&quot;https://addons.heroku.com/superfeedr&quot;&gt;Heroku Add-on&lt;/a&gt;, as well as the proof that one can build applications quickly using PubSubHubbub and Superfeedr using node.js :)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Sinatra, Heroku and Superfeedr</title>
        
        <link href="http://blog.superfeedr.com/superfeedr-ruby-heroku"/>
        <published>2012-01-21T00:00:00-08:00</published>
        <updated>2012-01-21T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/superfeedr-ruby-heroku</id>
        <content type="html">&lt;p&gt;This is a short tutorial on how to deploy an Sinatra web app that uses Superfeedr to Heroku. This app provides a very simple home page that lists the latests entries of some of your favorites sites. It&amp;#8217;s greatly inspired by the awesome &lt;a href=&quot;http://start.io/&quot;&gt;start.io&lt;/a&gt; from the awesome &lt;a href=&quot;http://petervidani.com/&quot;&gt;Peter Vidani&lt;/a&gt; and &lt;a href=&quot;http://jacobbijani.com/&quot;&gt;Jacob Bijani&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Set up&lt;/h3&gt;
&lt;p&gt;We will use &lt;a href=&quot;http://www.sinatrarb.com/&quot;&gt;Sinatra&lt;/a&gt;, the &lt;a href=&quot;https://github.com/superfeedr/rack-superfeedr&quot;&gt;Rack Superfeedr gem&lt;/a&gt;, as well as Twitter&amp;#8217;s bootstrap for the layout, because I suck at making things shinny.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start first by creating the application on Heroku.&lt;/p&gt;
&lt;p&gt;Create the repo:&lt;br /&gt;
&lt;code&gt;
    mkdir start-page &amp;amp;&amp;amp; cd start-page
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git init
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git add .
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git commit -m &quot;init&quot;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Create the application on Heroku:&lt;br /&gt;
&lt;code&gt;
    heroku create --stack cedar
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Add the hostname as an environment variable. It is used by the rack middleware to build the callback urls:&lt;br /&gt;
&lt;code&gt;
    heroku config:add  HOST=&amp;lt;YOUR APP DOMAIN&amp;gt;
&lt;/code&gt;&lt;br /&gt;
Add the superfeedr addon:&lt;br /&gt;
&lt;code&gt;
    heroku addons:add superfeedr
&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Implementation&lt;/h3&gt;
&lt;p&gt;This implementation is minimalistic, feel free to look at the code closely.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s add the files:&lt;br /&gt;
&lt;code&gt;
    touch app.rb
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    touch config.ru
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    touch Gemfile
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    mkdir views/ &amp;amp;&amp;amp; touch views/index.erb
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;app.rb&lt;/code&gt;:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/1653742.js?file=app.rb&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;config.ru&lt;/code&gt;:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/1653744.js?file=config.ru&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;Gemfile&lt;/code&gt;:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/1653748.js?file=Gemfile&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;views/index.erb&lt;/code&gt;:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/1653753.js?file=index.erb&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
    git add .
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git commit -m &quot;implemented&quot; -a
&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Deploying&lt;/h3&gt;
&lt;p&gt;That&amp;#8217;s the simplest part:&lt;/p&gt;
&lt;p&gt;First, let&amp;#8217;s install the gems.&lt;br /&gt;
&lt;code&gt;
    bundle install
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git add Gemfile.lock 
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;
    git commit -m &quot;adding Gemfile.lock&quot; -a
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And push the code&lt;br /&gt;
&lt;code&gt;
    git push heroku master
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8230; And that&amp;#8217;s it!&lt;/p&gt;
&lt;p&gt;Point your browser to your Heroku application. It is likely that you&amp;#8217;ll have to wait for the feeds you have added to have new content before you see it appear on your home page. The last step is to make this page your default start page in your favorite web browser.&lt;/p&gt;
&lt;p&gt;Check &lt;a href=&quot;http://floating-sky-5183.herokuapp.com/&quot;&gt;mine&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;Gotchas&lt;/h2&gt;
&lt;p&gt;Heroku will put this application to sleep if you only use a single dyno&amp;#8230; and since we store the entries in memory for now, that means you&amp;#8217;ll lose that data if the app goes idle. The solution is very simple: store the data, using another &lt;a href=&quot;https://addons.heroku.com/&quot;&gt;Heroku addon&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Of course, this is a very simple application and there is a ton of little things that one can do to improve it:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;add the ability to dynamically subscribe to feeds&lt;/li&gt;
	&lt;li&gt;show meta data, like the number of bit.ly clicks on each of the stories&lt;/li&gt;
	&lt;li&gt;auto-refresh the page&lt;/li&gt;
	&lt;li&gt;&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;strong&gt;Superfeedr Heroku addon&lt;/strong&gt; is still in alpha to this date, so if you want to run, this, please &lt;a href=&quot;http://superfeedr.com/about&quot;&gt;email us&lt;/a&gt; and we&amp;#8217;ll get you in!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Rack Middleware for Superfeedr</title>
        
        <link href="http://blog.superfeedr.com/rack-middleware-superfeedr"/>
        <published>2012-01-19T00:00:00-08:00</published>
        <updated>2012-01-19T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/rack-middleware-superfeedr</id>
        <content type="html">&lt;p&gt;I am a bit ashamed that this comes so late&amp;#8230; but it&amp;#8217;s always better late than never: we have a &lt;a href=&quot;http://rubygems.org/gems/rack-superfeedr&quot;&gt;rack middleware for Superfeedr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What it does is simple: &lt;strong&gt;subscribe&lt;/strong&gt;, &lt;strong&gt;unsubscribe&lt;/strong&gt; and help you &lt;strong&gt;handle notifications&lt;/strong&gt; by hiding all the &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;PubSubHubbub&lt;/a&gt; &lt;del&gt;complexity&lt;/del&gt; magic. Since it&amp;#8217;s Rack, it should work with any Ruby web framework that supports Rack, including Rails and Sinatra.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/1644799.js?file=superfeedr-sinatra.rb&quot;&gt;&lt;/script&gt;&lt;p&gt;Get it while it&amp;#8217;s hot: &lt;code&gt;gem install rack-superfeedr&lt;/code&gt;, and check the code on &lt;a href=&quot;https://github.com/superfeedr/rack-superfeedr&quot;&gt;github&lt;/a&gt;. If you build something awesome, please let us know and we&amp;#8217;ll link to it.&lt;/p&gt;
&lt;p&gt;As you can see it&amp;#8217;s quite elegant :) Can&amp;#8217;t wait to show you how to run that with our &lt;a href=&quot;https://gist.github.com/1585628&quot;&gt;Heroku Addon&lt;/a&gt;! if you want to be among the very first testers. Please let us know!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Publish Subscribe for the web</title>
        
        <link href="http://blog.superfeedr.com/pubsub-web"/>
        <published>2012-01-13T00:00:00-08:00</published>
        <updated>2012-01-13T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/pubsub-web</id>
        <content type="html">&lt;p&gt;Everybody tries to make the web better. Here&amp;#8217;s my attempt.&lt;/p&gt;
&lt;h3&gt;A brief history of the web.&lt;/h3&gt;
&lt;h4&gt;&lt;span class=&quot;caps&quot;&gt;READ&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;I&amp;#8217;m 29, but I was lucky enough to be among the very first web addicts. When I remember most of the websites from that time, I am pretty embarrassed by how ugly they were, but also (worse) by how useless they were. I&amp;#8217;m sorry to say, but &lt;em&gt;at the time, the web was not making anyone&amp;#8217;s life better&lt;/em&gt;. The only thing it did was replacing shinny paper based magazines with ugly looking screens. I now fail to see how I could consider this as an improvement.&lt;/p&gt;
&lt;p&gt;A lot of people wrote this, but &lt;strong&gt;the web was mostly &lt;span class=&quot;caps&quot;&gt;READ&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ONLY&lt;/span&gt;&lt;/strong&gt;. In other words, aside from a very few things, the only activity one could ever do was read. This is &lt;em&gt;why we have pages, bookmarks, site indices&lt;/em&gt;&amp;#8230; etc. At this time, search engines appeared, because people needed to a way to find the content they wanted to read. Similarly e-commerce was born, because quickly, many companies exposed the traditional product lists on the web so that their prospects could read them.&lt;br /&gt;
This behavior is baked deep into the protocol that we use to access the web, in the form of &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; requests&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;span class=&quot;caps&quot;&gt;WRITE&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;A bit more than 10 years ago, a massive shift happened: we started to &lt;em&gt;write to the web&lt;/em&gt;. That was interesting. &lt;em&gt;For once, the web was offering something new&lt;/em&gt; as very few people were actually able to write in newspapers and magazines! Blogging was the very first step of this and quickly the web sites that allowed us to do write saw the massive spike in traffic: wikipedia, youtube, flickr outgrew the old portals that ISPs were forcing down their user&amp;#8217;s throats.&lt;br /&gt;
It&amp;#8217;s also at that time that &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; started to appear. Developers were able to program services that would write to 3rd party websites, instead of actual people. Writing is also baked deep into our protocols in the form of &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;POST&lt;/span&gt; requests&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;span class=&quot;caps&quot;&gt;SUBSCRIBE&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;People were now able to read and write the web. Increasingly they were interested by what other people they knew wrote, because, after all, that is who they used to interact with in the real world. &lt;em&gt;It slowly put people in broad light&lt;/em&gt;, as opposed to big media outlets. The logical next step was to map our physical friendships to the web. That&amp;#8217;s the social networks wave. The real new activity here is this &lt;strong&gt;bounding&lt;/strong&gt;: expressing interest in someone to later read the content they wrote. Whether you call that &lt;em&gt;subscribing&lt;/em&gt;, &lt;em&gt;following&lt;/em&gt;, &lt;em&gt;friending&lt;/em&gt; or &lt;em&gt;circling&lt;/em&gt;, it&amp;#8217;s all the same pattern.&lt;/p&gt;
&lt;p&gt;Interestingly enough this is &lt;strong&gt;more than just social&lt;/strong&gt;. Several very successful ecommerce services offer the same kind of pattern and allow you to subscribe to their deals mailing lists. Coincidentally, we now access the web more through mobile devices than through our computer, which means that context (place and time) is increasingly important, and some services are able to provide us a better experience by subscribing us to our context. What&amp;#8217;s interesting is that &lt;strong&gt;despite the obviousness and the ubiquity of this subscribe pattern, there is no such verb into the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; protocol&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Hooks and Callbacks&lt;/h3&gt;
&lt;p&gt;The little story above is nice, but, even if we don&amp;#8217;t have this &amp;#8220;subscribe&amp;#8221; verb, it looks like we do already have all the services working just fine, so why would we need something to do it?&lt;/p&gt;
&lt;p&gt;The first answer is obviously &lt;strong&gt;standards&lt;/strong&gt;. By having a standard way to doing so, we could probably &lt;em&gt;decouple that action from specific services&lt;/em&gt;. If that happens, it means that we could start using generic clients to subscribe to all kinds of things online. Do you use a different browser for Facebook and Groupon? By pushing down the stack the subscription pattern, we can &lt;strong&gt;abstract it&lt;/strong&gt;! Hopefully we can even bake this in browsers in one way or another.&lt;/p&gt;
&lt;p&gt;Another reason is that I hope and believe that this will open the door for a &lt;strong&gt;new way of creating web applications&lt;/strong&gt;. Several programming languages also have a Publish Subscribe pattern. These languages and frameworks are usually very &lt;em&gt;efficient and elegant for decoupled systems&lt;/em&gt;. Many modern web technologies like Node.js, but also datastores like Redis&amp;#8217;s PubSub have made it much easier to write complex workflows.&lt;br /&gt;
Plugging complete web applications will certainly make creating complex systems much easier. Most web developers don&amp;#8217;t think much about electricity, cooling or even IO, with the advent of fully managed platforms. &lt;strong&gt;Layering common functionnalities and building on top is an amazing enabler&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For example, not only could we (humans and machines) &amp;#8220;subscribe&amp;#8221;, and combine that with other actions, like write. We could even imagine machines subscribing to other machines&amp;#8217;s action to let the user decide which workflow he wants. Does this remind you of &lt;a href=&quot;http://blog.superfeedr.com/webintents/&quot;&gt;WebIntents&lt;/a&gt;? it should, as web intents are a way to subscribe to a user&amp;#8217;s actions. I told you this publish/subscribe pattern is everywhere!&lt;/p&gt;
&lt;h3&gt;Getting involved!&lt;/h3&gt;
&lt;p&gt;Some of the smartest web engineers have fought for years to &lt;strong&gt;bring this subscribe approach to the web stack&lt;/strong&gt;, through start-ups, the use of other non-http protocols, by bending &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;, or by writing &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;-based protocols for specific sub-cases. None of these approaches became as ubiquitous as the pattern itself.&lt;/p&gt;
&lt;p&gt;But today, there is some kind of momentum as the web&amp;#8217;s data is becoming harder and harder to ingest for everybody (machines and humans). This is why I&amp;#8217;m trying to &lt;strong&gt;push the W3C to sit down and take some time to think about all this&lt;/strong&gt;. I have created a &lt;a href=&quot;http://www.w3.org/community/groups/#pubsub&quot;&gt;Community Group&lt;/a&gt; there and I hope that slowly, but surely people will express their needs, and why having this would make the web better. There are number of topics and use cases that need to be covered, I hope and believe we will cover them all.&lt;/p&gt;
&lt;p&gt;Please, join us.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Twitter SERP Drama</title>
        
        <link href="http://blog.superfeedr.com/twitter-serp-drama"/>
        <published>2012-01-10T00:00:00-08:00</published>
        <updated>2012-01-10T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/twitter-serp-drama</id>
        <content type="html">&lt;p&gt;Today Google introduced significant changes to their algorithm. Like every time this happens some people are scared their &lt;em&gt;free pension&lt;/em&gt; will end. This is clearly due to Google&amp;#8217;s &lt;del&gt;too&lt;/del&gt; incredibly high market share. This time, among the whiners, is Twitter, and this is interesting.&lt;/p&gt;
&lt;p&gt;Not so long ago, &lt;em&gt;Twitter sold its public and user-owned&lt;/em&gt; [their words, at the time] data to Microsoft and Google. What&amp;#8217;s interesting is that this is, to my knowledge &lt;strong&gt;the only time that Google paid anyone to index their content&lt;/strong&gt;. A couple years later, it looks like Google has sobered down and they eventually did not renew the Twitter contract when it ended. In other words, Google considered that Twitter&amp;#8217;s data wasn&amp;#8217;t worth more than anyone else&amp;#8217;s data on the web and that their regular crawling should be plenty. Now, Twitter seems to be a bit sour, because &lt;strong&gt;not only have they lost a significant revenue opportunity, but they also likely lost couple positions&lt;/strong&gt; in Google&amp;#8217;s search engine result pages.&lt;/p&gt;
&lt;p&gt;The $1Bn question becomes : &lt;em&gt;did Google favor their own results over Twitter&amp;#8217;s or did Twitter just go back to where they belong?&lt;/em&gt; Some people may give Google the benefit of the doubt after last week&amp;#8217;s &lt;a href=&quot;http://siliconfilter.com/this-post-is-sponsored-by-google-chrome/&quot;&gt;Chrome-gate&lt;/a&gt;, but that&amp;#8217;s not enough. The only way to know for real would be to make sure that Google+ and Twitter have the same visibility and that Google can access Twitter&amp;#8217;s data in the same way that they access their own data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is where open protocols win&lt;/strong&gt;. Google has been a strong advocate for an open web, with no barrier, no contract and an undiscriminated access. If Twitter supported open protocols, Google (and anyone else) would be able to get this public data in realtime, and they should then get their old &lt;span class=&quot;caps&quot;&gt;SERP&lt;/span&gt; ranking back. If they did not, well, then, we could certainly suspect that Google is pushing up its own results.&lt;/p&gt;
&lt;p&gt;Using proprietary protocols, forcing partnerships, discriminating between services mostly obfuscates the play field. At the time nobody was really shocked that twitter and Google entered in a specific agreement, but what we&amp;#8217;re seeing today is the immediate consequence. Maybe Google is favoring their own results, but even if they did, can Twitter really complain about it? They lost their credibility when they restricted the access to that data: &lt;em&gt;Nemo auditur propriam turpitudinem allegans&lt;/em&gt;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
</feed>
